ratulsur commited on
Commit
48e7af3
Β·
verified Β·
1 Parent(s): 965b48a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +140 -30
app.py CHANGED
@@ -1,37 +1,147 @@
1
  import streamlit as st
 
 
 
2
 
3
- # Page Configuration
4
- st.set_page_config(
5
- page_title="Indian Stock Market Dashboard",
6
- page_icon="πŸ“ˆ",
7
- layout="wide"
8
- )
9
-
10
- st.title("πŸ“Š Indian Stock Market Dashboard")
11
-
12
- st.sidebar.title("Navigation")
13
- page = st.sidebar.radio(
14
- "Choose a Section",
15
- [
16
- "Market Overview",
17
- "Candlestick Patterns",
18
- "Stock Predictions",
19
- "Quantum Market Analysis"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  ]
21
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
- if page == "Market Overview":
24
- from pages.market_overview import run_market_overview
25
- run_market_overview()
 
 
 
26
 
27
- elif page == "Candlestick Patterns":
28
- from pages.candlestick_patterns import run_candlestick_analysis
29
- run_candlestick_analysis()
 
30
 
31
- elif page == "Stock Predictions":
32
- from pages.stock_predictions import run_stock_predictions
33
- run_stock_predictions()
34
 
35
- elif page == "Quantum Market Analysis":
36
- from pages.quantum_market_analysis import run_quantum_market_analysis
37
- run_quantum_market_analysis()
 
1
  import streamlit as st
2
+ import yfinance as yf
3
+ import pandas as pd
4
+ import time
5
 
6
+ # 🎯 Define Indian Indices
7
+ indian_indices = {
8
+ "NIFTY 50": "^NSEI",
9
+ "SENSEX": "^BSESN",
10
+ "BANK NIFTY": "^NSEBANK",
11
+ "NIFTY IT": "^CNXIT",
12
+ "NIFTY PHARMA": "^CNXPHARMA",
13
+ "NIFTY AUTO": "^CNXAUTO",
14
+ "NIFTY FMCG": "^CNXFMCG",
15
+ "NIFTY METAL": "^CNXMETAL",
16
+ "NIFTY ENERGY": "^CNXENERGY",
17
+ "NIFTY REALTY": "^CNXREALTY",
18
+ "NIFTY INFRA": "^CNXINFRA",
19
+ "NIFTY MEDIA": "^CNXMEDIA",
20
+ "NIFTY PSU BANK": "^CNXPSUBANK",
21
+ }
22
+
23
+ # πŸ”Ή More Extensive List of Sector Stocks
24
+ sector_stocks = {
25
+ "IT": [
26
+ "TCS.NS", "INFY.NS", "HCLTECH.NS", "TECHM.NS", "WIPRO.NS", "LTIM.NS", "COFORGE.NS", "PERSISTENT.NS",
27
+ "MINDTREE.NS", "MPHASIS.NS", "OFSS.NS", "CYIENT.NS", "ZENSARTECH.NS"
28
+ ],
29
+ "Banking & Finance": [
30
+ "HDFCBANK.NS", "ICICIBANK.NS", "SBIN.NS", "AXISBANK.NS", "KOTAKBANK.NS", "IDFCFIRSTB.NS", "PNB.NS",
31
+ "BANDHANBNK.NS", "FEDERALBNK.NS", "RBLBANK.NS", "YESBANK.NS", "INDUSINDBK.NS", "CANBK.NS"
32
+ ],
33
+ "Energy & Oil": [
34
+ "RELIANCE.NS", "ONGC.NS", "POWERGRID.NS", "NTPC.NS", "BPCL.NS", "IOC.NS", "GAIL.NS", "TATAPOWER.NS",
35
+ "JSWENERGY.NS", "NHPC.NS", "ADANIENERGY.NS", "ADANIGREEN.NS", "ADANITRANS.NS"
36
+ ],
37
+ "Automobile": [
38
+ "TATAMOTORS.NS", "M&M.NS", "MARUTI.NS", "HEROMOTOCO.NS", "EICHERMOT.NS", "BAJAJ-AUTO.NS", "TVSMOTOR.NS",
39
+ "ASHOKLEY.NS", "ESCORTS.NS", "SMLISUZU.NS", "FORCEMOT.NS", "BOSCHLTD.NS", "AMARAJABAT.NS"
40
+ ],
41
+ "Consumer Goods": [
42
+ "HINDUNILVR.NS", "ITC.NS", "NESTLEIND.NS", "BRITANNIA.NS", "TITAN.NS", "DABUR.NS", "MARICO.NS",
43
+ "COLPAL.NS", "GODREJCP.NS", "EMAMILTD.NS", "BAJAJCON.NS", "RADICO.NS", "HATSUN.NS"
44
+ ],
45
+ "Metals & Mining": [
46
+ "TATASTEEL.NS", "HINDALCO.NS", "JSWSTEEL.NS", "COALINDIA.NS", "VEDL.NS", "SAIL.NS", "NALCO.NS",
47
+ "MOIL.NS", "HINDZINC.NS", "APLAPOLLO.NS", "JINDALSTEL.NS", "GODAWARI.NS", "SHYAMMETL.NS"
48
+ ],
49
+ "Pharmaceuticals": [
50
+ "SUNPHARMA.NS", "DRREDDY.NS", "CIPLA.NS", "DIVISLAB.NS", "LUPIN.NS", "AUROPHARMA.NS", "BIOCON.NS",
51
+ "TORNTPHARM.NS", "ABBOTINDIA.NS", "GLENMARK.NS", "ZYDUSLIFE.NS", "ALKEM.NS", "IPCALAB.NS"
52
+ ],
53
+ "Infrastructure & Realty": [
54
+ "LT.NS", "ULTRACEMCO.NS", "SHREECEM.NS", "GRASIM.NS", "DLF.NS", "GODREJPROP.NS", "PHOENIXLTD.NS",
55
+ "OBEROIRLTY.NS", "IBREALEST.NS", "NCC.NS", "SOBHA.NS", "BRIGADE.NS", "PRESTIGE.NS"
56
  ]
57
+ }
58
+
59
+ # πŸ“Œ Streamlit Page Configuration
60
+ st.set_page_config(page_title="πŸ“ˆ Live Indian Stock Market", layout="wide")
61
+
62
+ st.title("πŸ“ˆ Live Indian Stock Market Dashboard")
63
+
64
+ # 🏦 Index Selection
65
+ selected_index = st.selectbox("Select an Index", list(indian_indices.keys()))
66
+ index_ticker = indian_indices[selected_index]
67
+
68
+ # πŸ”Ή Sector Selection
69
+ selected_sector = st.selectbox("Select a Sector", list(sector_stocks.keys()))
70
+ sector_tickers = sector_stocks[selected_sector]
71
+
72
+ # πŸ“Š Function to Fetch Live Data with Error Handling
73
+ def fetch_live_data(ticker):
74
+ try:
75
+ stock = yf.Ticker(ticker)
76
+ live_data = stock.history(period="1d", interval="1m")
77
+ return live_data
78
+ except yf.YFRateLimitError:
79
+ st.warning("⚠️ Yahoo Finance rate limit reached. Retrying after 30 seconds...")
80
+ time.sleep(30) # Wait before retrying
81
+ return None
82
+ except Exception as e:
83
+ st.error(f"⚠️ Error fetching data for {ticker}: {e}")
84
+ return None
85
+
86
+ # πŸ“Š Fetch Live Data for Index
87
+ st.subheader(f"πŸ“Š Live Price for {selected_index}")
88
+ live_price_placeholder = st.empty()
89
+
90
+ # πŸ“ˆ Fetch Live Data for Sector Stocks
91
+ st.subheader(f"πŸ“ˆ Live Sector-Wise Stock Data ({selected_sector})")
92
+ sector_table_placeholder = st.empty()
93
+
94
+ # πŸš€ Continuous Live Streaming Using Loop
95
+ while True:
96
+ try:
97
+ # Fetch Live Index Data
98
+ live_data = fetch_live_data(index_ticker)
99
+ if live_data is not None and not live_data.empty:
100
+ latest_price = live_data["Close"].iloc[-1]
101
+
102
+ # βœ… FIX: Get previous close safely
103
+ historical_data = yf.Ticker(index_ticker).history(period="2d")
104
+ previous_close = historical_data["Close"].iloc[-2] if len(historical_data) > 1 else latest_price
105
+
106
+ price_change = latest_price - previous_close
107
+ percentage_change = (price_change / previous_close) * 100
108
+
109
+ live_price_placeholder.metric(
110
+ f"{selected_index} Live Price",
111
+ f"β‚Ή{latest_price:.2f}",
112
+ f"{price_change:.2f} ({percentage_change:.2f}%)",
113
+ delta_color="inverse" if price_change < 0 else "normal"
114
+ )
115
+
116
+ # Fetch Live Data for Sector Stocks
117
+ sector_data = []
118
+ for stock in sector_tickers:
119
+ stock_info = fetch_live_data(stock)
120
+ if stock_info is not None and not stock_info.empty:
121
+ latest_price = stock_info["Close"].iloc[-1]
122
+
123
+ # βœ… FIX: Get previous close safely
124
+ historical_data = yf.Ticker(stock).history(period="2d")
125
+ prev_close = historical_data["Close"].iloc[-2] if len(historical_data) > 1 else latest_price
126
+
127
+ price_change = latest_price - prev_close
128
+ percentage_change = (price_change / prev_close) * 100
129
 
130
+ sector_data.append({
131
+ "Stock": stock,
132
+ "Price (β‚Ή)": latest_price,
133
+ "Change (β‚Ή)": price_change,
134
+ "Change (%)": f"{percentage_change:.2f}%",
135
+ })
136
 
137
+ # Convert to DataFrame & Display
138
+ if sector_data:
139
+ df = pd.DataFrame(sector_data)
140
+ sector_table_placeholder.dataframe(df, height=400)
141
 
142
+ # βœ… Refresh Every **10 Seconds**
143
+ time.sleep(10)
 
144
 
145
+ except Exception as e:
146
+ st.error(f"⚠️ Unexpected error: {e}")
147
+ time.sleep(10) # Prevent app from breaking and wait before retrying