arjunanand13 commited on
Commit
fc09205
·
verified ·
1 Parent(s): 8dbdb70

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +30 -27
app.py CHANGED
@@ -31,28 +31,31 @@ COMPANIES = {
31
  'Netflix (NFLX)': 'NFLX'
32
  }
33
 
34
- def calculate_metrics(data: pd.DataFrame) -> pd.DataFrame:
35
- df = data.copy()
36
-
37
- # Basic metrics
38
- df['Returns'] = df['Close'].pct_change()
39
- df['SMA_20'] = df['Close'].rolling(window=20).mean()
40
- df['SMA_50'] = df['Close'].rolling(window=50).mean()
41
-
42
- # RSI
43
- delta = df['Close'].diff()
44
- gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
45
- loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
46
- rs = gain / loss
47
- df['RSI'] = 100 - (100 / (1 + rs))
48
-
49
- # Bollinger Bands
50
- df['BB_middle'] = df['Close'].rolling(window=20).mean()
51
- bb_std = df['Close'].rolling(window=20).std()
52
- df['BB_upper'] = df['BB_middle'] + (2 * bb_std)
53
- df['BB_lower'] = df['BB_middle'] - (2 * bb_std)
54
-
55
- return df
 
 
 
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"""Market Analysis Summary:
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 Analysis")
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
- # Also trigger analysis when company or lookback period changes
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],