walaa2022's picture
Upload app.py
82d20ed verified
raw
history blame
5.8 kB
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()