niyaa's picture
Update app.py
dc87a8c
import streamlit as st
import yfinance as yf
import pandas as pd
import cufflinks as cf
import datetime
import plotly.graph_objects as go
from bs4 import BeautifulSoup
import requests
import os
from datetime import date, timedelta
from transformers import pipeline
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from contextlib import redirect_stdout
from io import StringIO
def scrapper (start_date):
d0 = start_date
d1 = datetime.date(2008, 1, 1)
delta = d0 - d1
#st.write(delta)
Begindatestring = start_date
val = 39448 + int(delta.days)
url = 'https://economictimes.indiatimes.com/archivelist/year-'+str(Begindatestring.year)+',month-'+str(Begindatestring.month)+',starttime-'+str(val)+'.cms' # Replace with your URL
response = requests.get(url)
if response.status_code == 200:
html_text = response.text
soup = BeautifulSoup(html_text, "lxml")
else:
gg=0
jobs = soup.find_all("li")
headlines = []
for job in jobs:
try:
target_element = job.find("a")
target_element.text
headlines.append(target_element.text)
except:
continue
return headlines
# App title
st.markdown('''
# Sovrenn Market Sentiment Indicator App
Shown are the stock price data for the selected company!
**Credits**
- App built by SRL
''')
st.write('---')
# Sidebar
st.sidebar.subheader('Query parameters')
start_date = st.sidebar.date_input("Start date", datetime.date(2023,9, 20))
#start_date = start_date - datetime.timedelta(days=1)
end_date = start_date + datetime.timedelta(days=14)
# User input for the stock ticker symbol
tickerSymbol = st.sidebar.text_input('Enter Stock Ticker Symbol')
if tickerSymbol:
try:
tickerData = yf.Ticker(tickerSymbol) # Get ticker data
tickerDf = tickerData.history(period='1d', start=start_date, end=end_date) # Get the historical prices for this ticker
string_name = tickerData.info.get('longName', 'Company Name Not Available')
st.header('**%s**' % string_name)
# Try to get the business summary, handle KeyError if not available
try:
string_summary = tickerData.info['longBusinessSummary']
st.info(string_summary)
except KeyError:
st.warning("Business summary not available for this company.")
# Ticker data
st.header('**Ticker data**')
st.write(tickerDf)
# Create a candlestick chart and volume bar chart
fig_candlestick = go.Figure(data=[go.Candlestick(x=tickerDf.index,
open=tickerDf['Open'],
high=tickerDf['High'],
low=tickerDf['Low'],
close=tickerDf['Close'])])
fig_volume = go.Figure(data=[go.Bar(x=tickerDf.index, y=tickerDf['Volume'])])
st.header('**Candlestick Chart**')
st.plotly_chart(fig_candlestick)
st.header('**Volume Bar Chart**')
st.plotly_chart(fig_volume)
st.write(start_date)
tickerDf = pd.DataFrame(tickerDf).reset_index()
# st.write(tickerDf)
#date = datetime.date(start_date)
date_str = start_date.strftime("%Y-%m-%d")
#st.write(date_str)
df = tickerDf[tickerDf["Date"]==date_str]
#st.write(df)
if (df["Close"][0] > df["Open"][0] ):
st.write("NSE has uptrend on " +date_str )
if (df["Close"][0] < df["Open"][0] ):
st.write(" NSE has downdtrend on " +date_str )
except:
st.write("Stock Data of this Index on the selected Date is not available \n")
Begindatestring = start_date
# Create a dummy stream to suppress output
dummy_stream = StringIO()
with redirect_stdout(dummy_stream):
headlines = scrapper(start_date)
index = [idx for idx, s in enumerate(headlines) if s=='Most Read' ][0]
del headlines[index:]
news = pd.DataFrame({"News": headlines})
news.insert(0, 'Date', Begindatestring)
news = news.drop_duplicates()
news = news.dropna(how='any')
news = news.reset_index(drop=True)
tokenizer = AutoTokenizer.from_pretrained("nickmuchi/sec-bert-finetuned-finance-classification")
model = AutoModelForSequenceClassification.from_pretrained("nickmuchi/sec-bert-finetuned-finance-classification")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
nlp = pipeline("text-classification", model=model, tokenizer=tokenizer, device=device)
length = len(news[ 'News'].to_list())
news_list = news[ 'News'].to_list()
df = pd.DataFrame()
for i in range (0, length):
results = nlp(news_list[i])
df.loc[i, "News"] = news_list[i]
df.loc[i , 'label'] = results[0]["label"]
df.loc[i , 'score'] = results[0]["score"]
if(i%100 ==0): st.write("Articles Processed Number "+ str(i))
bullish_rows = df[df['label'] == 'bullish']
bullish_score_sum = bullish_rows['score'].sum()
num_bullish_rows = len(bullish_rows)
average_score_for_bullish = bullish_score_sum / num_bullish_rows
bearish_rows = df[df['label'] == 'bearish']
bearish_score_sum = bearish_rows['score'].sum()
num_bearish_rows = len(bearish_rows)
average_score_for_bearish = bearish_score_sum / num_bearish_rows
if(average_score_for_bearish > average_score_for_bullish):
st.write("Stock will go down")
if(average_score_for_bearish < average_score_for_bullish):
st.write("Stock will go up")
else:
st.warning("Please enter a valid Stock Ticker Symbol.")