Spaces:
Sleeping
Sleeping
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() |