KYTHY commited on
Commit
10ff829
·
verified ·
1 Parent(s): a4796e3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -30
app.py CHANGED
@@ -133,16 +133,9 @@ def fetch_stock_price(symbol, start_date, end_date):
133
  st.warning("ไม่พบข้อมูลราคาหุ้นในช่วงเวลานี้")
134
  return pd.DataFrame()
135
 
136
- # 1. Reset index เพื่อให้ 'Date' กลายเป็นคอลัมน์
137
  df = df.reset_index()
138
-
139
- # 2. เลือกเฉพาะคอลัมน์ที่เราต้องการ
140
  df_subset = df[['Date', 'Close']]
141
-
142
- # 3. เปลี่ยนชื่อคอลัมน์เพื่อ "flatten" MultiIndex ใดๆ
143
  df_subset.columns = ['date', 'price']
144
-
145
- # 4. แปลง 'date' ให้เป็น .dt.date
146
  df_subset["date"] = pd.to_datetime(df_subset["date"].dt.date)
147
 
148
  return df_subset
@@ -251,35 +244,59 @@ def main():
251
  how="left"
252
  )
253
 
254
- # 4. เทรนโมเดล Prediction (ใช้ข้อมูลที่ Merge แล้ว)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
255
  plot_data["timestamp"] = (plot_data["date_day"] - plot_data["date_day"].min()).dt.days
256
- model = LinearRegression()
257
- model.fit(plot_data[["timestamp"]], plot_data["avg_sentiment"])
258
-
259
- future_days = 7
260
- future_timestamps = np.arange(plot_data["timestamp"].max() + 1, plot_data["timestamp"].max() + future_days + 1)
261
- future_dates = [plot_data["date_day"].max() + timedelta(days=i) for i in range(1, future_days + 1)]
262
- future_preds = model.predict(future_timestamps.reshape(-1, 1))
263
-
 
 
 
 
 
 
 
 
 
 
 
 
264
 
265
- # 5. สร้างกราฟ (Plot) ด้วย Subplots (ใช้ 'plot_data' เป็นหลัก)
266
  fig = make_subplots(rows=2, cols=1, specs=[[{"secondary_y": True}], [{}]],
267
  row_heights=[0.7, 0.3], vertical_spacing=0.1,
268
  shared_xaxes=True)
269
 
270
  # --- กราฟส่วนบน (ราคา, Sentiment, Prediction) ---
271
-
272
  fig.add_trace(
273
  go.Scatter(
274
  x=plot_data["date_day"], y=plot_data["price"],
275
  name=f"{symbol} Stock Price",
276
  mode="lines+markers",
277
- connectgaps=True, # <--- (*** นี่คือบรรทัดที่เพิ่มเข้ามา ***)
278
  line=dict(color="green", width=2)
279
  ),
280
  row=1, col=1, secondary_y=False
281
  )
282
-
283
  fig.add_trace(
284
  go.Scatter(
285
  x=plot_data["date_day"], y=plot_data["avg_sentiment"],
@@ -290,21 +307,23 @@ def main():
290
  row=1, col=1, secondary_y=True
291
  )
292
 
293
- fig.add_trace(go.Scatter(
294
- x=future_dates, y=future_preds,
295
- mode="lines+markers", name="Predicted Sentiment (7-day Forecast)",
296
- line=dict(color="orange", dash="dash")
297
- ),
298
- row=1, col=1,
299
- secondary_y=True
300
- )
 
 
301
 
302
- # --- กราฟส่วนล่าง (จำนวนข่าว) ---
303
  fig.add_trace(go.Bar(x=plot_data["date_day"], y=plot_data["neutral"], name="Neutral", marker_color='rgba(128, 128, 128, 0.7)'), row=2, col=1)
304
  fig.add_trace(go.Bar(x=plot_data["date_day"], y=plot_data["negative"], name="Negative", marker_color='rgba(255, 0, 0, 0.7)'), row=2, col=1)
305
  fig.add_trace(go.Bar(x=plot_data["date_day"], y=plot_data["positive"], name="Positive", marker_color='rgba(0, 128, 0, 0.7)'), row=2, col=1)
306
 
307
- # 6. ตกแต่ง Layout
308
  fig.update_layout(
309
  title=f"แนวโน้มอารมณ์ข่าว & ราคาหุ้น '{keyword}'",
310
  template="plotly_white",
 
133
  st.warning("ไม่พบข้อมูลราคาหุ้นในช่วงเวลานี้")
134
  return pd.DataFrame()
135
 
 
136
  df = df.reset_index()
 
 
137
  df_subset = df[['Date', 'Close']]
 
 
138
  df_subset.columns = ['date', 'price']
 
 
139
  df_subset["date"] = pd.to_datetime(df_subset["date"].dt.date)
140
 
141
  return df_subset
 
244
  how="left"
245
  )
246
 
247
+ # 4. (*** ใหม่ ***) คำนวณและตีความ Correlation
248
+ correlation = plot_data['price'].corr(plot_data['avg_sentiment'])
249
+
250
+ corr_text = "ไม่สัมพันธ์กัน"
251
+ corr_delta = f"r = {correlation:.2f}"
252
+
253
+ if pd.isna(correlation):
254
+ corr_text = "ไม่สามารถคำนวณได้"
255
+ corr_delta = "N/A"
256
+ elif correlation > 0.3:
257
+ corr_text = "สัมพันธ์ทางเดียวกัน"
258
+ elif correlation < -0.3:
259
+ corr_text = "สัมพันธ์ตรงข้าม"
260
+
261
+ # 5. เทรนโมเดล Prediction (ใช้ข้อมูลที่ Merge แล้ว)
262
  plot_data["timestamp"] = (plot_data["date_day"] - plot_data["date_day"].min()).dt.days
263
+
264
+ # แก้ปัญหา .fit() ถ้ามี NaN ใน sentiment
265
+ train_data = plot_data.dropna(subset=['avg_sentiment', 'timestamp'])
266
+ if len(train_data) < 2:
267
+ st.warning("มีข้อมูลไม่พอสำหรับเทรนโมเดล")
268
+ else:
269
+ model = LinearRegression()
270
+ model.fit(train_data[["timestamp"]], train_data["avg_sentiment"])
271
+
272
+ future_days = 7
273
+ future_timestamps = np.arange(plot_data["timestamp"].max() + 1, plot_data["timestamp"].max() + future_days + 1)
274
+ future_dates = [plot_data["date_day"].max() + timedelta(days=i) for i in range(1, future_days + 1)]
275
+ future_preds = model.predict(future_timestamps.reshape(-1, 1))
276
+
277
+ # 6. (*** ใหม่ ***) แสดงผล Correlation Metric
278
+ st.metric(
279
+ label="ความสัมพันธ์ (Sentiment vs Price)",
280
+ value=corr_text,
281
+ delta=corr_delta
282
+ )
283
 
284
+ # 7. สร้างกราฟ (Plot) ด้วย Subplots (ใช้ 'plot_data' เป็นหลัก)
285
  fig = make_subplots(rows=2, cols=1, specs=[[{"secondary_y": True}], [{}]],
286
  row_heights=[0.7, 0.3], vertical_spacing=0.1,
287
  shared_xaxes=True)
288
 
289
  # --- กราฟส่วนบน (ราคา, Sentiment, Prediction) ---
 
290
  fig.add_trace(
291
  go.Scatter(
292
  x=plot_data["date_day"], y=plot_data["price"],
293
  name=f"{symbol} Stock Price",
294
  mode="lines+markers",
295
+ connectgaps=True,
296
  line=dict(color="green", width=2)
297
  ),
298
  row=1, col=1, secondary_y=False
299
  )
 
300
  fig.add_trace(
301
  go.Scatter(
302
  x=plot_data["date_day"], y=plot_data["avg_sentiment"],
 
307
  row=1, col=1, secondary_y=True
308
  )
309
 
310
+ # เพิ่มการตรวจสอบว่า future_preds ถูกสร้างหรือยัง
311
+ if 'future_preds' in locals():
312
+ fig.add_trace(go.Scatter(
313
+ x=future_dates, y=future_preds,
314
+ mode="lines+markers", name="Predicted Sentiment (7-day Forecast)",
315
+ line=dict(color="orange", dash="dash")
316
+ ),
317
+ row=1, col=1,
318
+ secondary_y=True
319
+ )
320
 
321
+ # --- กราFส่วนล่าง (จำนวนข่าว) ---
322
  fig.add_trace(go.Bar(x=plot_data["date_day"], y=plot_data["neutral"], name="Neutral", marker_color='rgba(128, 128, 128, 0.7)'), row=2, col=1)
323
  fig.add_trace(go.Bar(x=plot_data["date_day"], y=plot_data["negative"], name="Negative", marker_color='rgba(255, 0, 0, 0.7)'), row=2, col=1)
324
  fig.add_trace(go.Bar(x=plot_data["date_day"], y=plot_data["positive"], name="Positive", marker_color='rgba(0, 128, 0, 0.7)'), row=2, col=1)
325
 
326
+ # 8. ตกแต่ง Layout
327
  fig.update_layout(
328
  title=f"แนวโน้มอารมณ์ข่าว & ราคาหุ้น '{keyword}'",
329
  template="plotly_white",