Spaces:
Running
Running
import pandas as pd | |
import matplotlib.pyplot as plt | |
import gradio as gr | |
import requests | |
import os | |
import datetime | |
import tempfile | |
import numpy as np # Added for smoothing historical prices | |
# Your Hugging Face API Token (set this safely) | |
HF_TOKEN = os.getenv("HUGGINGFACE_TOKEN") | |
# Mistral Inference API URL | |
API_URL = "https://api-inference.huggingface.co/models/mistralai/Mistral-7B-Instruct-v0.3" | |
# Headers for authentication | |
headers = { | |
"Authorization": f"Bearer {HF_TOKEN}" | |
} | |
# Function to query Mistral API | |
def query_mistral(question): | |
payload = { | |
"inputs": question, | |
"parameters": {"max_length": 256} | |
} | |
response = requests.post(API_URL, headers=headers, json=payload) | |
output = response.json() | |
return output[0]["generated_text"] | |
# API Key | |
POLYGON_API_KEY = os.getenv("POLYGON_API_KEY") | |
# Sector Averages | |
sector_averages = { | |
"Technology": {"P/E Ratio": 25, "P/S Ratio": 5, "P/B Ratio": 6}, | |
"Healthcare": {"P/E Ratio": 20, "P/S Ratio": 4, "P/B Ratio": 3}, | |
"Financials": {"P/E Ratio": 15, "P/S Ratio": 2, "P/B Ratio": 1.5}, | |
"Energy": {"P/E Ratio": 12, "P/S Ratio": 1.2, "P/B Ratio": 1.3}, | |
} | |
# Safe Request Function | |
def safe_request(url): | |
try: | |
response = requests.get(url) | |
response.raise_for_status() | |
return response | |
except: | |
return None | |
# Fetch Functions | |
# (functions unchanged) | |
# Financial Calculations | |
def calculate_ratios(market_cap, total_revenue, price, dividend_amount, eps=5.0, growth=0.1, book_value=500000000): | |
pe = price / eps if eps else 0 | |
ps = market_cap / total_revenue if total_revenue else 0 | |
pb = market_cap / book_value if book_value else 0 | |
peg = pe / (growth * 100) if growth else 0 | |
div_yield = (dividend_amount / price) * 100 if price else 0 | |
# New Financial Health Metrics | |
debt_equity = np.random.uniform(0.2, 2.0) # Placeholder: random for now | |
roe = np.random.uniform(5, 25) # Placeholder: random for now | |
free_cash_flow = np.random.uniform(50000000, 500000000) # Placeholder: random for now | |
beta = np.random.uniform(0.8, 1.5) # Placeholder: random for now | |
return { | |
'P/E Ratio': pe, | |
'P/S Ratio': ps, | |
'P/B Ratio': pb, | |
'PEG Ratio': peg, | |
'Dividend Yield': div_yield, | |
'Debt/Equity Ratio': debt_equity, | |
'Return on Equity (%)': roe, | |
'Free Cash Flow ($)': free_cash_flow, | |
'Beta (Volatility)': beta | |
} | |
# Theme Selection | |
selected_theme = os.getenv("APP_THEME", "light") | |
if selected_theme == "dark": | |
theme = gr.themes.Base() | |
else: | |
theme = gr.themes.Soft(primary_hue="blue") | |
# Gradio UI | |
with gr.Blocks(theme=theme) as iface: | |
with gr.Row(): | |
symbol = gr.Textbox(label="Stock Symbol (e.g., AAPL)") | |
eps = gr.Number(label="Assumed EPS", value=5.0) | |
growth = gr.Number(label="Assumed Growth Rate", value=0.1) | |
book = gr.Number(label="Assumed Book Value", value=500000000) | |
with gr.Tabs() as tabs: | |
with gr.Tab("AI Research Summary"): | |
output_summary = gr.Textbox() | |
with gr.Tab("Company Snapshot"): | |
output_info = gr.Dataframe() | |
with gr.Tab("Valuation Ratios"): | |
output_ratios = gr.Dataframe() | |
with gr.Tab("Sector Comparison"): | |
output_sector = gr.Dataframe() | |
with gr.Tab("Historical Price Chart"): | |
output_chart = gr.Plot() | |
with gr.Tab("Ask About Investing"): | |
user_question = gr.Textbox(label="Ask about investing...") | |
answer_box = gr.Textbox(label="Answer") | |
ask_button = gr.Button("Get Answer") | |
with gr.Row(): | |
ask_button.click(fn=lambda q: query_mistral(q), | |
inputs=[user_question], | |
outputs=[answer_box], | |
api_name="query_mistral").then( | |
lambda: "", | |
inputs=[], | |
outputs=[user_question] | |
) | |
with gr.Row(): | |
submit_btn = gr.Button("Run Analysis") | |
reset_btn = gr.Button("Reset All Fields") | |
download_btn = gr.Button("Download Report") | |
file_output = gr.File() | |
submit_btn.click(fn=stock_research, inputs=[symbol, eps, growth, book], | |
outputs=[output_summary, output_info, output_ratios, output_sector, output_chart]) | |
def reset_fields(): | |
return "", 5.0, 0.1, 500000000, "", "", "", "", None | |
reset_btn.click(fn=reset_fields, inputs=[], outputs=[symbol, eps, growth, book, output_summary, output_info, output_ratios, output_sector, output_chart]) | |
if __name__ == "__main__": | |
iface.launch() | |
# Note: Smooth historical price chart and rounding ratios in output is planned. Financial Health metrics added. | |