Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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
|
| 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 |
-
#
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
showlegend=False
|
| 186 |
-
))
|
| 187 |
|
| 188 |
fig.update_layout(
|
| 189 |
-
title=f"
|
| 190 |
xaxis_title="วันที่",
|
| 191 |
-
|
|
|
|
| 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 |
|