Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -13,7 +13,7 @@ df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
|
|
| 13 |
df['Year'] = df['Date'].dt.year
|
| 14 |
df['Month'] = df['Date'].dt.to_period('M')
|
| 15 |
df['Day'] = df['Date'].dt.date
|
| 16 |
-
df = df[df['Year'] >= 2015]
|
| 17 |
|
| 18 |
# --- TICKERS ---
|
| 19 |
TICKERS = {
|
|
@@ -38,16 +38,13 @@ for company, ticker in TICKERS.items():
|
|
| 38 |
df_prices = df_prices.rename(columns={f'Close_{ticker}': 'Close_NASDAQ'})
|
| 39 |
prices[company] = df_prices
|
| 40 |
|
| 41 |
-
# ---
|
| 42 |
def get_prices_for_agg(agg_col):
|
| 43 |
df_prices_agg = {}
|
| 44 |
for company, df_price in prices.items():
|
| 45 |
df_temp = df_price.copy()
|
| 46 |
-
if company ==
|
| 47 |
-
|
| 48 |
-
else:
|
| 49 |
-
col = f"Close_{TICKERS[company]}"
|
| 50 |
-
df_temp = df_temp.rename(columns={f"Close_{TICKERS[company]}": col})
|
| 51 |
|
| 52 |
if agg_col == "Day":
|
| 53 |
df_temp = df_temp.set_index('Date').resample('D').mean().interpolate('linear').reset_index()
|
|
@@ -57,6 +54,7 @@ def get_prices_for_agg(agg_col):
|
|
| 57 |
elif agg_col == "Year":
|
| 58 |
df_temp['Year'] = df_temp['Date'].dt.year
|
| 59 |
df_temp = df_temp.groupby('Year')[col].last().reset_index()
|
|
|
|
| 60 |
df_prices_agg[company] = df_temp
|
| 61 |
return df_prices_agg
|
| 62 |
|
|
@@ -70,29 +68,23 @@ for company in df['Company'].unique():
|
|
| 70 |
df_merged = df_merged.merge(prices['NASDAQ'][['Date', 'Close_NASDAQ']], on='Date', how='left')
|
| 71 |
|
| 72 |
# --- GRADIO FUNCTION ---
|
| 73 |
-
def show_sentiment(selected_companies=None, aggregation="Day", selected_year=
|
| 74 |
if not selected_companies:
|
| 75 |
selected_companies = ["NASDAQ"]
|
| 76 |
|
| 77 |
df_filtered = df_merged.copy()
|
| 78 |
-
if selected_year != "All":
|
| 79 |
df_filtered = df_filtered[df_filtered['Year'] == int(selected_year)]
|
| 80 |
|
| 81 |
-
|
| 82 |
# colonna aggregazione
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
elif aggregation == "Month":
|
| 86 |
-
group_col = "Month"
|
| 87 |
df_filtered['Month'] = df_filtered['Month'].dt.to_timestamp()
|
| 88 |
-
elif aggregation == "
|
| 89 |
-
|
| 90 |
-
else:
|
| 91 |
-
group_col = "Day"
|
| 92 |
-
|
| 93 |
|
| 94 |
-
# prezzi interpolati
|
| 95 |
-
prices_agg = get_prices_for_agg(
|
| 96 |
|
| 97 |
include_nasdaq = "NASDAQ" in selected_companies
|
| 98 |
companies_to_plot = [c for c in selected_companies if c != "NASDAQ"]
|
|
@@ -104,6 +96,8 @@ def show_sentiment(selected_companies=None, aggregation="Day", selected_year=Non
|
|
| 104 |
df_sent = df_filtered[df_filtered['Company'].isin(companies_to_plot)]
|
| 105 |
df_tmp = df_sent.groupby([group_col, 'Company']).agg({'Score':'sum'}).reset_index()
|
| 106 |
for c in companies_to_plot:
|
|
|
|
|
|
|
| 107 |
ticker_col = f"Close_{TICKERS[c]}"
|
| 108 |
df_price_col = prices_agg[c][[group_col, ticker_col]]
|
| 109 |
df_tmp = df_tmp.merge(df_price_col, on=group_col, how='left')
|
|
@@ -128,14 +122,20 @@ def show_sentiment(selected_companies=None, aggregation="Day", selected_year=Non
|
|
| 128 |
ticker_col = f"Close_{TICKERS[c]}"
|
| 129 |
df_c = df_grouped[df_grouped['Company'] == c]
|
| 130 |
if ticker_col in df_c.columns and df_c[ticker_col].notnull().any():
|
| 131 |
-
fig.add_scatter(
|
| 132 |
-
|
|
|
|
|
|
|
|
|
|
| 133 |
|
| 134 |
if include_nasdaq:
|
| 135 |
df_c = df_grouped[df_grouped['Company'] == 'General']
|
| 136 |
if 'Close_NASDAQ' in df_c.columns and df_c['Close_NASDAQ'].notnull().any():
|
| 137 |
-
fig.add_scatter(
|
| 138 |
-
|
|
|
|
|
|
|
|
|
|
| 139 |
|
| 140 |
fig.update_layout(
|
| 141 |
yaxis2=dict(
|
|
@@ -158,11 +158,11 @@ demo = gr.Interface(
|
|
| 158 |
choices=companies,
|
| 159 |
value=None,
|
| 160 |
label="Select Companies (NASDAQ compares with general sentiment)",
|
| 161 |
-
multiselect=
|
| 162 |
),
|
| 163 |
gr.Radio(
|
| 164 |
choices=["Month", "Year"],
|
| 165 |
-
value="
|
| 166 |
label="Aggregation Level"
|
| 167 |
),
|
| 168 |
gr.Dropdown(
|
|
@@ -176,7 +176,10 @@ demo = gr.Interface(
|
|
| 176 |
gr.Plot(label="Sentiment Trend"),
|
| 177 |
],
|
| 178 |
title="Dynamic Sentiment Dashboard",
|
| 179 |
-
description="Shows sentiment scores aggregated by month or year. NASDAQ compares with general sentiment if selected."
|
|
|
|
|
|
|
| 180 |
)
|
| 181 |
|
| 182 |
demo.launch()
|
|
|
|
|
|
| 13 |
df['Year'] = df['Date'].dt.year
|
| 14 |
df['Month'] = df['Date'].dt.to_period('M')
|
| 15 |
df['Day'] = df['Date'].dt.date
|
| 16 |
+
df = df[df['Year'] >= 2015]
|
| 17 |
|
| 18 |
# --- TICKERS ---
|
| 19 |
TICKERS = {
|
|
|
|
| 38 |
df_prices = df_prices.rename(columns={f'Close_{ticker}': 'Close_NASDAQ'})
|
| 39 |
prices[company] = df_prices
|
| 40 |
|
| 41 |
+
# --- INTERPOLATE PRICES FOR DAY/MONTH ---
|
| 42 |
def get_prices_for_agg(agg_col):
|
| 43 |
df_prices_agg = {}
|
| 44 |
for company, df_price in prices.items():
|
| 45 |
df_temp = df_price.copy()
|
| 46 |
+
col = 'Close_NASDAQ' if company == 'NASDAQ' else f"Close_{TICKERS[company]}"
|
| 47 |
+
df_temp = df_temp.rename(columns={df_temp.columns[1]: col})
|
|
|
|
|
|
|
|
|
|
| 48 |
|
| 49 |
if agg_col == "Day":
|
| 50 |
df_temp = df_temp.set_index('Date').resample('D').mean().interpolate('linear').reset_index()
|
|
|
|
| 54 |
elif agg_col == "Year":
|
| 55 |
df_temp['Year'] = df_temp['Date'].dt.year
|
| 56 |
df_temp = df_temp.groupby('Year')[col].last().reset_index()
|
| 57 |
+
|
| 58 |
df_prices_agg[company] = df_temp
|
| 59 |
return df_prices_agg
|
| 60 |
|
|
|
|
| 68 |
df_merged = df_merged.merge(prices['NASDAQ'][['Date', 'Close_NASDAQ']], on='Date', how='left')
|
| 69 |
|
| 70 |
# --- GRADIO FUNCTION ---
|
| 71 |
+
def show_sentiment(selected_companies=None, aggregation="Day", selected_year="All"):
|
| 72 |
if not selected_companies:
|
| 73 |
selected_companies = ["NASDAQ"]
|
| 74 |
|
| 75 |
df_filtered = df_merged.copy()
|
| 76 |
+
if selected_year != "All" and selected_year is not None:
|
| 77 |
df_filtered = df_filtered[df_filtered['Year'] == int(selected_year)]
|
| 78 |
|
|
|
|
| 79 |
# colonna aggregazione
|
| 80 |
+
group_col = aggregation
|
| 81 |
+
if aggregation == "Month":
|
|
|
|
|
|
|
| 82 |
df_filtered['Month'] = df_filtered['Month'].dt.to_timestamp()
|
| 83 |
+
elif aggregation == "Day":
|
| 84 |
+
df_filtered['Day'] = df_filtered['Date']
|
|
|
|
|
|
|
|
|
|
| 85 |
|
| 86 |
+
# prezzi interpolati
|
| 87 |
+
prices_agg = get_prices_for_agg(aggregation)
|
| 88 |
|
| 89 |
include_nasdaq = "NASDAQ" in selected_companies
|
| 90 |
companies_to_plot = [c for c in selected_companies if c != "NASDAQ"]
|
|
|
|
| 96 |
df_sent = df_filtered[df_filtered['Company'].isin(companies_to_plot)]
|
| 97 |
df_tmp = df_sent.groupby([group_col, 'Company']).agg({'Score':'sum'}).reset_index()
|
| 98 |
for c in companies_to_plot:
|
| 99 |
+
if c not in TICKERS:
|
| 100 |
+
continue
|
| 101 |
ticker_col = f"Close_{TICKERS[c]}"
|
| 102 |
df_price_col = prices_agg[c][[group_col, ticker_col]]
|
| 103 |
df_tmp = df_tmp.merge(df_price_col, on=group_col, how='left')
|
|
|
|
| 122 |
ticker_col = f"Close_{TICKERS[c]}"
|
| 123 |
df_c = df_grouped[df_grouped['Company'] == c]
|
| 124 |
if ticker_col in df_c.columns and df_c[ticker_col].notnull().any():
|
| 125 |
+
fig.add_scatter(
|
| 126 |
+
x=df_c[group_col], y=df_c[ticker_col],
|
| 127 |
+
mode='lines', name=f"{c} Price", yaxis="y2",
|
| 128 |
+
line=dict(dash='dot')
|
| 129 |
+
)
|
| 130 |
|
| 131 |
if include_nasdaq:
|
| 132 |
df_c = df_grouped[df_grouped['Company'] == 'General']
|
| 133 |
if 'Close_NASDAQ' in df_c.columns and df_c['Close_NASDAQ'].notnull().any():
|
| 134 |
+
fig.add_scatter(
|
| 135 |
+
x=df_c[group_col], y=df_c['Close_NASDAQ'],
|
| 136 |
+
mode='lines', name="NASDAQ Price", yaxis="y2",
|
| 137 |
+
line=dict(dash='dot')
|
| 138 |
+
)
|
| 139 |
|
| 140 |
fig.update_layout(
|
| 141 |
yaxis2=dict(
|
|
|
|
| 158 |
choices=companies,
|
| 159 |
value=None,
|
| 160 |
label="Select Companies (NASDAQ compares with general sentiment)",
|
| 161 |
+
multiselect=True
|
| 162 |
),
|
| 163 |
gr.Radio(
|
| 164 |
choices=["Month", "Year"],
|
| 165 |
+
value="Month",
|
| 166 |
label="Aggregation Level"
|
| 167 |
),
|
| 168 |
gr.Dropdown(
|
|
|
|
| 176 |
gr.Plot(label="Sentiment Trend"),
|
| 177 |
],
|
| 178 |
title="Dynamic Sentiment Dashboard",
|
| 179 |
+
description="Shows sentiment scores aggregated by month, or year. NASDAQ compares with general sentiment if selected."
|
| 180 |
+
|
| 181 |
+
|
| 182 |
)
|
| 183 |
|
| 184 |
demo.launch()
|
| 185 |
+
|