DagonGod / app.py
ratulsur's picture
Update app.py
48e7af3 verified
import streamlit as st
import yfinance as yf
import pandas as pd
import time
# 🎯 Define Indian Indices
indian_indices = {
"NIFTY 50": "^NSEI",
"SENSEX": "^BSESN",
"BANK NIFTY": "^NSEBANK",
"NIFTY IT": "^CNXIT",
"NIFTY PHARMA": "^CNXPHARMA",
"NIFTY AUTO": "^CNXAUTO",
"NIFTY FMCG": "^CNXFMCG",
"NIFTY METAL": "^CNXMETAL",
"NIFTY ENERGY": "^CNXENERGY",
"NIFTY REALTY": "^CNXREALTY",
"NIFTY INFRA": "^CNXINFRA",
"NIFTY MEDIA": "^CNXMEDIA",
"NIFTY PSU BANK": "^CNXPSUBANK",
}
# πŸ”Ή More Extensive List of Sector Stocks
sector_stocks = {
"IT": [
"TCS.NS", "INFY.NS", "HCLTECH.NS", "TECHM.NS", "WIPRO.NS", "LTIM.NS", "COFORGE.NS", "PERSISTENT.NS",
"MINDTREE.NS", "MPHASIS.NS", "OFSS.NS", "CYIENT.NS", "ZENSARTECH.NS"
],
"Banking & Finance": [
"HDFCBANK.NS", "ICICIBANK.NS", "SBIN.NS", "AXISBANK.NS", "KOTAKBANK.NS", "IDFCFIRSTB.NS", "PNB.NS",
"BANDHANBNK.NS", "FEDERALBNK.NS", "RBLBANK.NS", "YESBANK.NS", "INDUSINDBK.NS", "CANBK.NS"
],
"Energy & Oil": [
"RELIANCE.NS", "ONGC.NS", "POWERGRID.NS", "NTPC.NS", "BPCL.NS", "IOC.NS", "GAIL.NS", "TATAPOWER.NS",
"JSWENERGY.NS", "NHPC.NS", "ADANIENERGY.NS", "ADANIGREEN.NS", "ADANITRANS.NS"
],
"Automobile": [
"TATAMOTORS.NS", "M&M.NS", "MARUTI.NS", "HEROMOTOCO.NS", "EICHERMOT.NS", "BAJAJ-AUTO.NS", "TVSMOTOR.NS",
"ASHOKLEY.NS", "ESCORTS.NS", "SMLISUZU.NS", "FORCEMOT.NS", "BOSCHLTD.NS", "AMARAJABAT.NS"
],
"Consumer Goods": [
"HINDUNILVR.NS", "ITC.NS", "NESTLEIND.NS", "BRITANNIA.NS", "TITAN.NS", "DABUR.NS", "MARICO.NS",
"COLPAL.NS", "GODREJCP.NS", "EMAMILTD.NS", "BAJAJCON.NS", "RADICO.NS", "HATSUN.NS"
],
"Metals & Mining": [
"TATASTEEL.NS", "HINDALCO.NS", "JSWSTEEL.NS", "COALINDIA.NS", "VEDL.NS", "SAIL.NS", "NALCO.NS",
"MOIL.NS", "HINDZINC.NS", "APLAPOLLO.NS", "JINDALSTEL.NS", "GODAWARI.NS", "SHYAMMETL.NS"
],
"Pharmaceuticals": [
"SUNPHARMA.NS", "DRREDDY.NS", "CIPLA.NS", "DIVISLAB.NS", "LUPIN.NS", "AUROPHARMA.NS", "BIOCON.NS",
"TORNTPHARM.NS", "ABBOTINDIA.NS", "GLENMARK.NS", "ZYDUSLIFE.NS", "ALKEM.NS", "IPCALAB.NS"
],
"Infrastructure & Realty": [
"LT.NS", "ULTRACEMCO.NS", "SHREECEM.NS", "GRASIM.NS", "DLF.NS", "GODREJPROP.NS", "PHOENIXLTD.NS",
"OBEROIRLTY.NS", "IBREALEST.NS", "NCC.NS", "SOBHA.NS", "BRIGADE.NS", "PRESTIGE.NS"
]
}
# πŸ“Œ Streamlit Page Configuration
st.set_page_config(page_title="πŸ“ˆ Live Indian Stock Market", layout="wide")
st.title("πŸ“ˆ Live Indian Stock Market Dashboard")
# 🏦 Index Selection
selected_index = st.selectbox("Select an Index", list(indian_indices.keys()))
index_ticker = indian_indices[selected_index]
# πŸ”Ή Sector Selection
selected_sector = st.selectbox("Select a Sector", list(sector_stocks.keys()))
sector_tickers = sector_stocks[selected_sector]
# πŸ“Š Function to Fetch Live Data with Error Handling
def fetch_live_data(ticker):
try:
stock = yf.Ticker(ticker)
live_data = stock.history(period="1d", interval="1m")
return live_data
except yf.YFRateLimitError:
st.warning("⚠️ Yahoo Finance rate limit reached. Retrying after 30 seconds...")
time.sleep(30) # Wait before retrying
return None
except Exception as e:
st.error(f"⚠️ Error fetching data for {ticker}: {e}")
return None
# πŸ“Š Fetch Live Data for Index
st.subheader(f"πŸ“Š Live Price for {selected_index}")
live_price_placeholder = st.empty()
# πŸ“ˆ Fetch Live Data for Sector Stocks
st.subheader(f"πŸ“ˆ Live Sector-Wise Stock Data ({selected_sector})")
sector_table_placeholder = st.empty()
# πŸš€ Continuous Live Streaming Using Loop
while True:
try:
# Fetch Live Index Data
live_data = fetch_live_data(index_ticker)
if live_data is not None and not live_data.empty:
latest_price = live_data["Close"].iloc[-1]
# βœ… FIX: Get previous close safely
historical_data = yf.Ticker(index_ticker).history(period="2d")
previous_close = historical_data["Close"].iloc[-2] if len(historical_data) > 1 else latest_price
price_change = latest_price - previous_close
percentage_change = (price_change / previous_close) * 100
live_price_placeholder.metric(
f"{selected_index} Live Price",
f"β‚Ή{latest_price:.2f}",
f"{price_change:.2f} ({percentage_change:.2f}%)",
delta_color="inverse" if price_change < 0 else "normal"
)
# Fetch Live Data for Sector Stocks
sector_data = []
for stock in sector_tickers:
stock_info = fetch_live_data(stock)
if stock_info is not None and not stock_info.empty:
latest_price = stock_info["Close"].iloc[-1]
# βœ… FIX: Get previous close safely
historical_data = yf.Ticker(stock).history(period="2d")
prev_close = historical_data["Close"].iloc[-2] if len(historical_data) > 1 else latest_price
price_change = latest_price - prev_close
percentage_change = (price_change / prev_close) * 100
sector_data.append({
"Stock": stock,
"Price (β‚Ή)": latest_price,
"Change (β‚Ή)": price_change,
"Change (%)": f"{percentage_change:.2f}%",
})
# Convert to DataFrame & Display
if sector_data:
df = pd.DataFrame(sector_data)
sector_table_placeholder.dataframe(df, height=400)
# βœ… Refresh Every **10 Seconds**
time.sleep(10)
except Exception as e:
st.error(f"⚠️ Unexpected error: {e}")
time.sleep(10) # Prevent app from breaking and wait before retrying