Spaces:
Sleeping
Sleeping
File size: 5,800 Bytes
82d20ed |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
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() |