| """Financial Analysis Dashboard - Main Application.""" |
|
|
| import streamlit as st |
| from dotenv import load_dotenv |
| import os |
|
|
| from styles import DARK_THEME_CSS |
| from data import ( |
| load_stock_data, |
| load_company_profile, |
| load_income_statement, |
| calculate_technical_indicators, |
| get_price_metrics, |
| ) |
| from charts import ( |
| create_price_chart, |
| create_rsi_chart, |
| create_financial_chart, |
| ) |
| from ui import ( |
| display_price_metrics, |
| display_company_info, |
| display_financial_metrics, |
| display_income_statement, |
| display_profitability_metrics, |
| ) |
|
|
|
|
| |
| load_dotenv() |
| token = os.getenv("TOKEN") |
|
|
| st.set_page_config( |
| page_title="Financial Dashboard", |
| page_icon="π", |
| layout="wide", |
| initial_sidebar_state="expanded", |
| menu_items={ |
| "About": "A professional financial analysis dashboard with technical indicators" |
| } |
| ) |
|
|
| |
| st.markdown(DARK_THEME_CSS, unsafe_allow_html=True) |
|
|
| |
| st.markdown("# π Financial Analysis Dashboard") |
| st.markdown("Real-time technical analysis with multiple indicators") |
|
|
| |
| with st.sidebar: |
| st.markdown("## βοΈ Settings") |
| symbol = st.text_input("Stock Ticker", "AAPL", help="Enter a valid stock ticker symbol").upper() |
| period = st.slider("Indicator Period", 5, 50, 20, help="Period for SMA, EMA, and RSI calculations") |
|
|
| st.markdown("---") |
| st.markdown("### About") |
| st.info("This dashboard provides real-time technical analysis with comprehensive financial metrics.") |
|
|
|
|
| def main(): |
| """Main application logic.""" |
| if st.button("οΏ½οΏ½ Load Dashboard", key="load_btn", use_container_width=True): |
| try: |
| |
| with st.spinner("Loading data..."): |
| df = load_stock_data(symbol) |
| profile_info = load_company_profile(symbol) |
| income_stmt = load_income_statement(symbol) |
|
|
| |
| df = calculate_technical_indicators(df, period) |
|
|
| |
| metrics = get_price_metrics(df) |
| display_price_metrics(metrics) |
|
|
| |
| display_company_info(profile_info) |
|
|
| |
| if not income_stmt.empty: |
| display_financial_metrics(income_stmt) |
|
|
| |
| st.markdown('<div class="section-title">π Revenue & Net Income Trend</div>', unsafe_allow_html=True) |
| income_chart_data = income_stmt[['period_ending', 'total_revenue', 'net_income']].dropna() |
|
|
| if len(income_chart_data) > 0: |
| fig_financial = create_financial_chart(income_chart_data) |
| st.plotly_chart(fig_financial, use_container_width=True) |
|
|
| |
| tab1, tab2, tab3, tab4 = st.tabs([ |
| "π Price & Moving Averages", |
| "π RSI Indicator", |
| "π TradingView", |
| "π Financials" |
| ]) |
|
|
| |
| with tab1: |
| fig_price = create_price_chart(df, symbol, period) |
| st.plotly_chart(fig_price, use_container_width=True) |
|
|
| |
| with tab2: |
| fig_rsi = create_rsi_chart(df, symbol) |
| st.plotly_chart(fig_rsi, use_container_width=True) |
|
|
| |
| with tab3: |
| tradingview_html = f""" |
| <div class="tradingview-widget-container"> |
| <div id="tradingview_{symbol}"></div> |
| <script type="text/javascript" src="https://s3.tradingview.com/tv.js"></script> |
| <script type="text/javascript"> |
| new TradingView.widget({{ |
| "width": "100%", |
| "height": 600, |
| "symbol": "{symbol}", |
| "interval": "D", |
| "timezone": "Etc/UTC", |
| "theme": "dark", |
| "style": "1", |
| "locale": "en", |
| "enable_publishing": false, |
| "allow_symbol_change": true, |
| "container_id": "tradingview_{symbol}" |
| }}); |
| </script> |
| </div> |
| """ |
| st.components.v1.html(tradingview_html, height=650) |
|
|
| |
| with tab4: |
| if not income_stmt.empty: |
| display_income_statement(income_stmt) |
| display_profitability_metrics(income_stmt) |
|
|
| except Exception as e: |
| st.error(f"Error loading data for {symbol}: {str(e)}") |
| st.info("Please check the ticker symbol and try again.") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|