Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -92,66 +92,67 @@ class FinancialAnalyzer:
|
|
92 |
return {}
|
93 |
|
94 |
def extract_metrics(self, income_data, balance_data):
|
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 |
-
Revenue
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
Balance Sheet Strength:
|
146 |
-
- Total Assets: ${metrics['Balance_Sheet']['Total_Assets_2025']:,.1f}M
|
147 |
-
- Total Liabilities: ${metrics['Balance_Sheet']['Total_Liabilities_2025']:,.1f}M
|
148 |
-
- Shareholders' Equity: ${metrics['Balance_Sheet']['Equity_2025']:,.1f}M
|
149 |
-
|
150 |
-
Explain key financial ratios and their implications. Discuss strategies for growth and risk mitigation.
|
151 |
-
</human>"""
|
152 |
-
except Exception as e:
|
153 |
-
print(f"Error generating prompt: {str(e)}")
|
154 |
-
return ""
|
155 |
|
156 |
def generate_analysis(self, prompt):
|
157 |
"""Generate analysis using TinyLlama"""
|
@@ -160,7 +161,7 @@ Explain key financial ratios and their implications. Discuss strategies for grow
|
|
160 |
|
161 |
outputs = self.model.generate(
|
162 |
inputs["input_ids"],
|
163 |
-
max_new_tokens=
|
164 |
temperature=0.7,
|
165 |
top_p=0.9,
|
166 |
do_sample=True,
|
|
|
92 |
return {}
|
93 |
|
94 |
def extract_metrics(self, income_data, balance_data):
|
95 |
+
"""Extract and calculate key financial metrics"""
|
96 |
+
try:
|
97 |
+
# Get current and previous year values for growth calculations
|
98 |
+
metrics = {
|
99 |
+
"Revenue": {
|
100 |
+
"2025": self.get_nested_value(income_data, "Revenue", "Total Net Revenue", "2025"),
|
101 |
+
"2024": self.get_nested_value(income_data, "Revenue", "Total Net Revenue", "2024"),
|
102 |
+
"2021": self.get_nested_value(income_data, "Revenue", "Total Net Revenue", "2021")
|
103 |
+
},
|
104 |
+
"Profitability": {
|
105 |
+
"Gross_Profit_2025": self.get_nested_value(income_data, "Cost and Gross Profit", "Gross Profit", "2025"),
|
106 |
+
"EBIT_2025": self.get_nested_value(income_data, "Profit Summary", "EBIT", "2025"),
|
107 |
+
"Net_Earnings_2025": self.get_nested_value(income_data, "Profit Summary", "Net Earnings", "2025"),
|
108 |
+
"Operating_Expenses_2025": self.get_nested_value(income_data, "Operating Expenses", "Total Operating Expenses", "2025")
|
109 |
+
},
|
110 |
+
"Balance_Sheet": {
|
111 |
+
"Total_Assets_2025": self.get_nested_value(balance_data, "Key Totals", "Total_Assets", "2025"),
|
112 |
+
"Current_Assets_2025": self.get_nested_value(balance_data, "Key Totals", "Total_Current_Assets", "2025"),
|
113 |
+
"Total_Liabilities_2025": self.get_nested_value(balance_data, "Key Totals", "Total_Liabilities", "2025"),
|
114 |
+
"Current_Liabilities_2025": self.get_nested_value(balance_data, "Key Totals", "Total_Current_Liabilities", "2025"),
|
115 |
+
"Equity_2025": self.get_nested_value(balance_data, "Key Totals", "Total_Shareholders_Equity", "2025"),
|
116 |
+
"Inventory_2025": self.get_nested_value(balance_data, "Balance Sheet Data 2021-2025", "Inventory", "2025"),
|
117 |
+
"Accounts_Receivable_2025": self.get_nested_value(balance_data, "Balance Sheet Data 2021-2025", "Accounts_Receivable", "2025"),
|
118 |
+
"Long_Term_Debt_2025": self.get_nested_value(balance_data, "Balance Sheet Data 2021-2025", "Long_Term_Debt", "2025")
|
119 |
+
},
|
120 |
+
"Cash_Flow": {
|
121 |
+
"Depreciation_2025": self.get_nested_value(income_data, "Operating Expenses", "Depreciation & Amortization", "2025"),
|
122 |
+
"Interest_Expense_2025": self.get_nested_value(income_data, "Profit Summary", "Interest Expense", "2025")
|
123 |
}
|
124 |
+
}
|
125 |
+
|
126 |
+
# Calculate financial ratios
|
127 |
+
revenue_2025 = metrics["Revenue"]["2025"]
|
128 |
+
if revenue_2025 != 0:
|
129 |
+
# Profitability Ratios
|
130 |
+
metrics["Ratios"] = {
|
131 |
+
"Gross_Margin": (metrics["Profitability"]["Gross_Profit_2025"] / revenue_2025) * 100,
|
132 |
+
"Operating_Margin": (metrics["Profitability"]["EBIT_2025"] / revenue_2025) * 100,
|
133 |
+
"Net_Margin": (metrics["Profitability"]["Net_Earnings_2025"] / revenue_2025) * 100,
|
134 |
+
|
135 |
+
# Liquidity Ratios
|
136 |
+
"Current_Ratio": metrics["Balance_Sheet"]["Current_Assets_2025"] / metrics["Balance_Sheet"]["Current_Liabilities_2025"],
|
137 |
+
"Quick_Ratio": (metrics["Balance_Sheet"]["Current_Assets_2025"] - metrics["Balance_Sheet"]["Inventory_2025"]) / metrics["Balance_Sheet"]["Current_Liabilities_2025"],
|
138 |
+
|
139 |
+
# Efficiency Ratios
|
140 |
+
"Asset_Turnover": revenue_2025 / metrics["Balance_Sheet"]["Total_Assets_2025"],
|
141 |
+
"Receivables_Turnover": revenue_2025 / metrics["Balance_Sheet"]["Accounts_Receivable_2025"],
|
142 |
+
|
143 |
+
# Solvency Ratios
|
144 |
+
"Debt_to_Equity": metrics["Balance_Sheet"]["Total_Liabilities_2025"] / metrics["Balance_Sheet"]["Equity_2025"],
|
145 |
+
"Interest_Coverage": metrics["Profitability"]["EBIT_2025"] / metrics["Cash_Flow"]["Interest_Expense_2025"] if metrics["Cash_Flow"]["Interest_Expense_2025"] != 0 else 0,
|
146 |
+
|
147 |
+
# Growth Rates
|
148 |
+
"Revenue_Growth": ((metrics["Revenue"]["2025"] / metrics["Revenue"]["2024"]) - 1) * 100,
|
149 |
+
"5Year_Revenue_CAGR": ((metrics["Revenue"]["2025"] / metrics["Revenue"]["2021"]) ** (1/4) - 1) * 100
|
150 |
+
}
|
151 |
+
|
152 |
+
return metrics
|
153 |
+
except Exception as e:
|
154 |
+
print(f"Error extracting metrics: {str(e)}")
|
155 |
+
return {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
156 |
|
157 |
def generate_analysis(self, prompt):
|
158 |
"""Generate analysis using TinyLlama"""
|
|
|
161 |
|
162 |
outputs = self.model.generate(
|
163 |
inputs["input_ids"],
|
164 |
+
max_new_tokens=800, # Increased from 500 to 800 for more detailed analysis
|
165 |
temperature=0.7,
|
166 |
top_p=0.9,
|
167 |
do_sample=True,
|