Spaces:
Sleeping
Sleeping
import streamlit as st | |
import yfinance as yf | |
import pandas as pd | |
# Load S&P 500 averages from a CSV file | |
def load_sp500_averages(filepath): | |
return pd.read_csv(filepath, header=0, names=['Ratio', 'Average']).set_index('Ratio') | |
# Fetch financial data for a single stock | |
def fetch_stock_data(ticker_symbol): | |
ticker = yf.Ticker(ticker_symbol) | |
info = ticker.info | |
# Calculate Book-to-Market Ratio | |
pb_ratio = info.get('priceToBook') | |
book_to_market_ratio = 1 / pb_ratio if pb_ratio and pb_ratio > 0 else None | |
# Extract relevant financial information, including Book-to-Market Ratio | |
financials = { | |
'P/E Ratio': info.get('forwardPE'), | |
'P/B Ratio': pb_ratio, | |
'P/S Ratio': info.get('priceToSalesTrailing12Months'), | |
'Debt to Equity Ratio': info.get('debtToEquity'), | |
'Return on Equity': info.get('returnOnEquity'), | |
'Book-to-Market Ratio': book_to_market_ratio, | |
} | |
return financials, info | |
# ... rest of your existing functions ... | |
# User interface in Streamlit | |
st.title('S&P 500 Stock Comparison Tool') | |
# Check if companies are in the S&P 500 | |
def get_sp500_list(): | |
table = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies') | |
return table[0]['Symbol'].tolist() | |
sp500_list = get_sp500_list() | |
# Load S&P 500 averages | |
sp500_averages = load_sp500_averages(sp500_averages_path) | |
# Calculate combined scores for stocks in the S&P 500 | |
scores_df = calculate_combined_scores_for_stocks(sp500_list, sp500_averages) | |
scores_df_sorted = scores_df.sort_values(by='Combined Score', ascending=False) | |
# Use columns for side-by-side layout | |
col1, col2 = st.columns([1, 3]) | |
# First column for the sorted overview | |
with col1: | |
st.subheader("Stock Overview") | |
# Create a DataFrame for the sidebar with color-coded combined scores | |
scores_df_sorted['color'] = scores_df_sorted['Combined Score'].apply( | |
lambda x: 'green' if x > 0 else 'red' if x < 0 else 'grey') | |
for index, row in scores_df_sorted.iterrows(): | |
color = row['color'] | |
st.markdown(f"<span style='color: {color};'>{row['Stock']}: {row['Combined Score']}</span>", unsafe_allow_html=True) | |
# Second column for detailed financial ratios and company information | |
with col2: | |
st.subheader("Stock Details") | |
# Dropdown to select stock for details | |
ticker_symbol = st.selectbox('Select a stock for details', options=sp500_list) | |
if ticker_symbol: | |
with st.spinner(f'Fetching data for {ticker_symbol}...'): | |
stock_data, info = fetch_stock_data(ticker_symbol) | |
comparison, _ = compare_to_index(stock_data, sp500_averages) | |
# Display company name and description | |
st.write(f"**{info.get('longName')}**") | |
st.write(info.get('longBusinessSummary')) | |
# Display financial ratios in a table | |
st.table(pd.DataFrame.from_dict(stock_data, orient='index', columns=['Value'])) | |