Download app.py from riteshcp/R2: direct link, hf CLI and curl.
- Browser
- Download file 10.7 kB
-
https://huggingface.co/spaces/riteshcp/R2/resolve/main/app.py
- Command line
-
hf download hf://spaces/riteshcp/R2/app.py
-
curl -L -o app.py https://huggingface.co/spaces/riteshcp/R2/resolve/main/app.py
10.7 kB
| # app.py | |
| import streamlit as st | |
| import pandas as pd | |
| import yfinance as yf | |
| import numpy as np | |
| import time | |
| import os | |
| st.title('RSI स्कैनर - भारतीय स्टॉक्स') | |
| # 'ind_nifty500list.csv' फ़ाइल को पढ़ें | |
| csv_file_path = 'ind_nifty500list.csv' # सुनिश्चित करें कि यह फ़ाइल आपके Hugging Face Space में है | |
| # चेक करें कि फ़ाइल मौजूद है | |
| if not os.path.isfile(csv_file_path): | |
| st.error("स्टॉक सूची फ़ाइल नहीं मिली। कृपया 'ind_nifty500list.csv' फ़ाइल को अपलोड करें।") | |
| else: | |
| # CSV फ़ाइल को DataFrame में पढ़ें | |
| stock_df = pd.read_csv(csv_file_path) | |
| # आवश्यक कॉलम मौजूद हैं या नहीं | |
| required_columns = {'Symbol', 'Company Name'} | |
| if not required_columns.issubset(stock_df.columns): | |
| st.error(f"CSV फ़ाइल में निम्नलिखित कॉलम होने चाहिए: {required_columns}") | |
| else: | |
| # उपयोगकर्ता इनपुट के लिए साइडबार बनाएं | |
| st.sidebar.header('स्कैनर सेटिंग्स') | |
| period_options = ['1mo', '3mo', '6mo', '1y'] | |
| selected_period = st.sidebar.selectbox('डेटा अवधि चुनें', period_options, index=2) | |
| rsi_lower_threshold = st.sidebar.slider('RSI निचली सीमा', min_value=0, max_value=50, value=25) | |
| rsi_upper_threshold = st.sidebar.slider('RSI ऊपरी सीमा', min_value=50, max_value=100, value=75) | |
| # साप्ताहिक RSI जोड़ने का विकल्प | |
| st.sidebar.header('RSI सेटिंग्स') | |
| rsi_timeframe = st.sidebar.selectbox('RSI टाइमफ़्रेम चुनें', ['Daily', 'Weekly']) | |
| st.write("RSI और अन्य तकनीकी संकेतकों की गणना की जा रही है। कृपया प्रतीक्षा करें...") | |
| # प्रगति बार | |
| progress_bar = st.progress(0) | |
| total_stocks = len(stock_df) | |
| stocks_rsi_below = [] | |
| stocks_rsi_above = [] | |
| def get_stock_data(symbol, period, interval): | |
| # स्टॉक डेटा डाउनलोड करें | |
| return yf.download(symbol, period=period, interval=interval, progress=False) | |
| def get_stock_info(symbol): | |
| # स्टॉक की जानकारी प्राप्त करें | |
| ticker = yf.Ticker(symbol) | |
| info = ticker.info | |
| industry = info.get('industry', 'N/A') | |
| market_cap = info.get('marketCap', 'N/A') | |
| return industry, market_cap | |
| # RSI के लिए इंटरवल सेट करें | |
| if rsi_timeframe == 'Daily': | |
| interval = '1d' | |
| else: | |
| interval = '1wk' | |
| for idx, row in stock_df.iterrows(): | |
| company_name = row['Company Name'] | |
| symbol = row['Symbol'] | |
| # यदि आवश्यक हो तो '.NS' जोड़ें | |
| if not symbol.endswith('.NS') and not symbol.endswith('.BO'): | |
| symbol += '.NS' | |
| try: | |
| # स्टॉक डेटा प्राप्त करें (कैश किया गया) | |
| data = get_stock_data(symbol, selected_period, interval) | |
| if data.empty: | |
| continue | |
| # RSI की गणना करें | |
| delta = data['Close'].diff() | |
| up = delta.clip(lower=0) | |
| down = -delta.clip(upper=0) | |
| roll_up = up.rolling(window=14).mean() | |
| roll_down = down.rolling(window=14).mean() | |
| RS = roll_up / roll_down | |
| data['RSI'] = 100.0 - (100.0 / (1.0 + RS)) | |
| latest_rsi = data['RSI'].iloc[-1] | |
| # Industry और Market Cap प्राप्त करें | |
| industry, market_cap = get_stock_info(symbol) | |
| # Market Cap को करोड़ों में बदलें | |
| if market_cap != 'N/A': | |
| market_cap = round(market_cap / 1e7, 2) # करोड़ों में | |
| # RSI मान के आधार पर स्टॉक्स को वर्गीकृत करें | |
| if latest_rsi < rsi_lower_threshold: | |
| stocks_rsi_below.append({ | |
| 'Company Name': company_name, | |
| 'Symbol': symbol, | |
| 'Industry': industry, | |
| 'Market Cap (करोड़ों में)': market_cap, | |
| 'RSI': round(latest_rsi, 2) | |
| }) | |
| elif latest_rsi > rsi_upper_threshold: | |
| stocks_rsi_above.append({ | |
| 'Company Name': company_name, | |
| 'Symbol': symbol, | |
| 'Industry': industry, | |
| 'Market Cap (करोड़ों में)': market_cap, | |
| 'RSI': round(latest_rsi, 2) | |
| }) | |
| except Exception as e: | |
| st.write(f"{symbol} के लिए त्रुटि: {e}") | |
| continue | |
| progress_bar.progress((idx + 1) / total_stocks) | |
| # परिणामों को DataFrame में परिवर्तित करें | |
| df_below = pd.DataFrame(stocks_rsi_below) | |
| df_above = pd.DataFrame(stocks_rsi_above) | |
| # उपयोगकर्ता से एक स्टॉक चुनने का विकल्प | |
| st.sidebar.header('स्टॉक विवरण देखें') | |
| all_companies = stock_df['Company Name'].tolist() | |
| # जब उपयोगकर्ता स्टॉक सूची में से क्लिक करें तो चयन करें | |
| selected_company = st.sidebar.selectbox('कंपनी चुनें', [''] + all_companies) | |
| st.subheader(f"RSI {rsi_lower_threshold} से कम वाले स्टॉक्स") | |
| if not df_below.empty: | |
| # प्रत्येक स्टॉक के लिए बटन जोड़ें | |
| for idx, row in df_below.iterrows(): | |
| st.write(f"{row['Company Name']} ({row['Symbol']}) - RSI: {row['RSI']}") | |
| if st.button(f"विवरण देखें - {row['Company Name']}", key=f"below_{idx}"): | |
| selected_company = row['Company Name'] | |
| # डाउनलोड बटन | |
| csv_below = df_below.to_csv(index=False).encode('utf-8') | |
| st.download_button( | |
| label=f"RSI {rsi_lower_threshold} से कम वाले स्टॉक्स को CSV में डाउनलोड करें", | |
| data=csv_below, | |
| file_name=f'stocks_rsi_below_{rsi_lower_threshold}.csv', | |
| mime='text/csv' | |
| ) | |
| else: | |
| st.write("कोई स्टॉक्स नहीं मिले।") | |
| st.subheader(f"RSI {rsi_upper_threshold} से अधिक वाले स्टॉक्स") | |
| if not df_above.empty: | |
| # प्रत्येक स्टॉक के लिए बटन जोड़ें | |
| for idx, row in df_above.iterrows(): | |
| st.write(f"{row['Company Name']} ({row['Symbol']}) - RSI: {row['RSI']}") | |
| if st.button(f"विवरण देखें - {row['Company Name']}", key=f"above_{idx}"): | |
| selected_company = row['Company Name'] | |
| # डाउनलोड बटन | |
| csv_above = df_above.to_csv(index=False).encode('utf-8') | |
| st.download_button( | |
| label=f"RSI {rsi_upper_threshold} से अधिक वाले स्टॉक्स को CSV में डाउनलोड करें", | |
| data=csv_above, | |
| file_name=f'stocks_rsi_above_{rsi_upper_threshold}.csv', | |
| mime='text/csv' | |
| ) | |
| else: | |
| st.write("कोई स्टॉक्स नहीं मिले।") | |
| if selected_company: | |
| symbol = stock_df.loc[stock_df['Company Name'] == selected_company, 'Symbol'].values[0] | |
| if not symbol.endswith('.NS') and not symbol.endswith('.BO'): | |
| symbol += '.NS' | |
| data = get_stock_data(symbol, selected_period, interval) | |
| if not data.empty: | |
| # RSI की गणना करें | |
| delta = data['Close'].diff() | |
| up = delta.clip(lower=0) | |
| down = -delta.clip(upper=0) | |
| roll_up = up.rolling(window=14).mean() | |
| roll_down = down.rolling(window=14).mean() | |
| RS = roll_up / roll_down | |
| data['RSI'] = 100.0 - (100.0 / (1.0 + RS)) | |
| # MACD की गणना करें | |
| exp1 = data['Close'].ewm(span=12, adjust=False).mean() | |
| exp2 = data['Close'].ewm(span=26, adjust=False).mean() | |
| data['MACD'] = exp1 - exp2 | |
| data['Signal Line'] = data['MACD'].ewm(span=9, adjust=False).mean() | |
| # OBV की गणना करें | |
| data['OBV'] = (np.sign(data['Close'].diff()) * data['Volume']).fillna(0).cumsum() | |
| # चार्ट प्रदर्शित करें | |
| st.subheader(f"{selected_company} ({symbol}) के तकनीकी संकेतक") | |
| # RSI चार्ट | |
| st.write("**RSI**") | |
| st.line_chart(data['RSI'], height=200) | |
| # MACD चार्ट | |
| st.write("**MACD**") | |
| st.line_chart(data[['MACD', 'Signal Line']], height=200) | |
| # OBV चार्ट | |
| st.write("**On-Balance Volume (OBV)**") | |
| st.line_chart(data['OBV'], height=200) | |
| # डेटा टेबल दिखाएं | |
| st.write("**डेटा टेबल**") | |
| st.write(data[['Close', 'RSI', 'MACD', 'Signal Line', 'OBV']].tail(30)) | |