Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -31,28 +31,31 @@ COMPANIES = {
|
|
31 |
'Netflix (NFLX)': 'NFLX'
|
32 |
}
|
33 |
|
34 |
-
def calculate_metrics(
|
35 |
-
|
36 |
-
|
37 |
-
#
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
# RSI
|
43 |
-
delta =
|
44 |
-
gain =
|
45 |
-
loss =
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
|
|
|
|
|
|
56 |
|
57 |
def create_analysis_plots(data: pd.DataFrame) -> list:
|
58 |
# Price and Volume Plot
|
@@ -122,7 +125,7 @@ def create_analysis_plots(data: pd.DataFrame) -> list:
|
|
122 |
|
123 |
return [fig1, fig2]
|
124 |
|
125 |
-
def generate_summary(data: pd.DataFrame) -> str:
|
126 |
current_price = data['Close'].iloc[-1]
|
127 |
prev_price = data['Close'].iloc[-2]
|
128 |
daily_return = ((current_price - prev_price) / prev_price) * 100
|
@@ -131,7 +134,7 @@ def generate_summary(data: pd.DataFrame) -> str:
|
|
131 |
sma_20 = data['SMA_20'].iloc[-1]
|
132 |
sma_50 = data['SMA_50'].iloc[-1]
|
133 |
|
134 |
-
summary = f"""
|
135 |
|
136 |
• Current Price: ${current_price:.2f}
|
137 |
• Daily Change: {daily_return:+.2f}%
|
@@ -164,7 +167,7 @@ def analyze_stock(company: str, lookback_days: int = 180) -> tuple:
|
|
164 |
data = calculate_metrics(data)
|
165 |
|
166 |
# Generate analysis
|
167 |
-
summary = generate_summary(data)
|
168 |
plots = create_analysis_plots(data)
|
169 |
|
170 |
return summary, plots[0], plots[1]
|
@@ -192,7 +195,7 @@ def create_gradio_interface():
|
|
192 |
step=1,
|
193 |
label="Lookback Period (days)"
|
194 |
)
|
195 |
-
refresh_btn = gr.Button("Refresh
|
196 |
|
197 |
with gr.Row():
|
198 |
summary = gr.Textbox(label="Analysis Summary", lines=10)
|
@@ -207,7 +210,7 @@ def create_gradio_interface():
|
|
207 |
outputs=[summary, plot1, plot2]
|
208 |
)
|
209 |
|
210 |
-
#
|
211 |
company.change(
|
212 |
fn=analyze_stock,
|
213 |
inputs=[company, lookback],
|
|
|
31 |
'Netflix (NFLX)': 'NFLX'
|
32 |
}
|
33 |
|
34 |
+
def calculate_metrics(df: pd.DataFrame) -> pd.DataFrame:
|
35 |
+
data = df.copy()
|
36 |
+
|
37 |
+
# Calculate basic metrics
|
38 |
+
data['Returns'] = data['Close'].pct_change()
|
39 |
+
data['SMA_20'] = data['Close'].rolling(window=20).mean()
|
40 |
+
data['SMA_50'] = data['Close'].rolling(window=50).mean()
|
41 |
+
|
42 |
+
# Calculate RSI
|
43 |
+
delta = data['Close'].diff()
|
44 |
+
gain = delta.clip(lower=0)
|
45 |
+
loss = -delta.clip(upper=0)
|
46 |
+
avg_gain = gain.rolling(window=14).mean()
|
47 |
+
avg_loss = loss.rolling(window=14).mean()
|
48 |
+
rs = avg_gain / avg_loss
|
49 |
+
data['RSI'] = 100 - (100 / (1 + rs))
|
50 |
+
|
51 |
+
# Calculate Bollinger Bands
|
52 |
+
rolling_mean = data['Close'].rolling(window=20).mean()
|
53 |
+
rolling_std = data['Close'].rolling(window=20).std()
|
54 |
+
data['BB_middle'] = rolling_mean
|
55 |
+
data['BB_upper'] = rolling_mean + (rolling_std * 2)
|
56 |
+
data['BB_lower'] = rolling_mean - (rolling_std * 2)
|
57 |
+
|
58 |
+
return data
|
59 |
|
60 |
def create_analysis_plots(data: pd.DataFrame) -> list:
|
61 |
# Price and Volume Plot
|
|
|
125 |
|
126 |
return [fig1, fig2]
|
127 |
|
128 |
+
def generate_summary(data: pd.DataFrame, symbol: str) -> str:
|
129 |
current_price = data['Close'].iloc[-1]
|
130 |
prev_price = data['Close'].iloc[-2]
|
131 |
daily_return = ((current_price - prev_price) / prev_price) * 100
|
|
|
134 |
sma_20 = data['SMA_20'].iloc[-1]
|
135 |
sma_50 = data['SMA_50'].iloc[-1]
|
136 |
|
137 |
+
summary = f"""Analysis Summary for {symbol}:
|
138 |
|
139 |
• Current Price: ${current_price:.2f}
|
140 |
• Daily Change: {daily_return:+.2f}%
|
|
|
167 |
data = calculate_metrics(data)
|
168 |
|
169 |
# Generate analysis
|
170 |
+
summary = generate_summary(data, symbol)
|
171 |
plots = create_analysis_plots(data)
|
172 |
|
173 |
return summary, plots[0], plots[1]
|
|
|
195 |
step=1,
|
196 |
label="Lookback Period (days)"
|
197 |
)
|
198 |
+
refresh_btn = gr.Button("🔄 Refresh")
|
199 |
|
200 |
with gr.Row():
|
201 |
summary = gr.Textbox(label="Analysis Summary", lines=10)
|
|
|
210 |
outputs=[summary, plot1, plot2]
|
211 |
)
|
212 |
|
213 |
+
# Auto-update on selection changes
|
214 |
company.change(
|
215 |
fn=analyze_stock,
|
216 |
inputs=[company, lookback],
|