import pandas as pd from datetime import datetime import yfinance as yf from charts import update_bar_graph import json # Download stock data and format into a DataFrame def download_data(state): df = yf.download(state["symbol"], period="max", interval="1d") df = df.reset_index() df = df.sort_values(by="Date", ascending=False) df = df.round({"Open": 2, "High": 2, "Low": 2, "Close": 2, "Adj Close": 2}) df["Date"] = pd.to_datetime(df["Date"]) state["main_df_subset"] = df state["main_df"] = state["main_df_subset"] # Download S&P 500 data and format into a DataFrame def download_sp500(state): df = yf.download(tickers="^GSPC", period="max", interval="1d") df = df.reset_index() df = df.sort_values(by="Date", ascending=False) df = df.round({"Open": 2, "High": 2, "Low": 2, "Close": 2, "Adj Close": 2}) df["Date"] = pd.to_datetime(df["Date"]) state["another_df"] = df # Retrieve latest stock news def stock_news(state): msft = yf.Ticker(state["symbol"]) articles = {} data = msft.news latest_articles = sorted( data, key=lambda x: x["providerPublishTime"], reverse=True )[:4] for item in latest_articles: provider_publish_time = item.get("providerPublishTime", "") if provider_publish_time: # Convert the timestamp to a readable date formatted_date = datetime.fromtimestamp(provider_publish_time) readable_date = formatted_date.strftime("%B %d, %Y at %H:%M") else: readable_date = "Date not available" title = item.get("title", "No Title") articles[title] = { "source": item.get("publisher", ""), "published_at": readable_date, "url": item.get("link", ""), } state["articles"] = articles # Retrieve income statement data def income_statement(state): quarterly_income_stmt = yf.Ticker(state["symbol"]).quarterly_income_stmt df = pd.DataFrame(quarterly_income_stmt) df.columns = pd.to_datetime(df.columns).strftime("%Y-%m-%d") state["income_statement_df"] = df update_bar_graph(state) show_fin_metrics(state) # Show financial metrics def show_fin_metrics(state): stock = yf.Ticker(state["symbol"]) operating_margins = stock.info['operatingMargins'] gross_margin = stock.info['grossMargins'] ebitda_margin = stock.info['ebitdaMargins'] state["operating_margin"] = f"{operating_margins * 100:.2f}%" state["gross_margin"] = f"{gross_margin * 100:.2f}%" state["ebitda_margin"] = f"{ebitda_margin * 100:.2f}%" def _one_day_data(state): state["last_24_hours_open"] = round(state["main_df"]["Open"].iloc[0], 2) state["last_24_hours_high"] = round(state["main_df"]["High"].iloc[0], 2) state["last_24_hours_low"] = round(state["main_df"]["Low"].iloc[0], 2) # Retrieve earnings call transcript from JSON file # You could replace this with a call to an API like Financial Modeling Prep def earnings_calls(state): ticker = state["symbol"] with open('earnings-data.json', 'r') as file: earnings_transcript = json.load(file) if earnings_transcript: for item in earnings_transcript: if item['symbol'] == ticker: state["earnings_transcript"] = item["content"] else: print("No earnings transcript found.")