NandanData commited on
Commit
c6f6cbb
·
verified ·
1 Parent(s): d21a46b

error fixed for date issue

Browse files
Files changed (1) hide show
  1. dashboard.py +247 -221
dashboard.py CHANGED
@@ -1,221 +1,247 @@
1
- import yfinance as yf
2
- import pandas as pd
3
- import streamlit as st
4
- from datetime import datetime, timedelta
5
-
6
- # Fetch Nifty 50 tickers
7
- def fetch_nifty50_tickers():
8
- return [
9
- "TATAMOTORS.NS", "RELIANCE.NS", "INFY.NS", "HDFCBANK.NS", "ICICIBANK.NS",
10
- "SBIN.NS", "ITC.NS", "AXISBANK.NS", "MARUTI.NS", "TATASTEEL.NS",
11
- "WIPRO.NS", "SUNPHARMA.NS", "HINDALCO.NS", "HCLTECH.NS", "NTPC.NS",
12
- "L&T.NS", "M&M.NS", "ONGC.NS", "HDFCLIFE.NS", "ULTRACEMCO.NS",
13
- "ADANIGREEN.NS", "BHARTIARTL.NS", "BAJAJFINSV.NS", "JSWSTEEL.NS", "DIVISLAB.NS",
14
- "POWERGRID.NS", "KOTAKBANK.NS", "HINDUNILVR.NS", "TCS.NS", "CIPLA.NS",
15
- "ASIANPAINT.NS", "GRASIM.NS", "BRITANNIA.NS", "SHREECEM.NS",
16
- "TECHM.NS", "INDUSINDBK.NS", "EICHERMOT.NS", "COALINDIA.NS", "GAIL.NS",
17
- "BOSCHLTD.NS", "M&MFIN.NS", "IDFCFIRSTB.NS", "HAVELLS.NS"
18
- ]
19
-
20
- # Fetch large cap tickers
21
- def fetch_large_cap_tickers():
22
- return fetch_nifty50_tickers() # Assuming large caps are the same as Nifty 50
23
-
24
- # Fetch small cap tickers
25
- def fetch_small_cap_tickers():
26
- return [
27
- "ALOKINDS.NS", "ADANIENT.NS", "AARTIIND.NS", "AVANTIFEED.NS", "BLS.IN",
28
- "BHEL.NS", "BIRLACORP.NS", "CARBORUNIV.NS", "CENTRALBANK.NS", "EMAMILTD.NS",
29
- "FDC.NS", "GLAXO.NS", "GODFRYPHLP.NS", "GSKCONS.NS", "HAVELLS.NS",
30
- "HEMIPAPER.NS", "HIL.NS", "JINDALSAW.NS", "JUBLFOOD.NS", "KOTAKMAH.NS",
31
- "MSTCLAS.NS", "NCC.NS", "PAGEIND.NS", "PIIND.NS", "SBI.CN",
32
- "SISL.NS", "SOMANYCERA.NS", "STAR.NS", "SUNDARAM.NS", "TATAINVEST.NS",
33
- "VSTIND.NS", "WABCOINDIA.NS", "WELCORP.NS", "ZEELEARN.NS", "ZOMATO.NS"
34
- ]
35
-
36
- # Get top movers
37
- def get_top_movers(tickers, days=1):
38
- end_date = datetime.now()
39
- start_date = end_date - timedelta(days=days)
40
-
41
- data = {}
42
- for ticker in tickers:
43
- try:
44
- df = yf.download(ticker, start=start_date, end=end_date)
45
- if not df.empty and 'Close' in df.columns:
46
- df['Ticker'] = ticker
47
- data[ticker] = df['Close'].pct_change().iloc[-1] # Percentage change
48
- except Exception as e:
49
- st.error(f"Error fetching data for {ticker}: {e}")
50
-
51
- sorted_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
52
- top_gainers = sorted_data[:10]
53
- top_losers = sorted_data[-10:]
54
-
55
- return top_gainers, top_losers
56
-
57
- # Format DataFrame with color
58
- def format_df(df):
59
- if not df.empty:
60
- df['Percentage Change'] = pd.to_numeric(df['Percentage Change'], errors='coerce')
61
- return df.style.applymap(lambda x: 'color: green' if x > 0 else 'color: red', subset=['Percentage Change'])
62
- return df
63
-
64
- # Display dashboard
65
- def display_dashboard():
66
- st.header("Dashboard")
67
-
68
- # Fetch tickers
69
- nifty50_tickers = fetch_nifty50_tickers()
70
- large_cap_tickers = fetch_large_cap_tickers()
71
- small_cap_tickers = fetch_small_cap_tickers()
72
-
73
- # Get top gainers and losers
74
- top_gainers_nifty50, top_losers_nifty50 = get_top_movers(nifty50_tickers)
75
- top_gainers_large_cap, top_losers_large_cap = get_top_movers(large_cap_tickers)
76
- top_gainers_small_cap, top_losers_small_cap = get_top_movers(small_cap_tickers)
77
-
78
- # Create columns for tables
79
- col1, col2, col3, col4 = st.columns(4)
80
-
81
- with col1:
82
- st.write("### Nifty 50 Top Gainers")
83
- if top_gainers_nifty50:
84
- df_gainers_nifty50 = pd.DataFrame(top_gainers_nifty50, columns=['Ticker', 'Percentage Change'])
85
- st.dataframe(format_df(df_gainers_nifty50))
86
-
87
- with col2:
88
- st.write("### Nifty 50 Top Losers")
89
- if top_losers_nifty50:
90
- df_losers_nifty50 = pd.DataFrame(top_losers_nifty50, columns=['Ticker', 'Percentage Change'])
91
- st.dataframe(format_df(df_losers_nifty50))
92
-
93
- with col3:
94
- st.write("### Large Cap Top Gainers")
95
- if top_gainers_large_cap:
96
- df_gainers_large_cap = pd.DataFrame(top_gainers_large_cap, columns=['Ticker', 'Percentage Change'])
97
- st.dataframe(format_df(df_gainers_large_cap))
98
-
99
- with col4:
100
- st.write("### Large Cap Top Losers")
101
- if top_losers_large_cap:
102
- df_losers_large_cap = pd.DataFrame(top_losers_large_cap, columns=['Ticker', 'Percentage Change'])
103
- st.dataframe(format_df(df_losers_large_cap))
104
-
105
- # Fetch and display stock profile
106
- def fetch_stock_profile(ticker):
107
- try:
108
- stock = yf.Ticker(ticker)
109
- info = stock.info
110
-
111
- profile = {
112
- "Name": info.get('shortName', 'N/A'),
113
- "Current Price": f"₹ {info.get('currentPrice', 'N/A')}",
114
- "Market Cap": f"₹ {info.get('marketCap', 'N/A') / 1e7:.2f} Cr.",
115
- "P/E Ratio": info.get('forwardEps', 'N/A'),
116
- "Book Value": info.get('bookValue', 'N/A'),
117
- "Dividend Yield": info.get('dividendYield', 'N/A'),
118
- "ROCE": info.get('returnOnCapitalEmployed', 'N/A'),
119
- "ROE": info.get('returnOnEquity', 'N/A'),
120
- "Face Value": info.get('faceValue', 'N/A')
121
- }
122
- return profile
123
- except Exception as e:
124
- st.error(f"Error fetching profile for {ticker}: {e}")
125
- return {}
126
-
127
-
128
-
129
-
130
- # Display stock profile as a table
131
- def display_profile(profile):
132
- st.subheader("Stock Profile")
133
- profile_df = pd.DataFrame([profile])
134
- st.table(profile_df)
135
-
136
- # Fetch and display quarterly results
137
- def display_quarterly_results(ticker):
138
- st.subheader("Quarterly Results Summary")
139
- try:
140
- stock = yf.Ticker(ticker)
141
- financials = stock.quarterly_financials.T
142
- if not financials.empty:
143
- results = {
144
- 'Sales': financials['Total Revenue'].iloc[-1] if 'Total Revenue' in financials.columns else 'N/A',
145
- 'Operating Profit Margin': financials['Operating Income'].iloc[-1] if 'Operating Income' in financials.columns else 'N/A',
146
- 'Net Profit': financials['Net Income'].iloc[-1] if 'Net Income' in financials.columns else 'N/A'
147
- }
148
- results_df = pd.DataFrame([results])
149
- st.table(results_df)
150
- else:
151
- st.write("No quarterly results available.")
152
- except Exception as e:
153
- st.write(f"Error fetching quarterly results: {e}")
154
-
155
- # Fetch and display shareholding pattern
156
- def display_shareholding_pattern(ticker):
157
- st.subheader("Shareholding Pattern")
158
-
159
- # Placeholder values; replace with actual data source or API call
160
- data = {
161
- 'Category': ['Promoters', 'FIIs (Foreign Institutional Investors)', 'DIIs (Domestic Institutional Investors)', 'Public'],
162
- 'Holding (%)': [45.0, 20.0, 15.0, 20.0]
163
- }
164
-
165
- df = pd.DataFrame(data)
166
- st.table(df)
167
-
168
-
169
- def display_financial_ratios(ticker):
170
- st.subheader("Financial Ratios")
171
- stock = yf.Ticker(ticker)
172
-
173
- try:
174
- # Placeholder values, calculate actual values based on your requirements
175
- ratios = {
176
- 'Debtor Days': 73,
177
- 'Working Capital Days': 194,
178
- 'Cash Conversion Cycle': 51
179
- }
180
- ratios_df = pd.DataFrame([ratios])
181
- st.table(ratios_df)
182
- except Exception as e:
183
- st.write("Error fetching financial ratios:", e)
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
-
195
-
196
-
197
-
198
-
199
-
200
-
201
- # Main application
202
- # def main():
203
- # st.title("Stock Analysis Dashboard")
204
-
205
- # # Select ticker input
206
- # ticker = st.text_input("Enter Stock Ticker (e.g., TATAMOTORS.NS)")
207
-
208
- # if ticker:
209
- # profile = fetch_stock_profile(ticker)
210
- # if profile:
211
- # display_profile(profile)
212
-
213
- # display_quarterly_results(ticker)
214
- # display_shareholding_pattern(ticker)
215
-
216
- # # Show dashboard
217
- # if st.button("Show Dashboard"):
218
- # display_dashboard()
219
-
220
- # if __name__ == "__main__":
221
- # main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import yfinance as yf
2
+ import pandas as pd
3
+ import streamlit as st
4
+ from datetime import datetime, timedelta
5
+
6
+ # Fetch Nifty 50 tickers
7
+ def fetch_nifty50_tickers():
8
+ return [
9
+ "TATAMOTORS.NS", "RELIANCE.NS", "INFY.NS", "HDFCBANK.NS", "ICICIBANK.NS",
10
+ "SBIN.NS", "ITC.NS", "AXISBANK.NS", "MARUTI.NS", "TATASTEEL.NS",
11
+ "WIPRO.NS", "SUNPHARMA.NS", "HINDALCO.NS", "HCLTECH.NS", "NTPC.NS",
12
+ "L&T.NS", "M&M.NS", "ONGC.NS", "HDFCLIFE.NS", "ULTRACEMCO.NS",
13
+ "ADANIGREEN.NS", "BHARTIARTL.NS", "BAJAJFINSV.NS", "JSWSTEEL.NS", "DIVISLAB.NS",
14
+ "POWERGRID.NS", "KOTAKBANK.NS", "HINDUNILVR.NS", "TCS.NS", "CIPLA.NS",
15
+ "ASIANPAINT.NS", "GRASIM.NS", "BRITANNIA.NS", "SHREECEM.NS",
16
+ "TECHM.NS", "INDUSINDBK.NS", "EICHERMOT.NS", "COALINDIA.NS", "GAIL.NS",
17
+ "BOSCHLTD.NS", "M&MFIN.NS", "IDFCFIRSTB.NS", "HAVELLS.NS"
18
+ ]
19
+
20
+ # Fetch large cap tickers
21
+ def fetch_large_cap_tickers():
22
+ return fetch_nifty50_tickers() # Assuming large caps are the same as Nifty 50
23
+
24
+ # Fetch small cap tickers
25
+ def fetch_small_cap_tickers():
26
+ return [
27
+ "ALOKINDS.NS", "ADANIENT.NS", "AARTIIND.NS", "AVANTIFEED.NS", "BLS.IN",
28
+ "BHEL.NS", "BIRLACORP.NS", "CARBORUNIV.NS", "CENTRALBANK.NS", "EMAMILTD.NS",
29
+ "FDC.NS", "GLAXO.NS", "GODFRYPHLP.NS", "GSKCONS.NS", "HAVELLS.NS",
30
+ "HEMIPAPER.NS", "HIL.NS", "JINDALSAW.NS", "JUBLFOOD.NS", "KOTAKMAH.NS",
31
+ "MSTCLAS.NS", "NCC.NS", "PAGEIND.NS", "PIIND.NS", "SBI.CN",
32
+ "SISL.NS", "SOMANYCERA.NS", "STAR.NS", "SUNDARAM.NS", "TATAINVEST.NS",
33
+ "VSTIND.NS", "WABCOINDIA.NS", "WELCORP.NS", "ZEELEARN.NS", "ZOMATO.NS"
34
+ ]
35
+
36
+ # Get top movers
37
+ # def get_top_movers(tickers, days=1):
38
+ # end_date = datetime.now()
39
+ # start_date = end_date - timedelta(days=days)
40
+
41
+ # data = {}
42
+ # for ticker in tickers:
43
+ # try:
44
+ # df = yf.download(ticker, start=start_date, end=end_date)
45
+ # if not df.empty and 'Close' in df.columns:
46
+ # df['Ticker'] = ticker
47
+ # data[ticker] = df['Close'].pct_change().iloc[-1] # Percentage change
48
+ # except Exception as e:
49
+ # st.error(f"Error fetching data for {ticker}: {e}")
50
+
51
+ # sorted_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
52
+ # top_gainers = sorted_data[:10]
53
+ # top_losers = sorted_data[-10:]
54
+
55
+ # return top_gainers, top_losers
56
+
57
+
58
+ def get_top_movers(tickers, days=5):
59
+ import yfinance as yf
60
+ data = {}
61
+
62
+ for ticker in tickers:
63
+ try:
64
+ df = yf.download(ticker, period=f"{days}d")
65
+ if not df.empty:
66
+ # compute % change from first to last close
67
+ pct_change = ((df['Close'].iloc[-1] - df['Close'].iloc[0]) / df['Close'].iloc[0]) * 100
68
+ data[ticker] = pct_change
69
+ except Exception as e:
70
+ print(f"Error fetching {ticker}: {e}")
71
+
72
+ # Now each value is a scalar float
73
+ sorted_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
74
+
75
+ top_gainers = sorted_data[:5]
76
+ top_losers = sorted_data[-5:]
77
+
78
+ return top_gainers, top_losers
79
+
80
+
81
+ # Format DataFrame with color
82
+ def format_df(df):
83
+ if not df.empty:
84
+ df['Percentage Change'] = pd.to_numeric(df['Percentage Change'], errors='coerce')
85
+ return df.style.applymap(lambda x: 'color: green' if x > 0 else 'color: red', subset=['Percentage Change'])
86
+ return df
87
+
88
+ # Display dashboard
89
+ def display_dashboard():
90
+ st.header("Dashboard")
91
+
92
+ # Fetch tickers
93
+ nifty50_tickers = fetch_nifty50_tickers()
94
+ large_cap_tickers = fetch_large_cap_tickers()
95
+ small_cap_tickers = fetch_small_cap_tickers()
96
+
97
+ # Get top gainers and losers
98
+ top_gainers_nifty50, top_losers_nifty50 = get_top_movers(nifty50_tickers)
99
+ top_gainers_large_cap, top_losers_large_cap = get_top_movers(large_cap_tickers)
100
+ top_gainers_small_cap, top_losers_small_cap = get_top_movers(small_cap_tickers)
101
+
102
+ # Create columns for tables
103
+ col1, col2, col3, col4 = st.columns(4)
104
+
105
+ with col1:
106
+ st.write("### Nifty 50 Top Gainers")
107
+ if top_gainers_nifty50:
108
+ df_gainers_nifty50 = pd.DataFrame(top_gainers_nifty50, columns=['Ticker', 'Percentage Change'])
109
+ st.dataframe(format_df(df_gainers_nifty50))
110
+
111
+ with col2:
112
+ st.write("### Nifty 50 Top Losers")
113
+ if top_losers_nifty50:
114
+ df_losers_nifty50 = pd.DataFrame(top_losers_nifty50, columns=['Ticker', 'Percentage Change'])
115
+ st.dataframe(format_df(df_losers_nifty50))
116
+
117
+ with col3:
118
+ st.write("### Large Cap Top Gainers")
119
+ if top_gainers_large_cap:
120
+ df_gainers_large_cap = pd.DataFrame(top_gainers_large_cap, columns=['Ticker', 'Percentage Change'])
121
+ st.dataframe(format_df(df_gainers_large_cap))
122
+
123
+ with col4:
124
+ st.write("### Large Cap Top Losers")
125
+ if top_losers_large_cap:
126
+ df_losers_large_cap = pd.DataFrame(top_losers_large_cap, columns=['Ticker', 'Percentage Change'])
127
+ st.dataframe(format_df(df_losers_large_cap))
128
+
129
+ # Fetch and display stock profile
130
+ def fetch_stock_profile(ticker):
131
+ try:
132
+ stock = yf.Ticker(ticker)
133
+ info = stock.info
134
+
135
+ profile = {
136
+ "Name": info.get('shortName', 'N/A'),
137
+ "Current Price": f"₹ {info.get('currentPrice', 'N/A')}",
138
+ "Market Cap": f"₹ {info.get('marketCap', 'N/A') / 1e7:.2f} Cr.",
139
+ "P/E Ratio": info.get('forwardEps', 'N/A'),
140
+ "Book Value": info.get('bookValue', 'N/A'),
141
+ "Dividend Yield": info.get('dividendYield', 'N/A'),
142
+ "ROCE": info.get('returnOnCapitalEmployed', 'N/A'),
143
+ "ROE": info.get('returnOnEquity', 'N/A'),
144
+ "Face Value": info.get('faceValue', 'N/A')
145
+ }
146
+ return profile
147
+ except Exception as e:
148
+ st.error(f"Error fetching profile for {ticker}: {e}")
149
+ return {}
150
+
151
+
152
+
153
+
154
+ # Display stock profile as a table
155
+ def display_profile(profile):
156
+ st.subheader("Stock Profile")
157
+ profile_df = pd.DataFrame([profile])
158
+ st.table(profile_df)
159
+
160
+ # Fetch and display quarterly results
161
+ def display_quarterly_results(ticker):
162
+ st.subheader("Quarterly Results Summary")
163
+ try:
164
+ stock = yf.Ticker(ticker)
165
+ financials = stock.quarterly_financials.T
166
+ if not financials.empty:
167
+ results = {
168
+ 'Sales': financials['Total Revenue'].iloc[-1] if 'Total Revenue' in financials.columns else 'N/A',
169
+ 'Operating Profit Margin': financials['Operating Income'].iloc[-1] if 'Operating Income' in financials.columns else 'N/A',
170
+ 'Net Profit': financials['Net Income'].iloc[-1] if 'Net Income' in financials.columns else 'N/A'
171
+ }
172
+ results_df = pd.DataFrame([results])
173
+ st.table(results_df)
174
+ else:
175
+ st.write("No quarterly results available.")
176
+ except Exception as e:
177
+ st.write(f"Error fetching quarterly results: {e}")
178
+
179
+ # Fetch and display shareholding pattern
180
+ def display_shareholding_pattern(ticker):
181
+ st.subheader("Shareholding Pattern")
182
+
183
+ # Placeholder values; replace with actual data source or API call
184
+ data = {
185
+ 'Category': ['Promoters', 'FIIs (Foreign Institutional Investors)', 'DIIs (Domestic Institutional Investors)', 'Public'],
186
+ 'Holding (%)': [45.0, 20.0, 15.0, 20.0]
187
+ }
188
+
189
+ df = pd.DataFrame(data)
190
+ st.table(df)
191
+
192
+
193
+ def display_financial_ratios(ticker):
194
+ st.subheader("Financial Ratios")
195
+ stock = yf.Ticker(ticker)
196
+
197
+ try:
198
+ # Placeholder values, calculate actual values based on your requirements
199
+ ratios = {
200
+ 'Debtor Days': 73,
201
+ 'Working Capital Days': 194,
202
+ 'Cash Conversion Cycle': 51
203
+ }
204
+ ratios_df = pd.DataFrame([ratios])
205
+ st.table(ratios_df)
206
+ except Exception as e:
207
+ st.write("Error fetching financial ratios:", e)
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+ # Main application
226
+ # def main():
227
+ # st.title("Stock Analysis Dashboard")
228
+
229
+ # # Select ticker input
230
+ # ticker = st.text_input("Enter Stock Ticker (e.g., TATAMOTORS.NS)")
231
+
232
+ # if ticker:
233
+ # profile = fetch_stock_profile(ticker)
234
+ # if profile:
235
+ # display_profile(profile)
236
+
237
+ # display_quarterly_results(ticker)
238
+ # display_shareholding_pattern(ticker)
239
+
240
+ # # Show dashboard
241
+ # if st.button("Show Dashboard"):
242
+ # display_dashboard()
243
+
244
+ # if __name__ == "__main__":
245
+ # main()
246
+
247
+