← Files Power BI DesktopARCHIVED FILE

scripts/support/forecast_engine.py

2.25 KB · Oct 2, 2026 · 00:32 UTC

↓ Download file

from collections import defaultdict

from forecast_rates import build_conversion_rates
from forecast_segments import build_segment_context, forecast_segment_month
from forecast_series import build_series
from forecast_targets import build_global_context, build_top_down_targets


def calculate_forecast(
    rows,
    forecast_year,
    start_month,
    end_month,
    as_of_date,
    horizon_months,
    grain,
):
    series, monthly_totals = build_series(rows, grain)
    rates, global_rate = build_conversion_rates(series, forecast_year, start_month)
    context = build_global_context(monthly_totals, forecast_year, start_month)
    targets = build_top_down_targets(
        monthly_totals,
        forecast_year,
        start_month,
        end_month,
        context,
        global_rate,
    )
    detail_rows = build_detail_rows(
        series,
        forecast_year,
        start_month,
        end_month,
        as_of_date,
        grain,
        context,
        rates,
        global_rate,
    )
    return scale_monthly_forecasts(detail_rows, targets)


def build_detail_rows(
    series,
    forecast_year,
    start_month,
    end_month,
    as_of_date,
    grain,
    context,
    rates,
    global_rate,
):
    detail_rows = []
    for key, points in sorted(series.items()):
        segment = build_segment_context(points, forecast_year, context)
        detail_rows.extend(
            forecast_segment_month(
                points,
                key,
                forecast_year,
                month,
                start_month,
                as_of_date,
                grain,
                segment,
                rates,
                global_rate,
            )
            for month in range(start_month, end_month + 1)
        )
    return detail_rows


def scale_monthly_forecasts(rows, targets):
    totals = defaultdict(float)
    for row in rows:
        totals[row["month_no"]] += row["raw_ai_forecast"]
    for row in rows:
        total = totals[row["month_no"]]
        factor = targets[row["month_no"]] / total if total else 0.0
        final = row["raw_ai_forecast"] * factor
        row["final_ai_forecast"] = round(final, 2)
        row["forecast_low"] = round(final * 0.90, 2)
        row["forecast_high"] = round(final * 1.10, 2)
    return rows

SHA-256: fac5a0a3cd831d8c9bba15a7d5b72e035f50922b5be5fb8a63364f6ab1be606d