Spaces:
Runtime error
Runtime error
| 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.") |