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))