fix(schemas): expose per-bucket elasticity + velocity_source в RecommendBucket (#1204)
All checks were successful
CI / backend-tests (push) Successful in 6m30s
CI / changes (pull_request) Successful in 8s
CI / changes (push) Successful in 8s
CI / frontend-tests (push) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Successful in 6m28s
All checks were successful
CI / backend-tests (push) Successful in 6m30s
CI / changes (pull_request) Successful in 8s
CI / changes (push) Successful in 8s
CI / frontend-tests (push) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Successful in 6m28s
recommend_mix кладёт в bucket поля elasticity / elasticity_r2 / elasticity_n / elasticity_source / velocity_source (analytics_queries.py:2592-2606), но RecommendBucket их не объявляет и не имеет extra='allow' → Pydantic v2 молча выкидывает их из response. Фронт (RecommendVelocityPanel.tsx:68 `r.elasticity ?? elasticity`) при движении price-слайдера всегда падает на ГЛОБАЛЬНУЮ эластичность — live what-if расходится и с серверным months_to_sellout (тот считается per-bucket), и с UI-таблицей «Эластичность по сегментам». Patch: добавлены 5 опциональных полей в схему. Совместимость: фронт уже читает их с `?? globalFallback`, поэтому non-breaking. Producer/consumer- контракт восстановлен. 113/113 recommend-тестов зелёные. Closes #1204
This commit is contained in:
parent
f12c03588d
commit
441f761a89
1 changed files with 12 additions and 0 deletions
|
|
@ -45,6 +45,18 @@ class RecommendBucket(BaseModel):
|
|||
# what-if recompute.
|
||||
velocity_per_month: float | None = None
|
||||
months_to_sellout: float | None = None
|
||||
# Per-bucket эластичность спроса по цене (#1204) — recommend_mix считает её
|
||||
# отдельно на каждую квартирографию (см. analytics_queries.py:2592-2606), фронт
|
||||
# скейлит velocity_per_month как `velocity * price_factor^elasticity` при движении
|
||||
# слайдера цены (RecommendVelocityPanel.tsx:68). Без этих полей в схеме
|
||||
# response_model молча их отбрасывал → фронт всегда падал на глобальную
|
||||
# эластичность, расходясь с серверным months_to_sellout и UI-таблицей сегментов.
|
||||
elasticity: float | None = None
|
||||
elasticity_r2: float | None = None
|
||||
elasticity_n: int | None = None
|
||||
elasticity_source: str | None = None
|
||||
# Источник базового темпа продаж (analytics_queries → 'hedonic'|'deals'|'fallback').
|
||||
velocity_source: str | None = None
|
||||
# Success-driven mix flag (issue #25): bucket has top success_score in district
|
||||
is_top_success: bool = False
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue