feat(site-finder): geo-radius market-price calibration in /analyze (#1881 follow-up) #1899

Merged
bot-backend merged 1 commit from feat/geo-radius-price-calibration into main 2026-06-25 07:59:56 +00:00

1 commit

Author SHA1 Message Date
282843f241 feat(site-finder): geo-radius market-price calibration in /analyze (#1881 follow-up)
All checks were successful
CI / frontend-tests (pull_request) Successful in 1m0s
CI / backend-tests (pull_request) Successful in 11m36s
CI / openapi-codegen-check (pull_request) Successful in 1m54s
CI / changes (pull_request) Successful in 7s
Цена продажи в финмодели калибровалась по name-match админ-района Objective —
но только 4 из 9 районов ЕКБ совпадают по имени, 5 проваливались в class_norm.
Добавлен ценовой tier "objective_geo_radius": ST_DWithin-медиана цен новостроек
Objective (objective_lots ⋈ complexes по lat/lon) в радиусе 3 км от центроида
участка, между квартальной MV и district_reference. Порог n≥10 лотов и ≥2 ЖК
(один ЖК не задаёт цену). Прод: 5 «гео»-районов теперь дают реальную медиану
(129–158k ₽/м²) вместо NULL.

- data/sql/168: функциональный GIST-индекс complexes((ST_MakePoint(lon,lat))::geography)
  — без него ST_DWithin делает Seq Scan (+~90мс на /analyze, у которого уже
  таймаут-давление #1850). Прод EXPLAIN: Seq Scan 114мс → Index Scan 28мс.
- guard: при вырожденном центроиде (fallback на центр ЕКБ) гео-радиус
  пропускается (source=no_data_centroid_fallback) — не выдаём центр-города
  медиану за калиброванную цену участка.
- price_source="objective_geo_radius" (plain str, без schema-change).
- ptica-adapt: price_source → честные RU-подписи (не сырой токен).
- +4 теста (4-tier priority chain). deep-review .

Refs #1881
2026-06-25 12:46:56 +05:00