Add backend/app/services/forecasting/sales_series.py — deterministic monthly sold-units (+area+avg price) time series per SegmentSpec, the Y-axis foundation for the §9.6 key-rate regression. Two sources with distinct authority: objective_corpus_room_month (class/district aggregates, full ДДУ+ДКП, count- weighted price ×1000 тыс→₽) and objective_lots (room×area×price segmentation, GROUP BY date_trunc registration_date; survivorship caveat documented). Pure DB-free helpers price_bucket_of / room_area_bucket_of / log_diff / fill_month_grid, unit-tested. In-SQL CASE bucketing shares the same threshold constants as the helpers (bound params) → no Python↔SQL drift. Months with no sales → units=0 (real zero), area/price → None. Graceful empty/thin → low confidence, zero-filled grid. Mirrors macro_series.py (PR2). room_bucket semantics are source-specific (documented on SegmentSpec). 62 tests, ruff clean.
51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
"""Forecasting services — детерминированный форсайт-слой Site Finder v2.
|
|
|
|
#951 (Site Finder v2 / «GG-форсайт», EPIC 7 «Чувствительность к ключевой ставке»).
|
|
|
|
Этот пакет — фундамент data-independent логики прогноза: monthly макро-ряды,
|
|
классификатор режима ставки, лаговые помощники. Всё ДЕТЕРМИНИРОВАННО, БЕЗ LLM.
|
|
|
|
Слои (по PR):
|
|
• macro_series (#951b) — monthly макро-ряд + классификатор режима ставки (X-ось §9.6).
|
|
• sales_series (#951c) — monthly ряд продаж по сегменту (Y-ось §9.6).
|
|
• rate_sensitivity (later PR) — §9.6 чувствительность продаж к key_rate.
|
|
• macro_coefficient (later PR) — §9.5 макро-коэффициент.
|
|
|
|
Источники данных:
|
|
• макро — таблица macro_indicator через reader site_finder/macro.py (reuse).
|
|
• продажи — objective_corpus_room_month / objective_lots (см. sales_series).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from app.services.forecasting.macro_series import (
|
|
MonthlyMacro,
|
|
classify_regime,
|
|
get_monthly_macro,
|
|
is_confounded_window,
|
|
macro_at_lag,
|
|
)
|
|
from app.services.forecasting.sales_series import (
|
|
SalesSeries,
|
|
SegmentSpec,
|
|
build_sales_series,
|
|
fill_month_grid,
|
|
log_diff,
|
|
price_bucket_of,
|
|
room_area_bucket_of,
|
|
)
|
|
|
|
__all__ = [
|
|
"MonthlyMacro",
|
|
"SalesSeries",
|
|
"SegmentSpec",
|
|
"build_sales_series",
|
|
"classify_regime",
|
|
"fill_month_grid",
|
|
"get_monthly_macro",
|
|
"is_confounded_window",
|
|
"log_diff",
|
|
"macro_at_lag",
|
|
"price_bucket_of",
|
|
"room_area_bucket_of",
|
|
]
|