Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -6,19 +6,19 @@ from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
|
|
| 6 |
from textblob import TextBlob
|
| 7 |
import nltk
|
| 8 |
from wordcloud import WordCloud
|
| 9 |
-
import base66
|
| 10 |
from io import BytesIO
|
| 11 |
import numpy as np
|
| 12 |
from sklearn.linear_model import LinearRegression
|
| 13 |
import plotly.graph_objects as go
|
| 14 |
-
from plotly.subplots import make_subplots
|
| 15 |
import yfinance as yf
|
| 16 |
|
| 17 |
# --------------------------
|
| 18 |
# CONFIG
|
| 19 |
# --------------------------
|
| 20 |
st.set_page_config(page_title="📰 SentimentSync NewsAI", layout="wide")
|
| 21 |
-
API_KEY = "88bc396d4eab4be494a4b86ec842db47"
|
| 22 |
|
| 23 |
# --------------------------
|
| 24 |
# UTILITIES
|
|
@@ -36,7 +36,7 @@ def generate_wordcloud(text):
|
|
| 36 |
wordcloud = WordCloud(width=800, height=400, background_color="white", stopwords=stopwords).generate(text)
|
| 37 |
buf = BytesIO()
|
| 38 |
wordcloud.to_image().save(buf, format="PNG")
|
| 39 |
-
return
|
| 40 |
|
| 41 |
|
| 42 |
# --------------------------
|
|
@@ -123,9 +123,6 @@ def fetch_financial_news(keyword):
|
|
| 123 |
# --------------------------
|
| 124 |
@st.cache_data(ttl=3600)
|
| 125 |
def fetch_stock_price(symbol, start_date, end_date):
|
| 126 |
-
"""
|
| 127 |
-
ดึงราคาหุ้นตามช่วงเวลาของข่าวที่พบ (บวก/ลบ 1-2 วัน เผื่อวันหยุด)
|
| 128 |
-
"""
|
| 129 |
try:
|
| 130 |
start_str = (start_date - timedelta(days=2)).strftime('%Y-%m-%d')
|
| 131 |
end_str = (end_date + timedelta(days=1)).strftime('%Y-%m-%d')
|
|
@@ -138,7 +135,6 @@ def fetch_stock_price(symbol, start_date, end_date):
|
|
| 138 |
|
| 139 |
df = df.reset_index()[["Date", "Close"]]
|
| 140 |
df.rename(columns={"Date": "date", "Close": "price"}, inplace=True)
|
| 141 |
-
# Normalize วันที่ให้เป็น .dt.date
|
| 142 |
df["date"] = pd.to_datetime(df["date"].dt.date)
|
| 143 |
return df
|
| 144 |
except Exception as e:
|
|
@@ -226,7 +222,6 @@ def main():
|
|
| 226 |
# ป้องกัน Error ถ้ามีข้อมูลน้อยกว่า 2 วัน
|
| 227 |
if len(df_sorted) < 2:
|
| 228 |
st.warning("มีข้อมูลข่าวไม่เพียงพอที่จะสร้างแนวโน้ม (น้อยกว่า 2 วัน)")
|
| 229 |
-
# แสดงตารางข่าวต่อไป แม้จะพล็อตไม่ได้
|
| 230 |
st.subheader("📰 รายการข่าว")
|
| 231 |
st.dataframe(news_df[["date", "source", "text", "sentiment", "url"]], use_column_width=True)
|
| 232 |
return
|
|
@@ -262,7 +257,7 @@ def main():
|
|
| 262 |
go.Scatter(
|
| 263 |
x=stock_df["date"], y=stock_df["price"],
|
| 264 |
name=f"{symbol} Stock Price",
|
| 265 |
-
mode="lines+markers",
|
| 266 |
line=dict(color="green", width=2)
|
| 267 |
),
|
| 268 |
row=1, col=1, secondary_y=False
|
|
|
|
| 6 |
from textblob import TextBlob
|
| 7 |
import nltk
|
| 8 |
from wordcloud import WordCloud
|
| 9 |
+
import base64 # <--- (แก้ไขจาก base66)
|
| 10 |
from io import BytesIO
|
| 11 |
import numpy as np
|
| 12 |
from sklearn.linear_model import LinearRegression
|
| 13 |
import plotly.graph_objects as go
|
| 14 |
+
from plotly.subplots import make_subplots
|
| 15 |
import yfinance as yf
|
| 16 |
|
| 17 |
# --------------------------
|
| 18 |
# CONFIG
|
| 19 |
# --------------------------
|
| 20 |
st.set_page_config(page_title="📰 SentimentSync NewsAI", layout="wide")
|
| 21 |
+
API_KEY = "88bc396d4eab4be494a4b86ec842db47"
|
| 22 |
|
| 23 |
# --------------------------
|
| 24 |
# UTILITIES
|
|
|
|
| 36 |
wordcloud = WordCloud(width=800, height=400, background_color="white", stopwords=stopwords).generate(text)
|
| 37 |
buf = BytesIO()
|
| 38 |
wordcloud.to_image().save(buf, format="PNG")
|
| 39 |
+
return base64.b64encode(buf.getvalue()).decode() # <--- (แก้ไขจาก base66)
|
| 40 |
|
| 41 |
|
| 42 |
# --------------------------
|
|
|
|
| 123 |
# --------------------------
|
| 124 |
@st.cache_data(ttl=3600)
|
| 125 |
def fetch_stock_price(symbol, start_date, end_date):
|
|
|
|
|
|
|
|
|
|
| 126 |
try:
|
| 127 |
start_str = (start_date - timedelta(days=2)).strftime('%Y-%m-%d')
|
| 128 |
end_str = (end_date + timedelta(days=1)).strftime('%Y-%m-%d')
|
|
|
|
| 135 |
|
| 136 |
df = df.reset_index()[["Date", "Close"]]
|
| 137 |
df.rename(columns={"Date": "date", "Close": "price"}, inplace=True)
|
|
|
|
| 138 |
df["date"] = pd.to_datetime(df["date"].dt.date)
|
| 139 |
return df
|
| 140 |
except Exception as e:
|
|
|
|
| 222 |
# ป้องกัน Error ถ้ามีข้อมูลน้อยกว่า 2 วัน
|
| 223 |
if len(df_sorted) < 2:
|
| 224 |
st.warning("มีข้อมูลข่าวไม่เพียงพอที่จะสร้างแนวโน้ม (น้อยกว่า 2 วัน)")
|
|
|
|
| 225 |
st.subheader("📰 รายการข่าว")
|
| 226 |
st.dataframe(news_df[["date", "source", "text", "sentiment", "url"]], use_column_width=True)
|
| 227 |
return
|
|
|
|
| 257 |
go.Scatter(
|
| 258 |
x=stock_df["date"], y=stock_df["price"],
|
| 259 |
name=f"{symbol} Stock Price",
|
| 260 |
+
mode="lines+markers",
|
| 261 |
line=dict(color="green", width=2)
|
| 262 |
),
|
| 263 |
row=1, col=1, secondary_y=False
|