randmimc commited on
Commit
2ac3e95
Β·
verified Β·
1 Parent(s): d75aaac

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +93 -105
src/streamlit_app.py CHANGED
@@ -7,118 +7,106 @@ import streamlit as st
7
  import numpy as np
8
  import pandas as pd
9
  from gtts import gTTS
10
- # assitant 아바타 이미지 경둜
11
- assistant_icon_path = "https://huggingface.co/spaces/randmimc/aitom/resolve/main/chat_icon/assistant.ico"
12
 
13
- # μ„Έμ…˜ μƒνƒœμ—μ„œ approval_state 및 messages μ΄ˆκΈ°ν™”
14
- if "approval_state" not in st.session_state:
15
- st.session_state.approval_state = "require"
16
- if "messages" not in st.session_state:
17
- st.session_state.messages = []
18
 
19
- # λ“œλ‘­λ‹€μš΄ 메뉴
20
- st.subheader("데이터 선택")
21
 
22
- options = [
23
- "",
24
- "2024-08-24",
25
- "2024-09-26"
26
- ]
27
- selected_text = st.selectbox("데이터λ₯Ό μ„ νƒν•˜μ„Έμš”", options)
 
 
 
 
 
28
 
29
- # μ»€μŠ€ν…€ CSS μ‚½μž…
30
- st.markdown("""
31
- <style>
32
- div.stButton > button {
33
- background-color: transparent;
34
- border: none;
35
- color: black;
36
- font-size: 30px;
37
- padding: 0;
38
- }
39
- div.stButton > button:hover {
40
- color: red;
41
- cursor: pointer;
42
- }
43
- </style>
44
- """, unsafe_allow_html=True)
45
- df = pd.read_csv("https://huggingface.co/spaces/randmimc/mobility_condition/raw/main/chat_icon/text.csv", on_bad_lines='skip')
46
 
47
- # 데이터 μƒνƒœ 및 쑰치 상황 ν‘œμ‹œ ν•¨μˆ˜
48
- def display_status_and_action(text):
 
 
49
 
50
- if text == "":
51
- st.info("λ¨Όμ € 데이터λ₯Ό μ„ νƒν•΄μ£Όμ„Έμš”.")
52
- elif text == "2024-09-26":
53
- st.line_chart(
54
- df,
55
- y=['ECU_DPFSoot']
56
- )
57
- st.success("βœ… μ°¨λŸ‰ μƒνƒœ: 정상")
58
- st.markdown("**쑰치 사항:** μΆ”κ°€ μ‘°μΉ˜λŠ” ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
59
- else:
60
- st.line_chart(
61
- df,
62
- y=['ECU_DPFSoot']
63
- )
64
- text_input = "μœ„μ˜ 증상듀이 보일 경우, λ‹€μŒκ³Ό 같은 쑰치λ₯Ό μ·¨ν•˜λŠ” 것이 ν•„μš”ν•©λ‹ˆλ‹€:\n\n1. **μžλ™μž¬μƒ μ‹œλ„**: μš°μ„ μ μœΌλ‘œ 일반적인 μžλ™ μž¬μƒμ„ μ§„ν–‰ν•˜μ—¬ DPF μ‹œμŠ€ν…œμ΄ μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. μ°¨λŸ‰ μ†λ„λŠ” μ•½ 60km/h둜 μœ μ§€ν•˜κ³ , 20λΆ„ 이상 μ£Όν–‰ν•˜μ—¬ DPF μ‹œμŠ€ν…œμ΄ 슀슀둜 sootλ₯Ό μ œκ±°ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.\n\n2. **DPF μˆ˜λ™ 제거 λ²„νŠΌ ν™œμš©**: λ§Œμ•½ μžλ™μž¬μƒμ΄ μ–΄λ €μš΄ μƒνƒœλΌλ©΄, DPF μˆ˜λ™ 제거 λ²„νŠΌμ„ 톡해 μš΄μ „μžκ°€ κ°•μ œλ‘œ sootλ₯Ό μ œκ±°ν•˜λŠ” 방법을 μ‹œλ„ν•΄ λ΄…λ‹ˆλ‹€.\n\n3. **μ •λΉ„μ†Œ λ°©λ¬Έ**: μžλ™ μž¬μƒμ΄λ‚˜ μˆ˜λ™ 제거 λ²„νŠΌμ„ ν†΅ν•΄μ„œλ„ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ§€ μ•Šμ„ 경우, κ°€κΉŒμš΄ μ •λΉ„μ†Œλ₯Ό λ°©λ¬Έν•˜μ—¬ DPF μ‹œμŠ€ν…œμ„ 점검 λ°›λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. μ΄λŠ” μ„Όμ„œ λΆˆλŸ‰μ΄λ‚˜ DPF ν•„ν„° 문제 λ“± λ‹€λ₯Έ 원인을 νŒŒμ•…ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.\n\n4. **배기계톡 점검**: ν•΄λ‹Ή ν˜„μƒμ΄ 지속 발견될 경우 λ§Œμ•½μ„ λŒ€λΉ„ν•˜μ—¬ μ°¨λŸ‰ 자체의 배기계톡 점검을 ν•˜λŠ” 것이 μΆ”μ²œλ©λ‹ˆλ‹€.\n\n**정상적인 경우**: λ§Œμ•½ soot μˆ˜μΉ˜κ°€ μ μ ˆν•œ 타이밍에 μ—°μ†Œλ˜μ–΄ μ—†μ–΄μ§€κ³  μ „μ²΄μ μœΌλ‘œ 봀을 λ•Œ μΆ•μ λŸ‰μ΄ 40을 μ΄ˆκ³Όν•˜λŠ” ꡬ간이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, μ΄λŠ” 정상적이며 문제 μ—†μŠ΅λ‹ˆλ‹€"
65
- warning = "⚠️ 일정 수치 μ΄μƒμ˜ Soot μΆ•μ λŸ‰μ΄ 2μ‹œκ°„ 이상 μ§€μ†λ˜λŠ” ν˜„μƒμ„ λ³΄μž„. \nSoot κ°€ μΌμ •μˆ˜μΉ˜μ— λ„λ‹¬ν–ˆμ„λ•Œ μ •μƒμ μœΌλ‘œ μ—°μ†Œλ˜μ§€ μ•Šκ±°λ‚˜, μ„Όμ„œ λΆˆλŸ‰μœΌλ‘œ 인해 Dosing 이 κ³Όν•˜κ²Œ ν™œμ„±ν™”λ¨. \nsoot κ°€ μ¦κ°€ν•˜λŠ” κ³Όμ •μ—μ„œ λΆˆκ·œμΉ™μ μΈ 증감 ν˜„μƒμ΄ λ°œμƒν•¨. \n튐 λ˜λŠ” λΉ„μ„ ν˜• ν˜•νƒœκ°€ 크게 λ‚˜νƒ€λ‚¨. \nSoot 의 μΆ•μ λŸ‰μ΄ 40을 μ΄ˆκ³Όν•˜λŠ” ꡬ간이 μ‘΄μž¬ν•¨."
66
- st.warning(warning)
67
- st.markdown(text_input)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
 
69
- text_input = warning + " " + text_input
70
- cleaned_text = re.sub(r'[\x00-\x1F]+', '', text_input).replace("*", "")
71
- tts = gTTS(text=cleaned_text, lang='ko')
72
- mp3_fp = BytesIO()
73
- tts.write_to_fp(mp3_fp)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
 
75
- # μ˜€λ””μ˜€ 슀트림 μž¬μ„€μ • ν›„ μž¬μƒ
76
- mp3_fp.seek(0)
77
-
78
- # Base64 인코딩
79
- audio_bytes = mp3_fp.read()
80
- audio_base64 = base64.b64encode(audio_bytes).decode()
81
-
82
- # HTML μŠ€νƒ€μΌ 및 μ˜€λ””μ˜€ 좜λ ₯
83
- audio_html = f"""
84
- <style>
85
- .audio-container {{
86
- display: flex;
87
- align-items: center;
88
- gap: 10px;
89
- justify-content: flex-end; /* 였λ₯Έμͺ½ μ •λ ¬ */
90
- margin-top: 10px;
91
- }}
92
- .audio-icon {{
93
- font-size: 30px;
94
- cursor: pointer;
95
- }}
96
- .audio-icon[title]:hover::after {{
97
- content: attr(title);
98
- position: absolute;
99
- background: #333;
100
- color: #fff;
101
- padding: 5px 8px;
102
- border-radius: 5px;
103
- white-space: nowrap;
104
- font-size: 12px;
105
- top: -35px;
106
- right: 0;
107
- z-index: 999;
108
- }}
109
- </style>
110
-
111
- <div class="audio-container">
112
- <div class="audio-icon" title="μœ„ λ‚΄μš©μ„ μŒμ„±μœΌλ‘œ λ“£κΈ°">πŸ”Š</div>
113
- <audio controls>
114
- <source src="data:audio/mp3;base64,{audio_base64}" type="audio/mp3">
115
- λΈŒλΌμš°μ €κ°€ μ˜€λ””μ˜€ νƒœκ·Έλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
116
- </audio>
117
- </div>
118
- """
119
-
120
- # HTML λ Œλ”λ§
121
- st.markdown(audio_html, unsafe_allow_html=True)
122
 
123
  if selected_text:
124
- display_status_and_action(selected_text)
 
 
 
 
 
 
 
 
7
  import numpy as np
8
  import pandas as pd
9
  from gtts import gTTS
 
 
10
 
11
+ # μ˜ˆμ‹œ 데이터
12
+ options = ["", "2024-08-24", "2024-09-26"]
13
+ df = pd.read_csv("https://huggingface.co/spaces/randmimc/mobility_condition/raw/main/chat_icon/text.csv", on_bad_lines='skip')
14
+ text_input = "μœ„μ˜ 증상듀이 보일 경우, λ‹€μŒκ³Ό 같은 쑰치λ₯Ό μ·¨ν•˜λŠ” 것이 ν•„μš”ν•©λ‹ˆλ‹€:\n\n1. **μžλ™μž¬μƒ μ‹œλ„**: μš°μ„ μ μœΌλ‘œ 일반적인 μžλ™ μž¬μƒμ„ μ§„ν–‰ν•˜μ—¬ DPF μ‹œμŠ€ν…œμ΄ μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. μ°¨λŸ‰ μ†λ„λŠ” μ•½ 60km/h둜 μœ μ§€ν•˜κ³ , 20λΆ„ 이상 μ£Όν–‰ν•˜μ—¬ DPF μ‹œμŠ€ν…œμ΄ 슀슀둜 sootλ₯Ό μ œκ±°ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.\n\n2. **DPF μˆ˜λ™ 제거 λ²„νŠΌ ν™œμš©**: λ§Œμ•½ μžλ™μž¬μƒμ΄ μ–΄λ €μš΄ μƒνƒœλΌλ©΄, DPF μˆ˜λ™ 제거 λ²„νŠΌμ„ 톡해 μš΄μ „μžκ°€ κ°•μ œλ‘œ sootλ₯Ό μ œκ±°ν•˜λŠ” 방법을 μ‹œλ„ν•΄ λ΄…λ‹ˆλ‹€.\n\n3. **μ •λΉ„μ†Œ λ°©λ¬Έ**: μžλ™ μž¬μƒμ΄λ‚˜ μˆ˜λ™ 제거 λ²„νŠΌμ„ ν†΅ν•΄μ„œλ„ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ§€ μ•Šμ„ 경우, κ°€κΉŒμš΄ μ •λΉ„μ†Œλ₯Ό λ°©λ¬Έν•˜μ—¬ DPF μ‹œμŠ€ν…œμ„ 점검 λ°›λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. μ΄λŠ” μ„Όμ„œ λΆˆλŸ‰μ΄λ‚˜ DPF ν•„ν„° 문제 λ“± λ‹€λ₯Έ 원인을 νŒŒμ•…ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.\n\n4. **배기계톡 점검**: ν•΄λ‹Ή ν˜„μƒμ΄ 지속 발견될 경우 λ§Œμ•½μ„ λŒ€λΉ„ν•˜μ—¬ μ°¨λŸ‰ 자체의 배기계톡 점검을 ν•˜λŠ” 것이 μΆ”μ²œλ©λ‹ˆλ‹€.\n\n**정상적인 경우**: λ§Œμ•½ soot μˆ˜μΉ˜κ°€ μ μ ˆν•œ 타이밍에 μ—°μ†Œλ˜μ–΄ μ—†μ–΄μ§€κ³  μ „μ²΄μ μœΌλ‘œ 봀을 λ•Œ μΆ•μ λŸ‰μ΄ 40을 μ΄ˆκ³Όν•˜λŠ” ꡬ간이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, μ΄λŠ” 정상적이며 문제 μ—†μŠ΅λ‹ˆλ‹€"
15
+ warning = "⚠️ 일정 수치 μ΄μƒμ˜ Soot μΆ•μ λŸ‰μ΄ 2μ‹œκ°„ 이상 μ§€μ†λ˜λŠ” ν˜„μƒμ„ λ³΄μž„. \nSoot κ°€ μΌμ •μˆ˜μΉ˜μ— λ„λ‹¬ν–ˆμ„λ•Œ μ •μƒμ μœΌλ‘œ μ—°μ†Œλ˜μ§€ μ•Šκ±°λ‚˜, μ„Όμ„œ λΆˆλŸ‰μœΌλ‘œ 인해 Dosing 이 κ³Όν•˜κ²Œ ν™œμ„±ν™”λ¨. \nsoot κ°€ μ¦κ°€ν•˜λŠ” κ³Όμ •μ—μ„œ λΆˆκ·œμΉ™μ μΈ 증감 ν˜„μƒμ΄ λ°œμƒν•¨. \n튐 λ˜λŠ” λΉ„μ„ ν˜• ν˜•νƒœκ°€ 크게 λ‚˜νƒ€λ‚¨. \nSoot 의 μΆ•μ λŸ‰μ΄ 40을 μ΄ˆκ³Όν•˜λŠ” ꡬ간이 μ‘΄μž¬ν•¨."
16
 
17
+ def chart_generate(df, col_name):
18
+ return st.line_chart(df, y=[col_name])
19
 
20
+ def tts_engine(text):
21
+ cleaned_text = re.sub(r'[\x00-\x1F]+', '', text).replace("*", "")
22
+ tts = gTTS(text=cleaned_text, lang='ko')
23
+ mp3_fp = BytesIO()
24
+ tts.write_to_fp(mp3_fp)
25
+ # μ˜€λ””μ˜€ 슀트림 μž¬μ„€μ • ν›„ μž¬μƒ
26
+ mp3_fp.seek(0)
27
+ # Base64 인코딩
28
+ audio_bytes = mp3_fp.read()
29
+ audio_base64 = base64.b64encode(audio_bytes).decode()
30
+ return audio_base64
31
 
32
+ def none_temp():
33
+ st.info("λ¨Όμ € 데이터λ₯Ό 선택해 μ£Όμ„Έμš”")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
 
35
+ def normal(df, col_name):
36
+ chart_generate(df, col_name)
37
+ st.success("βœ… μ°¨λŸ‰ μƒνƒœ: 정상")
38
+ st.markdown("**쑰치 사항:** μΆ”κ°€ μ‘°μΉ˜λŠ” ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
39
 
40
+ def anormal(df, col_name, warning, text_input, audio_base64):
41
+ # custom style
42
+ audio_html = f"""
43
+ <style>
44
+ .audio-container {{
45
+ display: flex;
46
+ align-items: center;
47
+ gap: 10px;
48
+ justify-content: flex-end; /* 였λ₯Έμͺ½ μ •λ ¬ */
49
+ margin-top: 10px;
50
+ }}
51
+ .audio-icon {{
52
+ font-size: 30px;
53
+ cursor: pointer;
54
+ }}
55
+ .audio-icon[title]:hover::after {{
56
+ content: attr(title);
57
+ position: absolute;
58
+ background: #333;
59
+ color: #fff;
60
+ padding: 5px 8px;
61
+ border-radius: 5px;
62
+ white-space: nowrap;
63
+ font-size: 12px;
64
+ top: -35px;
65
+ right: 0;
66
+ z-index: 999;
67
+ }}
68
+ </style>
69
+
70
+ <div class="audio-container">
71
+ <div class="audio-icon" title="μœ„ λ‚΄μš©μ„ μŒμ„±μœΌλ‘œ λ“£κΈ°">πŸ”Š</div>
72
+ <audio controls>
73
+ <source src="data:audio/mp3;base64,{audio_base64}" type="audio/mp3">
74
+ λΈŒλΌμš°μ €κ°€ μ˜€λ””μ˜€ νƒœκ·Έλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
75
+ </audio>
76
+ </div>
77
+ """
78
+ chart_generate(df, col_name)
79
+ st.warning(warning)
80
+ st.markdown(text_input)
81
+ st.markdown(audio_html, unsafe_allow_html=True)
82
 
83
+ # μ„œλΉ„μŠ€ μ‹€ν–‰
84
+ st.subheader("데이터 선택")
85
+ selected_text = st.selectbox("데이터λ₯Ό μ„ νƒν•˜μ„Έμš”", options)
86
+
87
+ # st.markdown("""
88
+ # <style>
89
+ # div.stButton > button {
90
+ # background-color: transparent;
91
+ # border: none;
92
+ # color: black;
93
+ # font-size: 30px;
94
+ # padding: 0;
95
+ # }
96
+ # div.stButton > button:hover {
97
+ # color: red;
98
+ # cursor: pointer;
99
+ # }
100
+ # </style>
101
+ # """, unsafe_allow_html=True)
102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
 
104
  if selected_text:
105
+ if selected_text == "":
106
+ none_temp()
107
+ elif text == "2024-09-26":
108
+ normal(df, "ECU_DPFSoot")
109
+ else:
110
+ audio_base64 = tts_engine(warning+" "+0text_input)
111
+ anormal(df, "ECU_DPFSoot", warning, text_input, audio_base64)
112
+