KYTHY commited on
Commit
0456220
·
verified ·
1 Parent(s): 95ceb05

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +41 -45
app.py CHANGED
@@ -2,7 +2,6 @@ import streamlit as st
2
  import requests
3
  import pandas as pd
4
  from datetime import datetime, timedelta
5
- from transformers import pipeline
6
  from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
7
  from textblob import TextBlob
8
  import nltk
@@ -23,29 +22,12 @@ API_KEY = "88bc396d4eab4be494a4b86ec842db47"
23
  # --------------------------
24
  # UTILITIES
25
  # --------------------------
26
- @st.cache_resource
27
- def load_models():
28
- st.info("Loading sentiment models...")
29
- bert_model = pipeline("sentiment-analysis", model="nlptown/bert-base-multilingual-uncased-sentiment")
30
- vader = SentimentIntensityAnalyzer()
31
- return bert_model, vader
32
-
33
-
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]
40
- label_map = {
41
- "1 star": -1,
42
- "2 stars": -0.5,
43
- "3 stars": 0,
44
- "4 stars": 0.5,
45
- "5 stars": 1
46
- }
47
- bert_score = label_map.get(bert_result["label"], 0)
48
- return np.mean([vader_score, textblob_score, bert_score])
49
 
50
 
51
  def generate_wordcloud(text):
@@ -57,46 +39,60 @@ def generate_wordcloud(text):
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}"
96
  )
97
  r = requests.get(url)
98
  data = r.json()
99
-
100
  if data.get("status") != "ok":
101
  st.error(f"API Error: {data}")
102
  break
@@ -142,7 +138,7 @@ def fetch_stock_price(symbol):
142
  # --------------------------
143
  def main():
144
  st.title("📰 SentimentSync NewsAI")
145
- st.markdown("วิเคราะห์แนวโน้มอารมณ์ของข่าวย้อนหลัง 7 วัน พร้อมพยากรณ์ และรวมราคาหุ้น")
146
 
147
  # Sidebar
148
  with st.sidebar:
@@ -153,7 +149,7 @@ def main():
153
  st.info("กรอกคำค้นแล้วกด 'วิเคราะห์เลย' เพื่อเริ่มต้น")
154
  return
155
 
156
- bert_model, vader = load_models()
157
 
158
  # ดึงข่าว
159
  st.info(f"กำล��งดึงข่าวย้อนหลัง 7 วันสำหรับ '{keyword}' ...")
@@ -164,7 +160,7 @@ def main():
164
 
165
  # วิเคราะห์ sentiment
166
  st.info("กำลังวิเคราะห์อารมณ์ของข่าว...")
167
- news_df["sentiment"] = news_df["text"].apply(lambda x: analyze_text(x, bert_model, vader))
168
  news_df["date"] = pd.to_datetime(news_df["date"])
169
 
170
  avg_sentiment = news_df["sentiment"].mean()
@@ -184,7 +180,7 @@ def main():
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
 
@@ -199,11 +195,11 @@ def main():
199
  future_preds = model.predict(future_timestamps.reshape(-1, 1))
200
 
201
  # ดึงราคาหุ้น
202
- stock_df = fetch_stock_price(keyword)
 
203
 
204
  # Plot
205
  fig = go.Figure()
206
-
207
  # Actual sentiment
208
  fig.add_trace(go.Scatter(
209
  x=df_sorted["date"], y=df_sorted["sentiment"],
@@ -220,7 +216,7 @@ def main():
220
  if not stock_df.empty:
221
  fig.add_trace(go.Scatter(
222
  x=stock_df["date"], y=stock_df["price"],
223
- mode="lines+markers", name=f"{keyword} Stock Price",
224
  line=dict(color="green"), yaxis="y2"
225
  ))
226
 
 
2
  import requests
3
  import pandas as pd
4
  from datetime import datetime, timedelta
 
5
  from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
6
  from textblob import TextBlob
7
  import nltk
 
22
  # --------------------------
23
  # UTILITIES
24
  # --------------------------
25
+ def analyze_text(text, vader):
 
 
 
 
 
 
 
 
26
  if not text.strip():
27
  return 0
28
  vader_score = vader.polarity_scores(text)["compound"]
29
  textblob_score = TextBlob(text).sentiment.polarity
30
+ return np.mean([vader_score, textblob_score])
 
 
 
 
 
 
 
 
 
31
 
32
 
33
  def generate_wordcloud(text):
 
39
 
40
 
41
  # --------------------------
42
+ # แปลงชื่อ/ตัวย่อ (Company Name, Symbol)
43
  # --------------------------
44
+ def resolve_company_symbol(keyword: str):
45
+ keyword = keyword.strip()
46
+ ticker = None
47
+ name = None
48
+
49
  try:
50
+ data = yf.Ticker(keyword)
51
+ info = data.info
52
+ if "symbol" in info and info["symbol"]:
53
+ ticker = info["symbol"]
54
+ name = info.get("longName", info.get("shortName", keyword))
55
+ else:
56
+ url = f"https://query2.finance.yahoo.com/v1/finance/search?q={keyword}"
57
+ res = requests.get(url).json()
58
+ if "quotes" in res and len(res["quotes"]) > 0:
59
+ q = res["quotes"][0]
60
+ ticker = q.get("symbol")
61
+ name = q.get("longname", q.get("shortname", keyword))
62
+ except Exception as e:
63
+ print("Lookup failed:", e)
64
+
65
+ if not ticker:
66
+ ticker = keyword.upper()
67
+ if not name:
68
+ name = keyword.capitalize()
69
+
70
+ return name, ticker
71
 
72
 
73
  # --------------------------
74
+ # ดึงข่าว 7 วัน สำหรับ Company + Symbol
75
  # --------------------------
76
  @st.cache_data(ttl=3600)
77
+ def fetch_financial_news(keyword):
78
+ company, symbol = resolve_company_symbol(keyword)
79
  to_date = datetime.now().strftime('%Y-%m-%d')
80
  from_date = (datetime.now() - timedelta(days=7)).strftime('%Y-%m-%d')
81
 
82
+ query_keyword = f"({company} OR {symbol}) finance stock"
83
 
84
  all_articles = []
85
  page = 1
86
  while True:
87
  url = (
88
  f"https://newsapi.org/v2/everything?"
89
+ f"q={query_keyword}&"
90
  f"from={from_date}&to={to_date}&"
91
  f"language=en&sortBy=publishedAt&"
92
  f"pageSize=100&page={page}&apiKey={API_KEY}"
93
  )
94
  r = requests.get(url)
95
  data = r.json()
 
96
  if data.get("status") != "ok":
97
  st.error(f"API Error: {data}")
98
  break
 
138
  # --------------------------
139
  def main():
140
  st.title("📰 SentimentSync NewsAI")
141
+ st.markdown("วิเคราะห์แนวโน้มอารมณ์ของข่าวย้อนหลัง 7 วัน พร้อมราคาหุ้น")
142
 
143
  # Sidebar
144
  with st.sidebar:
 
149
  st.info("กรอกคำค้นแล้วกด 'วิเคราะห์เลย' เพื่อเริ่มต้น")
150
  return
151
 
152
+ vader = SentimentIntensityAnalyzer()
153
 
154
  # ดึงข่าว
155
  st.info(f"กำล��งดึงข่าวย้อนหลัง 7 วันสำหรับ '{keyword}' ...")
 
160
 
161
  # วิเคราะห์ sentiment
162
  st.info("กำลังวิเคราะห์อารมณ์ของข่าว...")
163
+ news_df["sentiment"] = news_df["text"].apply(lambda x: analyze_text(x, vader))
164
  news_df["date"] = pd.to_datetime(news_df["date"])
165
 
166
  avg_sentiment = news_df["sentiment"].mean()
 
180
  st.image(f"data:image/png;base64,{img}", use_column_width=True)
181
 
182
  # แนวโน้ม + พยากรณ์ + ราคาหุ้น
183
+ st.subheader("📈 แนวโน้มอารมณ์ของข่าว & ราคาหุ้น")
184
  df_sorted = news_df.sort_values("date").copy()
185
  df_sorted["timestamp"] = (df_sorted["date"] - df_sorted["date"].min()).dt.days
186
 
 
195
  future_preds = model.predict(future_timestamps.reshape(-1, 1))
196
 
197
  # ดึงราคาหุ้น
198
+ _, symbol = resolve_company_symbol(keyword)
199
+ stock_df = fetch_stock_price(symbol)
200
 
201
  # Plot
202
  fig = go.Figure()
 
203
  # Actual sentiment
204
  fig.add_trace(go.Scatter(
205
  x=df_sorted["date"], y=df_sorted["sentiment"],
 
216
  if not stock_df.empty:
217
  fig.add_trace(go.Scatter(
218
  x=stock_df["date"], y=stock_df["price"],
219
+ mode="lines+markers", name=f"{symbol} Stock Price",
220
  line=dict(color="green"), yaxis="y2"
221
  ))
222