KYTHY commited on
Commit
cecaf26
·
verified ·
1 Parent(s): d32ed55

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +41 -18
app.py CHANGED
@@ -12,6 +12,7 @@ from io import BytesIO
12
  import numpy as np
13
  from sklearn.linear_model import LinearRegression
14
  import plotly.graph_objects as go
 
15
 
16
  # --------------------------
17
  # CONFIG
@@ -99,16 +100,33 @@ def generate_wordcloud(text):
99
  return base64.b64encode(buf.getvalue()).decode()
100
 
101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  # --------------------------
103
  # MAIN APP
104
  # --------------------------
105
  def main():
106
  st.title("📰 SentimentSync NewsAI")
107
- st.markdown("วิเคราะห์แนวโน้มอารมณ์ของข่าวการเงินย้อนหลัง 7 วัน พร้อมพยากรณ์แนวโน้มในอนาคต")
108
 
109
  # Sidebar
110
  with st.sidebar:
111
- keyword = st.text_input("ค้นหาคำ (เช่น Tesla, Bitcoin, Inflation):", "")
112
  analyze_btn = st.button("วิเคราะห์เลย")
113
 
114
  if not analyze_btn:
@@ -145,13 +163,13 @@ def main():
145
  img = generate_wordcloud(all_text)
146
  st.image(f"data:image/png;base64,{img}", use_column_width=True)
147
 
148
- # แนวโน้มและพยากรณ์ในกราฟเดียว
149
- st.subheader("📈 แนวโน้มและพยากรณ์อารมณ์ของข่าว")
150
 
151
  df_sorted = news_df.sort_values("date").copy()
152
  df_sorted["timestamp"] = (df_sorted["date"] - df_sorted["date"].min()).dt.days
153
 
154
- # Train model
155
  model = LinearRegression()
156
  model.fit(df_sorted[["timestamp"]], df_sorted["sentiment"])
157
 
@@ -161,39 +179,44 @@ def main():
161
  future_dates = [df_sorted["date"].max() + timedelta(days=i) for i in range(1, future_days + 1)]
162
  future_preds = model.predict(future_timestamps.reshape(-1, 1))
163
 
164
- # Plot both actual + prediction
 
 
 
165
  fig = go.Figure()
166
 
 
167
  fig.add_trace(go.Scatter(
168
  x=df_sorted["date"], y=df_sorted["sentiment"],
169
  mode="lines+markers", name="Actual Sentiment",
170
  line=dict(color="blue")
171
  ))
172
-
173
  fig.add_trace(go.Scatter(
174
  x=future_dates, y=future_preds,
175
  mode="lines+markers", name="Predicted Sentiment (7-day Forecast)",
176
  line=dict(color="orange", dash="dash")
177
  ))
178
-
179
- fig.add_trace(go.Scatter(
180
- x=future_dates + future_dates[::-1],
181
- y=list(future_preds + 0.1) + list((future_preds - 0.1)[::-1]),
182
- fill='toself', fillcolor='rgba(255,165,0,0.2)',
183
- line=dict(color='rgba(255,255,255,0)'),
184
- hoverinfo="skip",
185
- showlegend=False
186
- ))
187
 
188
  fig.update_layout(
189
- title=f"แนวโน้มและพยากรณ์อารมณ์ของข่าว '{keyword}'",
190
  xaxis_title="วันที่",
191
- yaxis_title="ค่าอารมณ์ (Sentiment)",
 
192
  hovermode="x unified",
193
  template="plotly_white"
194
  )
 
195
  st.plotly_chart(fig, use_container_width=True)
196
 
 
197
  st.subheader("📰 รายการข่าว")
198
  st.dataframe(news_df[["date", "source", "text", "sentiment", "url"]], use_container_width=True)
199
 
 
12
  import numpy as np
13
  from sklearn.linear_model import LinearRegression
14
  import plotly.graph_objects as go
15
+ import yfinance as yf # เพิ่มส่วนดึงราคาหุ้น
16
 
17
  # --------------------------
18
  # CONFIG
 
100
  return base64.b64encode(buf.getvalue()).decode()
101
 
102
 
103
+ # --------------------------
104
+ # ฟังก์ชันใหม่: ดึงราคาหุ้น
105
+ # --------------------------
106
+ @st.cache_data(ttl=3600)
107
+ def fetch_stock_price(symbol):
108
+ """ดึงราคาปิดหุ้นย้อนหลัง 14 วัน"""
109
+ try:
110
+ df = yf.download(symbol, period="14d", interval="1d")
111
+ df = df.reset_index()[["Date", "Close"]]
112
+ df.rename(columns={"Date": "date", "Close": "price"}, inplace=True)
113
+ df["date"] = pd.to_datetime(df["date"])
114
+ return df
115
+ except Exception as e:
116
+ st.warning(f"ไม่สามารถดึงราคาหุ้นได้: {e}")
117
+ return pd.DataFrame()
118
+
119
+
120
  # --------------------------
121
  # MAIN APP
122
  # --------------------------
123
  def main():
124
  st.title("📰 SentimentSync NewsAI")
125
+ st.markdown("วิเคราะห์แนวโน้มอารมณ์ของข่าวการเงินย้อนหลัง 7 วัน พร้อมพยากรณ์แนวโน้มในอนาคต และรวมราคาหุ้น")
126
 
127
  # Sidebar
128
  with st.sidebar:
129
+ keyword = st.text_input("ค้นหาคำ / ตัวย่อหุ้น (เช่น Tesla หรือ TSLA):", "")
130
  analyze_btn = st.button("วิเคราะห์เลย")
131
 
132
  if not analyze_btn:
 
163
  img = generate_wordcloud(all_text)
164
  st.image(f"data:image/png;base64,{img}", use_column_width=True)
165
 
166
+ # แนวโน้มและพยากรณ์ + ราคาหุ้น
167
+ st.subheader("📈 แนวโน้มและพยากรณ์อารมณ์ของข่าว & ราคาหุ้น")
168
 
169
  df_sorted = news_df.sort_values("date").copy()
170
  df_sorted["timestamp"] = (df_sorted["date"] - df_sorted["date"].min()).dt.days
171
 
172
+ # Train sentiment model
173
  model = LinearRegression()
174
  model.fit(df_sorted[["timestamp"]], df_sorted["sentiment"])
175
 
 
179
  future_dates = [df_sorted["date"].max() + timedelta(days=i) for i in range(1, future_days + 1)]
180
  future_preds = model.predict(future_timestamps.reshape(-1, 1))
181
 
182
+ # ดึงราคาหุ้น
183
+ stock_df = fetch_stock_price(keyword)
184
+
185
+ # Plot
186
  fig = go.Figure()
187
 
188
+ # Actual sentiment
189
  fig.add_trace(go.Scatter(
190
  x=df_sorted["date"], y=df_sorted["sentiment"],
191
  mode="lines+markers", name="Actual Sentiment",
192
  line=dict(color="blue")
193
  ))
194
+ # Predicted sentiment
195
  fig.add_trace(go.Scatter(
196
  x=future_dates, y=future_preds,
197
  mode="lines+markers", name="Predicted Sentiment (7-day Forecast)",
198
  line=dict(color="orange", dash="dash")
199
  ))
200
+ # Stock price
201
+ if not stock_df.empty:
202
+ fig.add_trace(go.Scatter(
203
+ x=stock_df["date"], y=stock_df["price"],
204
+ mode="lines+markers", name=f"{keyword} Stock Price",
205
+ line=dict(color="green"), yaxis="y2"
206
+ ))
 
 
207
 
208
  fig.update_layout(
209
+ title=f"แนวโน้มและพยากรณ์อารมณ์ข่าว & ราคาหุ้น '{keyword}'",
210
  xaxis_title="วันที่",
211
+ yaxis=dict(title="Sentiment", side="left", range=[-1, 1]),
212
+ yaxis2=dict(title="Stock Price", overlaying="y", side="right", showgrid=False),
213
  hovermode="x unified",
214
  template="plotly_white"
215
  )
216
+
217
  st.plotly_chart(fig, use_container_width=True)
218
 
219
+ # แสดงข่าว
220
  st.subheader("📰 รายการข่าว")
221
  st.dataframe(news_df[["date", "source", "text", "sentiment", "url"]], use_container_width=True)
222