import streamlit as st
import plotly.graph_objects as go
import pandas as pd # Added import statement for pandas
from utils.data_loader import load_nifty50_symbols, fetch_stock_data, get_stock_info
st.title("Market Overview")
# Create sector categories
sectors = {
"IT": ["TCS.NS", "INFY.NS", "HCLTECH.NS", "TECHM.NS", "WIPRO.NS"],
"Banking & Finance": ["HDFCBANK.NS", "ICICIBANK.NS", "SBIN.NS", "AXISBANK.NS", "KOTAKBANK.NS",
"BAJFINANCE.NS", "BAJAJFINSV.NS", "HDFC.NS", "INDUSINDBK.NS"],
"Energy & Oil": ["RELIANCE.NS", "ONGC.NS", "POWERGRID.NS", "NTPC.NS", "BPCL.NS"],
"Automobile": ["TATAMOTORS.NS", "M&M.NS", "MARUTI.NS", "HEROMOTOCO.NS", "EICHERMOT.NS"],
"Consumer Goods": ["HINDUNILVR.NS", "ITC.NS", "NESTLEIND.NS", "BRITANNIA.NS", "TITAN.NS"],
"Metals & Mining": ["TATASTEEL.NS", "HINDALCO.NS", "JSWSTEEL.NS", "COALINDIA.NS"],
"Pharmaceuticals": ["SUNPHARMA.NS", "DRREDDY.NS", "CIPLA.NS", "DIVISLAB.NS"],
"Infrastructure": ["LT.NS", "ADANIPORTS.NS", "ULTRACEMCO.NS", "SHREECEM.NS", "GRASIM.NS"],
"Others": ["BHARTIARTL.NS", "ASIANPAINT.NS", "HDFCLIFE.NS", "SBILIFE.NS", "UPL.NS",
"ADANIENT.NS", "BAJAJ-AUTO.NS", "APOLLOHOSP.NS", "DMART.NS", "PIDILITIND.NS"]
}
# Sector selection
selected_sector = st.selectbox("Select Sector", list(sectors.keys()))
# Load data for selected sector
cols = st.columns(3)
# Market Movers for selected sector
with cols[0]:
st.subheader("Top Gainers")
gainers_data = []
for symbol in sectors[selected_sector]:
data = fetch_stock_data(symbol, period='1d')
if data is not None:
change = ((data['Close'][-1] - data['Open'][0]) / data['Open'][0]) * 100
info = get_stock_info(symbol)
company_name = info['name'] if info else symbol
gainers_data.append({
'Company': company_name,
'Symbol': symbol,
'Change%': change
})
# Sort gainers by change percentage
gainers_data = sorted(gainers_data, key=lambda x: x['Change%'], reverse=True)[:3]
st.dataframe(pd.DataFrame(gainers_data))
with cols[1]:
st.subheader("Top Losers")
losers_data = []
for symbol in sectors[selected_sector]:
data = fetch_stock_data(symbol, period='1d')
if data is not None:
change = ((data['Close'][-1] - data['Open'][0]) / data['Open'][0]) * 100
info = get_stock_info(symbol)
company_name = info['name'] if info else symbol
losers_data.append({
'Company': company_name,
'Symbol': symbol,
'Change%': change
})
# Sort losers by change percentage
losers_data = sorted(losers_data, key=lambda x: x['Change%'])[:3]
st.dataframe(pd.DataFrame(losers_data))
with cols[2]:
st.subheader("Most Active")
active_data = []
for symbol in sectors[selected_sector]:
info = get_stock_info(symbol)
if info:
active_data.append({
'Company': info['name'],
'Symbol': symbol,
'Volume': info['volume']
})
# Sort by volume
active_data = sorted(active_data, key=lambda x: x['Volume'], reverse=True)[:3]
st.dataframe(pd.DataFrame(active_data))
# Sector Performance Heat Map
st.subheader(f"{selected_sector} Performance Heat Map")
heat_map_data = []
for symbol in sectors[selected_sector]:
data = fetch_stock_data(symbol, period='1d')
info = get_stock_info(symbol)
if data is not None and info:
change = ((data['Close'][-1] - data['Open'][0]) / data['Open'][0]) * 100
heat_map_data.append({
'Company': info['name'],
'Symbol': symbol,
'Change%': change,
'Market Cap': info['market_cap'],
'Volume': info['volume']
})
if heat_map_data:
fig = go.Figure(data=[go.Treemap(
labels=[f"{d['Company']}
{d['Symbol']}" for d in heat_map_data],
parents=[''] * len(heat_map_data),
values=[d['Market Cap'] for d in heat_map_data],
textinfo="label+value+percent",
marker=dict(
colors=[d['Change%'] for d in heat_map_data],
colorscale='RdYlGn',
showscale=True
),
hovertemplate="""
Company: %{label}
Change: %{color:.2f}%
Market Cap: ₹%{value:,.0f}
"""
)])
fig.update_layout(title=f"{selected_sector} Companies Heat Map")
st.plotly_chart(fig, use_container_width=True)
# Detailed Sector Analysis
st.subheader(f"{selected_sector} Companies")
detailed_data = []
for symbol in sectors[selected_sector]:
info = get_stock_info(symbol)
if info:
detailed_data.append({
'Company': info['name'],
'Symbol': symbol,
'Market Cap (Cr)': info['market_cap'] / 10000000, # Convert to Crores
'P/E Ratio': info['pe_ratio'],
'Volume': info['volume'],
'Recommendation': info['recommendation'],
'Target Price': info['target_price']
})
if detailed_data:
st.dataframe(pd.DataFrame(detailed_data))