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()