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