Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import gradio as gr | |
| import plotly.express as px | |
| import warnings | |
| import os | |
| warnings.filterwarnings('ignore') | |
| # --- Data Loading --- | |
| def load_data(): | |
| # Path to the CSV file (relative to this script) | |
| csv_path = os.path.join(os.path.dirname(__file__), 'xbrl_data_cleaned.csv') | |
| print(f"Loading data from: {csv_path}") | |
| # Define target metrics with both Current Year (DCY) and Previous Year (DPY) | |
| target_keywords = { | |
| 'Revenue': 'Revenue From Operations_DCYMain', | |
| 'Revenue_Prev': 'Revenue From Operations_DPYMain', | |
| 'Net Worth': 'Net Worth_DCYMain', | |
| 'Net Worth_Prev': 'Net Worth_DPYMain', | |
| 'Investments': 'Amount Of Total Investments_DCYMain', | |
| 'Investments_Prev': 'Amount Of Total Investments_DPYMain', | |
| 'Purchases': 'Amount Of Total Purchases_DCYMain', | |
| 'Purchases_Prev': 'Amount Of Total Purchases_DPYMain' | |
| } | |
| selected_cols = ['Company', 'Symbol', 'Industry'] | |
| rename_map = {} | |
| try: | |
| # Read header to check columns | |
| df_header = pd.read_csv(csv_path, nrows=0) | |
| all_cols = df_header.columns.tolist() | |
| for key, col_name in target_keywords.items(): | |
| if col_name in all_cols: | |
| selected_cols.append(col_name) | |
| rename_map[col_name] = key | |
| # Load dataset with selected columns | |
| df = pd.read_csv(csv_path, usecols=lambda x: x in selected_cols) | |
| df.rename(columns=rename_map, inplace=True) | |
| # Clean numeric columns | |
| numeric_cols = list(rename_map.values()) | |
| for col in numeric_cols: | |
| if col in df.columns: | |
| df[col] = pd.to_numeric(df[col], errors='coerce').fillna(0) | |
| print("Data Loaded Successfully!") | |
| return df | |
| except Exception as e: | |
| print(f"Error loading data: {e}") | |
| return pd.DataFrame() | |
| df = load_data() | |
| companies = df['Company'].unique().tolist() if not df.empty else [] | |
| # --- Dashboard Functions --- | |
| def get_overall_stats(): | |
| if df.empty: | |
| return {} | |
| stats = { | |
| "Total Companies": len(df['Company'].unique()), | |
| "Total Revenue": df['Revenue'].sum() if 'Revenue' in df.columns else 0, | |
| "Avg Net Worth": df['Net Worth'].mean() if 'Net Worth' in df.columns else 0, | |
| "Top Industry": df['Industry'].mode()[0] if 'Industry' in df.columns else "N/A" | |
| } | |
| return stats | |
| def plot_industry_dist(): | |
| if df.empty or 'Industry' not in df.columns: | |
| return None | |
| industry_counts = df['Industry'].value_counts().head(10) | |
| fig = px.pie(values=industry_counts.values, names=industry_counts.index, title='Top 10 Industries') | |
| return fig | |
| def plot_revenue_vs_networth(): | |
| if df.empty or 'Revenue' not in df.columns or 'Net Worth' not in df.columns: | |
| return None | |
| fig = px.scatter(df, x='Revenue', y='Net Worth', hover_name='Company', title='Revenue vs Net Worth') | |
| return fig | |
| def get_company_details(company_name): | |
| if df.empty: | |
| return "No data loaded", None, None | |
| comp_data = df[df['Company'] == company_name] | |
| if comp_data.empty: | |
| return "Company not found", None, None | |
| # Metrics | |
| metrics = comp_data.iloc[0].to_dict() | |
| # Visualization 1: Current Year Metrics | |
| cy_metrics = {k: v for k, v in metrics.items() if k in ['Revenue', 'Net Worth', 'Investments', 'Purchases'] and isinstance(v, (int, float))} | |
| fig_cy = px.bar(x=list(cy_metrics.keys()), y=list(cy_metrics.values()), title=f"Current Year Financials for {company_name}") | |
| # Visualization 2: Year over Year Comparison | |
| categories = ['Revenue', 'Net Worth', 'Investments', 'Purchases'] | |
| yoy_data = [] | |
| for cat in categories: | |
| if cat in metrics: | |
| yoy_data.append({'Metric': cat, 'Year': 'Current', 'Value': metrics[cat]}) | |
| if f"{cat}_Prev" in metrics: | |
| yoy_data.append({'Metric': cat, 'Year': 'Previous', 'Value': metrics[f"{cat}_Prev"]}) | |
| if yoy_data: | |
| df_yoy = pd.DataFrame(yoy_data) | |
| fig_yoy = px.bar(df_yoy, x='Metric', y='Value', color='Year', barmode='group', title=f"Year-over-Year Comparison for {company_name}") | |
| else: | |
| fig_yoy = None | |
| # Format metrics text | |
| metrics_str = "\n".join([f"{k}: {v}" for k, v in metrics.items() if isinstance(v, (int, float, str))]) | |
| return metrics_str, fig_cy, fig_yoy | |
| # --- Gradio Interface --- | |
| with gr.Blocks(title="XBRL Financial Dashboard") as demo: | |
| gr.Markdown("# 📊 XBRL Data Analysis Dashboard") | |
| gr.Markdown("Explore financial data, industry trends, and company performance.") | |
| with gr.Tabs(): | |
| # Tab 1: Overall Dashboard | |
| with gr.TabItem("📈 Market Overview"): | |
| gr.Markdown("### Key Performance Indicators") | |
| stats = get_overall_stats() | |
| with gr.Row(): | |
| gr.Number(label="Total Companies", value=stats.get('Total Companies', 0)) | |
| gr.Number(label="Total Revenue", value=stats.get('Total Revenue', 0)) | |
| gr.Number(label="Average Net Worth", value=stats.get('Avg Net Worth', 0)) | |
| gr.Textbox(label="Top Industry", value=stats.get('Top Industry', "N/A")) | |
| gr.Markdown("### Market Visualizations") | |
| with gr.Row(): | |
| with gr.Column(): | |
| plot_ind = plot_industry_dist() | |
| if plot_ind: | |
| gr.Plot(plot_ind) | |
| else: | |
| gr.Markdown("No Industry Data Available") | |
| with gr.Column(): | |
| plot_rev_nw = plot_revenue_vs_networth() | |
| if plot_rev_nw: | |
| gr.Plot(plot_rev_nw) | |
| else: | |
| gr.Markdown("Insufficient Data for Scatter Plot") | |
| # Tab 2: Company Specific Analysis | |
| with gr.TabItem("🏢 Company Analysis"): | |
| gr.Markdown("### Deep Dive into Company Financials") | |
| with gr.Row(): | |
| company_dropdown = gr.Dropdown(choices=companies, label="Select Company", interactive=True) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| company_info = gr.Textbox(label="Company Details", lines=15) | |
| with gr.Column(scale=2): | |
| company_plot_cy = gr.Plot(label="Current Year Metrics") | |
| company_plot_yoy = gr.Plot(label="Year-over-Year Comparison") | |
| company_dropdown.change( | |
| fn=get_company_details, | |
| inputs=company_dropdown, | |
| outputs=[company_info, company_plot_cy, company_plot_yoy] | |
| ) | |
| if __name__ == "__main__": | |
| print("Launching Gradio App...") | |
| demo.launch(server_name="0.0.0.0", share=True) | |