AutoDataLab2.0 / ceo_brief_env /experts /finance_tools.py
uchihamadara1816's picture
Upload 172 files
d02bacd verified
from __future__ import annotations
import numpy as np
import pandas as pd
def project_next_quarter(revenue_by_month: pd.DataFrame) -> dict[str, float]:
if revenue_by_month.empty:
return {"projection_next_quarter": 0.0, "confidence_band": 0.0}
y = revenue_by_month["Revenue"].astype(float).to_numpy()
x = np.arange(1, len(y) + 1, dtype=float)
if len(y) == 1:
next_values = np.array([y[-1], y[-1], y[-1]])
residual = 0.0
else:
slope, intercept = np.polyfit(x, y, 1)
future_x = np.arange(len(y) + 1, len(y) + 4, dtype=float)
next_values = slope * future_x + intercept
predicted = slope * x + intercept
residual = float(np.std(y - predicted))
return {
"projection_next_quarter": round(float(next_values.sum()), 2),
"confidence_band": round(residual * 3, 2),
}
def compute_variance(actual: float, plan: float) -> dict[str, float | str]:
variance_abs = round(float(actual) - float(plan), 2)
variance_pct = round((variance_abs / float(plan)) * 100, 2) if plan else 0.0
flag = "ahead" if variance_abs >= 0 else "behind"
return {
"variance_abs": variance_abs,
"variance_pct": variance_pct,
"variance_flag": flag,
}
def break_even(fixed_cost: float, unit_margin: float) -> dict[str, float]:
if unit_margin <= 0:
return {"break_even_units": 0.0, "break_even_revenue": 0.0}
units = float(fixed_cost) / float(unit_margin)
return {
"break_even_units": round(units, 2),
"break_even_revenue": round(units * float(unit_margin), 2),
}