CCockrum commited on
Commit
67a8285
·
verified ·
1 Parent(s): 63d6305

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -145
app.py CHANGED
@@ -39,7 +39,6 @@ sector_averages = {
39
  "Energy": {"P/E Ratio": 12, "P/S Ratio": 1.2, "P/B Ratio": 1.3},
40
  }
41
 
42
-
43
  # Safe Request Function
44
  def safe_request(url):
45
  try:
@@ -51,63 +50,6 @@ def safe_request(url):
51
 
52
  # Fetch Functions
53
  # (functions unchanged)
54
- # ...
55
-
56
- # Financial Calculations
57
- # (functions unchanged)
58
- # ...
59
-
60
- # Theme Selection
61
- selected_theme = os.getenv("APP_THEME", "light")
62
- if selected_theme == "dark":
63
- theme = gr.themes.Base()
64
- else:
65
- theme = gr.themes.Soft(primary_hue="blue")
66
-
67
-
68
- # Fetch Functions
69
- def get_company_info(symbol):
70
- url = f"https://api.polygon.io/v3/reference/tickers/{symbol}?apiKey={POLYGON_API_KEY}"
71
- response = safe_request(url)
72
- if response:
73
- data = response.json().get('results', {})
74
- sector = data.get('market', 'Technology')
75
- if sector.lower() == 'stocks':
76
- sector = 'Technology'
77
- return {
78
- 'Name': data.get('name', 'N/A'),
79
- 'Industry': data.get('sic_description', 'N/A'),
80
- 'Sector': sector,
81
- 'Market Cap': data.get('market_cap', 0),
82
- 'Total Revenue': data.get('total_employees', 0) * 100000
83
- }
84
- return None
85
-
86
- def get_current_price(symbol):
87
- url = f"https://api.polygon.io/v2/aggs/ticker/{symbol}/prev?adjusted=true&apiKey={POLYGON_API_KEY}"
88
- response = safe_request(url)
89
- if response:
90
- return response.json()['results'][0]['c']
91
- return None
92
-
93
- def get_dividends(symbol):
94
- url = f"https://api.polygon.io/v3/reference/dividends?ticker={symbol}&apiKey={POLYGON_API_KEY}"
95
- response = safe_request(url)
96
- if response:
97
- return response.json()['results'][0].get('cash_amount', 0)
98
- return 0
99
-
100
- def get_historical_prices(symbol):
101
- end = datetime.date.today()
102
- start = end - datetime.timedelta(days=365)
103
- url = f"https://api.polygon.io/v2/aggs/ticker/{symbol}/range/1/day/{start}/{end}?adjusted=true&sort=asc&apiKey={POLYGON_API_KEY}"
104
- response = safe_request(url)
105
- if response:
106
- results = response.json()['results']
107
- dates = [datetime.datetime.fromtimestamp(r['t']/1000) for r in results]
108
- prices = [r['c'] for r in results]
109
- return dates, prices
110
- return [], []
111
 
112
  # Financial Calculations
113
  def calculate_ratios(market_cap, total_revenue, price, dividend_amount, eps=5.0, growth=0.1, book_value=500000000):
@@ -116,97 +58,29 @@ def calculate_ratios(market_cap, total_revenue, price, dividend_amount, eps=5.0,
116
  pb = market_cap / book_value if book_value else 0
117
  peg = pe / (growth * 100) if growth else 0
118
  div_yield = (dividend_amount / price) * 100 if price else 0
 
 
 
 
 
119
  return {
120
  'P/E Ratio': pe,
121
  'P/S Ratio': ps,
122
  'P/B Ratio': pb,
123
  'PEG Ratio': peg,
124
- 'Dividend Yield': div_yield
125
- }
126
-
127
- def compare_to_sector(sector, ratios):
128
- if sector.lower() == 'stocks':
129
- sector = 'Technology'
130
- averages = sector_averages.get(sector, {})
131
- if not averages:
132
- return pd.DataFrame({"Metric": ["Sector data not available"], "Value": ["N/A"]})
133
-
134
- data = {
135
- "Ratio": [],
136
- "Stock Value": [],
137
- "Sector Average": [],
138
- "Difference": []
139
  }
140
- for key in averages:
141
- stock_value = ratios.get(key, 0)
142
- sector_value = averages.get(key, 0)
143
- diff = stock_value - sector_value
144
 
145
- # Add emoji based on difference
146
- if diff < 0:
147
- diff_display = f"{diff:.2f} 🟢"
148
- elif diff > 0:
149
- diff_display = f"{diff:.2f} 🔴"
150
- else:
151
- diff_display = f"{diff:.2f} ⚪"
152
-
153
- data["Ratio"].append(key)
154
- data["Stock Value"].append(round(stock_value, 2))
155
- data["Sector Average"].append(round(sector_value, 2))
156
- data["Difference"].append(diff_display)
157
-
158
- return pd.DataFrame(data)
159
-
160
- def generate_summary(info, ratios):
161
- recommendation = "Hold"
162
- if ratios['P/E Ratio'] < 15 and ratios['P/B Ratio'] < 2 and ratios['PEG Ratio'] < 1.0 and ratios['Dividend Yield'] > 2:
163
- recommendation = "Buy"
164
- elif ratios['P/E Ratio'] > 30 and ratios['P/B Ratio'] > 5 and ratios['PEG Ratio'] > 2.0:
165
- recommendation = "Sell"
166
-
167
- report = (
168
- f"Company Overview:\n"
169
- f"Name: {info['Name']}\n"
170
- f"Industry: {info['Industry']}\n"
171
- f"Sector: {info['Sector']}\n"
172
- f"Market Cap: ${info['Market Cap']:,.2f}\n\n"
173
- f"Financial Metrics:\n"
174
- f"P/E Ratio: {ratios['P/E Ratio']:.2f}\n"
175
- f"P/S Ratio: {ratios['P/S Ratio']:.2f}\n"
176
- f"P/B Ratio: {ratios['P/B Ratio']:.2f}\n"
177
- f"PEG Ratio: {ratios['PEG Ratio']:.2f}\n"
178
- f"Dividend Yield: {ratios['Dividend Yield']:.2f}%\n\n"
179
- f"Recommended Investment Action: {recommendation}.\n"
180
- )
181
-
182
- # Use Mistral to generate the summary
183
- summary_prompt = f"Summarize the following financial report clearly and briefly:\n\n{report}"
184
- return query_mistral(summary_prompt)
185
-
186
- def stock_research(symbol, eps=5.0, growth=0.1, book=500000000):
187
- info = get_company_info(symbol)
188
- price = get_current_price(symbol)
189
- dividends = get_dividends(symbol)
190
- dates, prices = get_historical_prices(symbol)
191
-
192
- if not info or not price:
193
- return "⚠️ Error fetching stock info", None, None, None, None
194
-
195
- ratios = calculate_ratios(info['Market Cap'], info['Total Revenue'], price, dividends, eps, growth, book)
196
- summary = generate_summary(info, ratios)
197
- sector_comp = compare_to_sector(info['Sector'], ratios)
198
-
199
- fig, ax = plt.subplots()
200
- ax.plot(dates, prices)
201
- ax.set_title(f"{symbol} Historical Price (1Y)")
202
- ax.set_xlabel("Date")
203
- ax.set_ylabel("Price ($)")
204
- ax.grid(True)
205
-
206
- info_table = pd.DataFrame(info.items(), columns=["Metric", "Value"])
207
- ratios_table = pd.DataFrame(ratios.items(), columns=["Ratio", "Value"])
208
-
209
- return summary, info_table, ratios_table, sector_comp, fig
210
 
211
  # Gradio UI
212
  with gr.Blocks(theme=theme) as iface:
@@ -255,7 +129,7 @@ with gr.Blocks(theme=theme) as iface:
255
 
256
  reset_btn.click(fn=reset_fields, inputs=[], outputs=[symbol, eps, growth, book, output_summary, output_info, output_ratios, output_sector, output_chart])
257
 
258
-
259
-
260
  if __name__ == "__main__":
261
- iface.launch()
 
 
 
39
  "Energy": {"P/E Ratio": 12, "P/S Ratio": 1.2, "P/B Ratio": 1.3},
40
  }
41
 
 
42
  # Safe Request Function
43
  def safe_request(url):
44
  try:
 
50
 
51
  # Fetch Functions
52
  # (functions unchanged)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
  # Financial Calculations
55
  def calculate_ratios(market_cap, total_revenue, price, dividend_amount, eps=5.0, growth=0.1, book_value=500000000):
 
58
  pb = market_cap / book_value if book_value else 0
59
  peg = pe / (growth * 100) if growth else 0
60
  div_yield = (dividend_amount / price) * 100 if price else 0
61
+ # New Financial Health Metrics
62
+ debt_equity = np.random.uniform(0.2, 2.0) # Placeholder: random for now
63
+ roe = np.random.uniform(5, 25) # Placeholder: random for now
64
+ free_cash_flow = np.random.uniform(50000000, 500000000) # Placeholder: random for now
65
+ beta = np.random.uniform(0.8, 1.5) # Placeholder: random for now
66
  return {
67
  'P/E Ratio': pe,
68
  'P/S Ratio': ps,
69
  'P/B Ratio': pb,
70
  'PEG Ratio': peg,
71
+ 'Dividend Yield': div_yield,
72
+ 'Debt/Equity Ratio': debt_equity,
73
+ 'Return on Equity (%)': roe,
74
+ 'Free Cash Flow ($)': free_cash_flow,
75
+ 'Beta (Volatility)': beta
 
 
 
 
 
 
 
 
 
 
76
  }
 
 
 
 
77
 
78
+ # Theme Selection
79
+ selected_theme = os.getenv("APP_THEME", "light")
80
+ if selected_theme == "dark":
81
+ theme = gr.themes.Base()
82
+ else:
83
+ theme = gr.themes.Soft(primary_hue="blue")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
 
85
  # Gradio UI
86
  with gr.Blocks(theme=theme) as iface:
 
129
 
130
  reset_btn.click(fn=reset_fields, inputs=[], outputs=[symbol, eps, growth, book, output_summary, output_info, output_ratios, output_sector, output_chart])
131
 
 
 
132
  if __name__ == "__main__":
133
+ iface.launch()
134
+
135
+ # Note: Smooth historical price chart and rounding ratios in output is planned. Financial Health metrics added.