File size: 2,122 Bytes
ef94dec |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
from stock_data_loader import StockDataLoader
import streamlit as st
import pandas as pd
import yfinance as yf
from datetime import datetime
from plots import Plots, StockChart
class StockDashboard:
def __init__(self):
self.tickers = ['NVDA', 'AAPL', 'GOOGL', 'MSFT', 'AMZN']
self.period_map = {'all': 'max','1m': '1mo', '6m': '6mo', '1y': '1y'}
def render_sidebar(self):
st.sidebar.header("Choose your filter:")
self.ticker = st.sidebar.selectbox('Choose Ticker', options=self.tickers, help='Select a ticker')
self.selected_range = st.sidebar.selectbox('Select Period', options=list(self.period_map.keys()))
def load_data(self):
self.yf_data = yf.Ticker(self.ticker)
self.df_history = self.yf_data.history(period=self.period_map[self.selected_range])
self.current_price = self.yf_data.info.get('currentPrice', 'N/A')
self.previous_close = self.yf_data.info.get('previousClose', 'N/A')
def display_header(self):
company_name = self.yf_data.info['shortName']
symbol = self.yf_data.info['symbol']
st.subheader(f'{company_name} ({symbol}) 💰')
st.divider()
if self.current_price != 'N/A' and self.previous_close != 'N/A':
price_change = self.current_price - self.previous_close
price_change_ratio = (abs(price_change) / self.previous_close * 100)
price_change_direction = "+" if price_change > 0 else "-"
st.metric(label='Current Price', value=f"{self.current_price:.2f}",
delta=f"{price_change:.2f} ({price_change_direction}{price_change_ratio:.2f}%)")
def plot_data(self):
chart = StockChart(self.df_history)
chart.add_price_chart()
chart.add_oversold_overbought_lines()
chart.add_volume_chart()
chart.render_chart()
def run(self):
st.write("--------------------------------------------")
self.render_sidebar()
self.load_data()
self.display_header()
self.plot_data()
|