import json import streamlit as st import pandas as pd import yfinance as yf import matplotlib.pyplot as plt import requests url_stocks = "https://financialmodelingprep.com/api/v3/stock/list?apikey=" url_sentiment = "https://yaakovy-fin-proj-docker.hf.space/ticker/" url_timeGpt = "https://ofirmatzlawi-fin-proj-docker-1.hf.space/ticker/" url_forecast_eod = "https://yaakovy-lasthourforcast.hf.space/ticker/" url_forecast_eod24 = "https://ofirmatzlawi-fin-proj-docker-2.hf.space/ticker/" def get_max_sentiment(row): if row["sentiment_score"] > 0.05: # Threshold for positive sentiment return "positive" elif row["sentiment_score"] < -0.05: # Threshold for negative sentiment return "negative" else: return "neutral" def get_sentiment_data(stock_info): symbol = stock_info.info['symbol'] url_sentiment_with_ticker = f"{url_sentiment}{symbol}" response = requests.get(url_sentiment_with_ticker) if response.status_code == 200: json_data = json.loads(response.json()) df = pd.DataFrame(json_data) df['sentiment'] = df.apply(get_max_sentiment, axis=1) df = df.drop(['neg', 'neu', 'pos', 'sentiment_score'], axis=1) return df else: return def print_sentiment(stock_info): df = get_sentiment_data(stock_info) #st.write("Market Sentiment") st.dataframe(df, hide_index =True ) return df def get_eod_forecast24(stock_info): symbol = stock_info.info['symbol'] url_forecast_eod_with_ticker = f"{url_forecast_eod24}{symbol}" response = requests.get(url_forecast_eod_with_ticker) if response.status_code == 200: eod_forecast = json.loads(response.json()) #st.write(json_data) #eod_forecast = json_data["latest_prediction"] return eod_forecast else: return def get_eod_forecast(stock_info): symbol = stock_info.info['symbol'] url_forecast_eod_with_ticker = f"{url_forecast_eod}{symbol}" response = requests.get(url_forecast_eod_with_ticker) if response.status_code == 200: json_data = json.loads(response.json()) eod_forecast = json_data["latest_prediction"] return eod_forecast else: return def print_sentiment_summery(df) : column_name = "sentiment" category_counts = df[column_name].value_counts() df_sentiment = pd.DataFrame({ "Sentiment": category_counts.index, "Count": category_counts.values }) st.dataframe(df_sentiment, hide_index =True ) return df_sentiment def print_stock_info(stock_info): stock_info_html = get_stock_info_from_html(stock_info.info) st.write(stock_info_html, unsafe_allow_html=True) plot_graph(stock_info) col1, col2 = st.columns([0.8, 0.2]) with col1: st.pyplot(plt) with col2: tf = st.radio( "Select Time Frame", ["1Y", "3Y", "5Y", "10Y"], index=2, key="chart_time_frame", ) def get_stock_info_from_html(stock_info): si = stock_info text = (f"Comp. Name: {si['longName']}, {si['city']}, {si.get('state', '')} {si['country']}
" f"Web site: {si['website']}
" f"Stock Price: {si['currentPrice']} {str(si['financialCurrency'])}") return text def get_forecast_html(stock_info): currentPrice = stock_info.info['currentPrice'] eod_forecast = get_eod_forecast(stock_info) eod_forecast_price = currentPrice * (1 + eod_forecast/100) color = 'red' if eod_forecast < 0 else 'green' mark = '+' if eod_forecast >= 0 else '-' eod_forecast_p = abs(round(eod_forecast, 2)) html = (f"Current Price: {stock_info.info['currentPrice']}
" f"EOD Close Price: {eod_forecast_price:.2f} {mark}{eod_forecast_p}% ") return html def get_forecast_html24(stock_info): currentPrice = stock_info.info['currentPrice'] eod_forecast = get_eod_forecast24(stock_info) eod_forecast_price = currentPrice * (1 + eod_forecast/100) color = 'red' if eod_forecast < 0 else 'green' mark = '+' if eod_forecast >= 0 else '-' eod_forecast_p = abs(round(eod_forecast, 2)) html = (f"EOD Tomorrow Close Price: {eod_forecast_price:.2f} {mark}{eod_forecast_p}% ") return html def plot_graph(stock_info): period = st.session_state.chart_time_frame or "5Y" history = stock_info.history(period=period) name = stock_info.info['longName'] plt.plot(history['Close']) plt.xlabel('Date') plt.ylabel('Price') plt.title(f"{name} Stock Price") return plt def print_timeGpt(stock_info): symbol = stock_info.info['symbol'] url_timeGpt_with_ticker = f"{url_timeGpt}{symbol}" response = requests.get(url_timeGpt_with_ticker) if response.status_code == 200: json_data = json.loads(response.json()) #st.write(json_data) json_data = json.loads(response.json()) data = json_data["data"] converted_data = [] for row in data: converted_data.append({"Date": row[0], "TimeGPT": row[1]}) df = pd.DataFrame(converted_data) st.dataframe(df) return df else: return st.set_page_config(page_title="Senty Sense") st.markdown( """ """.format( padding_top=1, padding_bottom=1 ), unsafe_allow_html=True, ) st.title('_SentySense_') #PriceProphet, Sentyment, Trendsetter Bullseye par1 = "Our stock market platform gives you real-time data, historical insights, and in-depth news to help you make informed investment decisions." st.write(par1, unsafe_allow_html=True) if 'chart_time_frame' not in st.session_state: st.session_state['chart_time_frame'] = '5Y' if 'data_available' not in st.session_state: st.session_state['data_available'] = False option = 'Stocks' #st.selectbox("select", ["", "Currencies", "Stocks"], placeholder="Choose an option", label_visibility = "hidden") if option == "Currencies": input_text = "Enter currency pair" else: input_text = "Enter stock symbol" text_box: str = None btn_get_data = None if option: text_box = st.text_input(input_text) with st.spinner('Wait for it...'): if text_box: ticker = text_box.upper() try: stock_info = yf.Ticker(ticker) long_name = stock_info.info['longName'] st.write(f"

{long_name}

", unsafe_allow_html=True) except: st.error('Ticker not found', icon="🚨") st.session_state['data_available'] = False else: st.session_state['data_available'] = True print_stock_info(stock_info) st.write(f"

Market Sentiment

", unsafe_allow_html=True) df = print_sentiment(stock_info) st.write(f"
Sentiment summery
", unsafe_allow_html=True) print_sentiment_summery(df) st.write(f"

Forecasting

", unsafe_allow_html=True) st.write(get_forecast_html(stock_info), unsafe_allow_html=True) st.write(get_forecast_html24(stock_info), unsafe_allow_html=True)