import gradio as gr import pandas as pd import json def analyze_financial_statements(income_statement, balance_sheet): """Analyze uploaded financial statements""" try: # Read the uploaded files income_df = pd.read_csv(income_statement.name) balance_df = pd.read_csv(balance_sheet.name) # Calculate key metrics metrics = calculate_metrics(income_df, balance_df) # Generate analysis analysis = generate_analysis(metrics) # Format output return format_results(metrics, analysis) except Exception as e: return f"Error analyzing files: {str(e)}" def calculate_metrics(income_df, balance_df): """Calculate financial metrics""" # Clean numeric data income_df = income_df.replace({'\$': '', ' ': '', ',': '', '\(': '-', '\)': ''}, regex=True) balance_df = balance_df.replace({'\$': '', ' ': '', ',': '', '\(': '-', '\)': ''}, regex=True) # Convert to numeric numeric_cols = ['Revenue', 'Net Income', 'Gross Profit', 'Total Assets', 'Total Liabilities', "Shareholder's Equity"] for col in numeric_cols: if col in income_df.columns: income_df[col] = pd.to_numeric(income_df[col], errors='coerce') if col in balance_df.columns: balance_df[col] = pd.to_numeric(balance_df[col], errors='coerce') # Calculate metrics metrics = { "Profitability": { "Gross Margin (%)": round((income_df['Gross Profit'].iloc[-1] / income_df['Revenue'].iloc[-1] * 100), 2), "Net Margin (%)": round((income_df['Net Income'].iloc[-1] / income_df['Revenue'].iloc[-1] * 100), 2) }, "Growth": { "Revenue Growth (%)": round(((income_df['Revenue'].iloc[-1] / income_df['Revenue'].iloc[0] - 1) * 100), 2), "Net Income Growth (%)": round(((income_df['Net Income'].iloc[-1] / income_df['Net Income'].iloc[0] - 1) * 100), 2) }, "Financial Position": { "Debt to Equity": round(balance_df['Total Liabilities'].iloc[-1] / balance_df["Shareholder's Equity"].iloc[-1], 2), "Equity Ratio (%)": round((balance_df["Shareholder's Equity"].iloc[-1] / balance_df['Total Assets'].iloc[-1] * 100), 2) } } return metrics def generate_analysis(metrics): """Generate insights and recommendations""" analysis = { "Key Insights": [], "Recommendations": [], "Risk Factors": [] } # Analyze profitability net_margin = metrics["Profitability"]["Net Margin (%)"] if net_margin < 5: analysis["Key Insights"].append( "Low profit margins indicating operational efficiency challenges") analysis["Recommendations"].append({ "Priority": "High", "Area": "Profitability", "Action": "Implement cost optimization program", "Impact": "Improve net margins by 2-3%" }) # Analyze growth revenue_growth = metrics["Growth"]["Revenue Growth (%)"] if revenue_growth < 5: analysis["Key Insights"].append( "Slow revenue growth suggesting need for market expansion") analysis["Recommendations"].append({ "Priority": "High", "Area": "Growth", "Action": "Develop market expansion strategy", "Impact": "Accelerate revenue growth to 8-10%" }) # Analyze financial position equity_ratio = metrics["Financial Position"]["Equity Ratio (%)"] if equity_ratio > 70: analysis["Key Insights"].append( "High equity ratio suggests potential for leveraged growth") analysis["Recommendations"].append({ "Priority": "Medium", "Area": "Capital Structure", "Action": "Evaluate growth financing options", "Impact": "Optimize capital structure" }) return analysis def format_results(metrics, analysis): """Format analysis results""" output = "# Financial Analysis Report\n\n" # Add Metrics output += "## Financial Metrics\n\n" for category, values in metrics.items(): output += f"### {category}\n" for metric, value in values.items(): output += f"- {metric}: {value}\n" output += "\n" # Add Insights output += "## Key Insights\n\n" for insight in analysis["Key Insights"]: output += f"- {insight}\n" output += "\n" # Add Recommendations output += "## Recommendations\n\n" for rec in analysis["Recommendations"]: output += f"### {rec['Area']} ({rec['Priority']} Priority)\n" output += f"- Action: {rec['Action']}\n" output += f"- Expected Impact: {rec['Impact']}\n\n" return output # Create Gradio interface iface = gr.Interface( fn=analyze_financial_statements, inputs=[ gr.File(label="Income Statement (CSV)"), gr.File(label="Balance Sheet (CSV)") ], outputs=gr.Markdown(), title="Financial Statement Analysis", description="Upload your Income Statement and Balance Sheet (CSV format) for analysis.", examples=[ [ "OFINTECH-Income Statement-template.csv", "OFINTECH Balance Sheet template.csv" ] ] ) # Launch the interface if __name__ == "__main__": iface.launch()