KYTHY commited on
Commit
86a59b0
·
verified ·
1 Parent(s): bb14cc8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -20
app.py CHANGED
@@ -12,7 +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
- import yfinance as yf # เพิ่มส่วนดึงราคาหุ้น
16
 
17
  # --------------------------
18
  # CONFIG
@@ -34,7 +34,6 @@ def load_models():
34
  def analyze_text(text, bert_model, vader):
35
  if not text.strip():
36
  return 0
37
-
38
  vader_score = vader.polarity_scores(text)["compound"]
39
  textblob_score = TextBlob(text).sentiment.polarity
40
  bert_result = bert_model(text[:512])[0]
@@ -49,18 +48,48 @@ def analyze_text(text, bert_model, vader):
49
  return np.mean([vader_score, textblob_score, bert_score])
50
 
51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  @st.cache_data(ttl=3600)
53
- def fetch_financial_news(keyword):
54
- """ดึงข่าวย้อนหลัง 7 วันจาก NewsAPI.org"""
55
  to_date = datetime.now().strftime('%Y-%m-%d')
56
  from_date = (datetime.now() - timedelta(days=7)).strftime('%Y-%m-%d')
57
 
 
 
58
  all_articles = []
59
  page = 1
60
  while True:
61
  url = (
62
  f"https://newsapi.org/v2/everything?"
63
- f"q={keyword}+finance+stock&"
64
  f"from={from_date}&to={to_date}&"
65
  f"language=en&sortBy=publishedAt&"
66
  f"pageSize=100&page={page}&apiKey={API_KEY}"
@@ -86,26 +115,17 @@ def fetch_financial_news(keyword):
86
  })
87
 
88
  if len(articles) < 100:
89
- break # หมดแล้ว
90
  page += 1
91
 
92
  return pd.DataFrame(all_articles)
93
 
94
 
95
- def generate_wordcloud(text):
96
- stopwords = nltk.corpus.stopwords.words('english')
97
- wordcloud = WordCloud(width=800, height=400, background_color="white", stopwords=stopwords).generate(text)
98
- buf = BytesIO()
99
- wordcloud.to_image().save(buf, format="PNG")
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"]]
@@ -122,7 +142,7 @@ def fetch_stock_price(symbol):
122
  # --------------------------
123
  def main():
124
  st.title("📰 SentimentSync NewsAI")
125
- st.markdown("วิเคราะห์แนวโน้มอารมณ์ของข่าวการเงินย้อนหลัง 7 วัน พร้อมพยากรณ์แนวโน้มในอนาคต และรวมราคาหุ้น")
126
 
127
  # Sidebar
128
  with st.sidebar:
@@ -136,7 +156,7 @@ def main():
136
  bert_model, vader = load_models()
137
 
138
  # ดึงข่าว
139
- st.info(f"กำลังดึงข่าวย้อนหลัง 7 วันจาก NewsAPI.org สำหรับ '{keyword}' ...")
140
  news_df = fetch_financial_news(keyword)
141
  if news_df.empty:
142
  st.warning("ไม่พบบทความข่าวในช่วง 7 วันที่ผ่านมา")
@@ -163,9 +183,8 @@ def main():
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
 
 
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
 
34
  def analyze_text(text, bert_model, vader):
35
  if not text.strip():
36
  return 0
 
37
  vader_score = vader.polarity_scores(text)["compound"]
38
  textblob_score = TextBlob(text).sentiment.polarity
39
  bert_result = bert_model(text[:512])[0]
 
48
  return np.mean([vader_score, textblob_score, bert_score])
49
 
50
 
51
+ def generate_wordcloud(text):
52
+ stopwords = nltk.corpus.stopwords.words('english')
53
+ wordcloud = WordCloud(width=800, height=400, background_color="white", stopwords=stopwords).generate(text)
54
+ buf = BytesIO()
55
+ wordcloud.to_image().save(buf, format="PNG")
56
+ return base64.b64encode(buf.getvalue()).decode()
57
+
58
+
59
+ # --------------------------
60
+ # ฟังก์ชันใหม่: แปลงตัวย่อหุ้น -> ชื่อบริษัท
61
+ # --------------------------
62
+ @st.cache_data(ttl=86400)
63
+ def resolve_company_name(symbol):
64
+ """รับตัวย่อหุ้น เช่น AAPL แล้วดึงชื่อบริษัท เช่น Apple Inc."""
65
+ try:
66
+ ticker = yf.Ticker(symbol)
67
+ info = ticker.info
68
+ company_name = info.get("longName") or info.get("shortName")
69
+ if company_name:
70
+ return company_name
71
+ except Exception:
72
+ pass
73
+ return symbol # ถ้าไม่เจอ ใช้ symbol เอง
74
+
75
+
76
+ # --------------------------
77
+ # ดึงข่าว 7 วัน สำหรับ symbol + company name
78
+ # --------------------------
79
  @st.cache_data(ttl=3600)
80
+ def fetch_financial_news(symbol):
81
+ company_name = resolve_company_name(symbol)
82
  to_date = datetime.now().strftime('%Y-%m-%d')
83
  from_date = (datetime.now() - timedelta(days=7)).strftime('%Y-%m-%d')
84
 
85
+ query = f"({symbol} OR \"{company_name}\") finance stock"
86
+
87
  all_articles = []
88
  page = 1
89
  while True:
90
  url = (
91
  f"https://newsapi.org/v2/everything?"
92
+ f"q={query}&"
93
  f"from={from_date}&to={to_date}&"
94
  f"language=en&sortBy=publishedAt&"
95
  f"pageSize=100&page={page}&apiKey={API_KEY}"
 
115
  })
116
 
117
  if len(articles) < 100:
118
+ break
119
  page += 1
120
 
121
  return pd.DataFrame(all_articles)
122
 
123
 
 
 
 
 
 
 
 
 
124
  # --------------------------
125
+ # ดึงราคาหุ้นย้อนหลัง 14 วัน
126
  # --------------------------
127
  @st.cache_data(ttl=3600)
128
  def fetch_stock_price(symbol):
 
129
  try:
130
  df = yf.download(symbol, period="14d", interval="1d")
131
  df = df.reset_index()[["Date", "Close"]]
 
142
  # --------------------------
143
  def main():
144
  st.title("📰 SentimentSync NewsAI")
145
+ st.markdown("วิเคราะห์แนวโน้มอารมณ์ของข่าวย้อนหลัง 7 วัน พร้อมพยากรณ์ และรวมราคาหุ้น")
146
 
147
  # Sidebar
148
  with st.sidebar:
 
156
  bert_model, vader = load_models()
157
 
158
  # ดึงข่าว
159
+ st.info(f"กำลังดึงข่าวย้อนหลัง 7 วันสำหรับ '{keyword}' ...")
160
  news_df = fetch_financial_news(keyword)
161
  if news_df.empty:
162
  st.warning("ไม่พบบทความข่าวในช่วง 7 วันที่ผ่านมา")
 
183
  img = generate_wordcloud(all_text)
184
  st.image(f"data:image/png;base64,{img}", use_column_width=True)
185
 
186
+ # แนวโน้ม + พยากรณ์ + ราคาหุ้น
187
  st.subheader("📈 แนวโน้มและพยากรณ์อารมณ์ของข่าว & ราคาหุ้น")
 
188
  df_sorted = news_df.sort_values("date").copy()
189
  df_sorted["timestamp"] = (df_sorted["date"] - df_sorted["date"].min()).dt.days
190