import streamlit as st import pandas as pd import numpy as np import plotly.graph_objects as go import plotly.express as px from datetime import datetime, timedelta import json # Custom CSS with Tailwind-like utilities def load_css(): st.markdown(""" """, unsafe_allow_html=True) class FinancialDashboard: def __init__(self): self.risk_analyzer = FinancialRiskAnalyzer() load_css() def run(self): st.set_page_config( page_title="Financial Risk Analysis Dashboard", page_icon="📊", layout="wide" ) # Sidebar self.create_sidebar() # Main dashboard st.title("📊 Financial Risk Analysis Dashboard") # Load sample or uploaded data financial_data = self.load_financial_data() if financial_data: # Generate risk report risk_report = self.risk_analyzer.generate_risk_report(financial_data) # Display dashboard components self.display_risk_summary(risk_report) self.display_detailed_metrics(risk_report) self.display_risk_charts(financial_data, risk_report) self.display_recommendations(risk_report) def create_sidebar(self): with st.sidebar: st.title("Controls & Filters") # Date range selector st.subheader("Date Range") start_date = st.date_input( "Start Date", datetime.now() - timedelta(days=30) ) end_date = st.date_input( "End Date", datetime.now() ) # Risk threshold adjustments st.subheader("Risk Thresholds") leverage_threshold = st.slider( "Leverage Ratio Threshold", min_value=10.0, max_value=50.0, value=30.0 ) npl_threshold = st.slider( "NPL Ratio Threshold (%)", min_value=1.0, max_value=10.0, value=5.0 ) / 100 # Export options st.subheader("Export Options") if st.button("Export Report (PDF)"): st.info("Generating PDF report...") # Add PDF export functionality if st.button("Export Data (Excel)"): st.info("Generating Excel file...") # Add Excel export functionality def load_financial_data(self): # File upload option uploaded_file = st.file_uploader( "Upload financial data (JSON/CSV)", type=["json", "csv"] ) if uploaded_file: try: if uploaded_file.type == "application/json": return json.load(uploaded_file) else: df = pd.read_csv(uploaded_file) return df.to_dict() except Exception as e: st.error(f"Error loading file: {str(e)}") return None # Use sample data if no file uploaded return self.get_sample_data() def display_risk_summary(self, risk_report): st.subheader("Risk Summary") # Create three columns for key metrics col1, col2, col3 = st.columns(3) with col1: self.metric_card( "Overall Risk Level", risk_report['risk_level'], self.get_risk_color(risk_report['risk_level']) ) with col2: self.metric_card( "Risk Score", f"{risk_report['risk_score']:.2f}", self.get_risk_color(risk_report['risk_level']) ) with col3: self.metric_card( "Total Alerts", len(risk_report['risk_alerts']), "risk-moderate" if len(risk_report['risk_alerts']) > 0 else "risk-low" ) # Risk Alerts if risk_report['risk_alerts']: st.markdown("### ⚠️ Risk Alerts") for alert in risk_report['risk_alerts']: st.warning(alert) def display_detailed_metrics(self, risk_report): st.subheader("Detailed Metrics") # Create tabs for different metric categories tabs = st.tabs([ "Basic Ratios", "Funding Risk", "Asset Quality", "Market Risk", "Operational Risk" ]) # Basic Ratios Tab with tabs[0]: metrics = risk_report['detailed_metrics']['basic_ratios'] self.create_metrics_grid(metrics) # Funding Risk Tab with tabs[1]: metrics = risk_report['detailed_metrics']['funding_risks'] self.create_metrics_grid(metrics) # Asset Quality Tab with tabs[2]: metrics = risk_report['detailed_metrics']['asset_risks'] self.create_metrics_grid(metrics) # Market Risk Tab with tabs[3]: metrics = risk_report['detailed_metrics']['market_risks'] self.create_metrics_grid(metrics) # Operational Risk Tab with tabs[4]: metrics = risk_report['detailed_metrics']['operational_risks'] self.create_metrics_grid(metrics) def display_risk_charts(self, financial_data, risk_report): st.subheader("Risk Analysis Charts") # Create two columns for charts col1, col2 = st.columns(2) with col1: # Radar chart for key risk indicators self.create_radar_chart(risk_report) with col2: # Time series chart for trending metrics self.create_trend_chart(financial_data) # Additional charts in new row col3, col4 = st.columns(2) with col3: # Asset composition pie chart self.create_asset_composition_chart(financial_data) with col4: # Funding structure chart self.create_funding_structure_chart(financial_data) def display_recommendations(self, risk_report): st.subheader("Recommendations & Actions") # Generate recommendations based on risk levels recommendations = self.generate_recommendations(risk_report) for category, rec_list in recommendations.items(): with st.expander(f"📋 {category}"): for rec in rec_list: st.markdown(f"- {rec}") def metric_card(self, title, value, risk_class): st.markdown(f"""