From 9ac924a9eecbb5c4671cc169d5bc11a5d671db89 Mon Sep 17 00:00:00 2001 From: Light1YT Date: Sat, 13 Jun 2026 11:09:26 +0500 Subject: [PATCH] =?UTF-8?q?fix(analytics):=20rolling=206mo/6mo=20=D0=BE?= =?UTF-8?q?=D0=BA=D0=BD=D0=B0=20=D0=B2=20=5Fdistrict=5Fvelocity=5Ftrend=20?= =?UTF-8?q?(#1203)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _district_velocity_trend сравнивал recent vs prior, но окна были ЗАХАРДКОЖЕНЫ датами 2025: recent = report_month >= 2025-07-01 (без верхней границы!) prior = report_month BETWEEN 2025-01-01 AND 2025-06-30 objective_corpus_room_month обновляется еженедельно (objective_etl, period_month без капа). На 2026-06 recent-окно ≈ 11-12 месяцев vs prior=6 → при плоском рынке ratio ≈ 1.83, дальше навсегда упирается в clamp(_, 2.0) → trend_factor=2.0 → macro_velocity_mult ×2 → bucket_velocity ×2 → months_to_sellout занижен в ~1.8-2x. Искажение растёт с каждым месяцем; trend-сигнал мёртв. Patch: rolling 6mo/6mo окна относительно NOW(): recent = report_month >= NOW() - INTERVAL '6 months' prior = report_month >= NOW() - INTERVAL '12 months' AND report_month < NOW() - INTERVAL '6 months' Равные окна, plain rolling, без хардкода. 29/29 velocity_trend + recommend_mix тестов зелёные. ruff clean. Closes #1203 --- backend/app/services/analytics_queries.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/app/services/analytics_queries.py b/backend/app/services/analytics_queries.py index b3e6cdf9..2fcb98d8 100644 --- a/backend/app/services/analytics_queries.py +++ b/backend/app/services/analytics_queries.py @@ -1454,13 +1454,19 @@ def _district_velocity_trend(db: Session, *, district_name: str) -> tuple[float db.execute( text( """ + -- #1203: rolling 6mo/6mo окна относительно NOW(), а не + -- захардкоженных дат 2025. С хардкодом recent-окно росло + -- безгранично (ETL еженедельно доливает report_month) → на + -- июнь 2026 recent ≈ 11-12мес vs prior=6мес → ratio ≈ 2.0 + -- → trend_factor навсегда упирался в кап 2.0 → bucket_velocity + -- ×2 → months_to_sellout занижен ×2 в живом recommend_mix. SELECT SUM(crm.deals_total_count) - FILTER (WHERE crm.report_month >= DATE '2025-07-01') + FILTER (WHERE crm.report_month >= NOW() - INTERVAL '6 months') AS recent, SUM(crm.deals_total_count) - FILTER (WHERE crm.report_month BETWEEN DATE '2025-01-01' - AND DATE '2025-06-30') + FILTER (WHERE crm.report_month >= NOW() - INTERVAL '12 months' + AND crm.report_month < NOW() - INTERVAL '6 months') AS prior FROM objective_corpus_room_month crm WHERE crm.district = :dn -- 2.45.3