DagonGod / data_loader.py
ratulsur's picture
Upload 5 files
a5b6c6b verified
import yfinance as yf
import pandas as pd
import streamlit as st
from datetime import datetime, timedelta
import io
@st.cache_data(ttl=3600)
def load_nifty50_symbols():
"""Load Nifty 50 symbols"""
symbols = [
# IT Sector
"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",
# Telecommunications
"BHARTIARTL.NS",
# Others
"ASIANPAINT.NS", "HDFCLIFE.NS", "SBILIFE.NS", "UPL.NS", "ADANIENT.NS",
"BAJAJ-AUTO.NS", "APOLLOHOSP.NS", "DMART.NS", "PIDILITIND.NS"
]
return symbols
@st.cache_data(ttl=3600)
def load_market_indices():
"""Load major Indian market indices"""
indices = {
"NIFTY 50": "^NSEI",
"SENSEX": "^BSESN",
"BANK NIFTY": "^NSEBANK",
"NIFTY IT": "NIFTYIT.NS",
"NIFTY PHARMA": "NIFTYPHARMA.NS",
"NIFTY AUTO": "NIFTYAUTO.NS",
"NIFTY FMCG": "NIFTYFMCG.NS",
"NIFTY METAL": "NIFTYMETAL.NS",
"BSE 500": "^BSEFTY",
"NSE 500": "NIFTY500.NS"
}
return indices
def process_uploaded_file(uploaded_file):
"""Process uploaded CSV/Excel file"""
try:
if uploaded_file.name.endswith('.csv'):
df = pd.read_csv(uploaded_file)
elif uploaded_file.name.endswith(('.xls', '.xlsx')):
df = pd.read_excel(uploaded_file)
else:
raise ValueError("Unsupported file format")
# Ensure required columns exist
required_columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
if not all(col in df.columns for col in required_columns):
raise ValueError("Missing required columns")
# Convert Date column to datetime
df['Date'] = pd.to_datetime(df['Date'])
return df
except Exception as e:
st.error(f"Error processing file: {str(e)}")
return None
@st.cache_data(ttl=3600)
def fetch_stock_data(symbol, period='1y'):
"""Fetch stock data from Yahoo Finance"""
try:
stock = yf.Ticker(symbol)
data = stock.history(period=period)
return data
except Exception as e:
st.error(f"Error fetching data for {symbol}: {str(e)}")
return None
@st.cache_data(ttl=3600)
def get_stock_info(symbol):
"""Get stock information"""
try:
stock = yf.Ticker(symbol)
info = stock.info
return {
'name': info.get('longName', symbol),
'sector': info.get('sector', 'N/A'),
'market_cap': info.get('marketCap', 0),
'pe_ratio': info.get('trailingPE', 0),
'volume': info.get('volume', 0),
'recommendation': info.get('recommendationKey', 'N/A'),
'target_price': info.get('targetMeanPrice', 0)
}
except Exception as e:
st.error(f"Error fetching info for {symbol}: {str(e)}")
return None
def get_market_summary():
"""Get market summary for indices"""
try:
indices = load_market_indices()
summaries = {}
for name, symbol in indices.items():
ticker = yf.Ticker(symbol)
data = ticker.history(period='1d')
if not data.empty:
summaries[name] = {
'index_value': data['Close'].iloc[-1],
'change': data['Close'].iloc[-1] - data['Open'].iloc[0],
'change_percent': ((data['Close'].iloc[-1] - data['Open'].iloc[0]) / data['Open'].iloc[0]) * 100
}
return summaries
except Exception as e:
st.error(f"Error fetching market summary: {str(e)}")
return None
def get_stock_suggestions(data):
"""Generate stock suggestions based on technical indicators"""
try:
# Simple moving averages
data['SMA20'] = data['Close'].rolling(window=20).mean()
data['SMA50'] = data['Close'].rolling(window=50).mean()
# Get latest values
current_price = data['Close'].iloc[-1]
sma20 = data['SMA20'].iloc[-1]
sma50 = data['SMA50'].iloc[-1]
# Generate suggestion
if sma20 > sma50:
trend = "BULLISH"
suggestion = "Consider buying. Price is above moving averages."
elif sma20 < sma50:
trend = "BEARISH"
suggestion = "Consider selling. Price is below moving averages."
else:
trend = "NEUTRAL"
suggestion = "Market is sideways. Wait for clear trend."
return {
'trend': trend,
'suggestion': suggestion,
'current_price': current_price,
'sma20': sma20,
'sma50': sma50
}
except Exception as e:
st.error(f"Error generating suggestions: {str(e)}")
return None