§4.3 «Тренд рынка»: считать динамику цен из objective_lots_history вместо устаревшего Росреестра #2178

Closed
opened 2026-07-02 17:41:17 +00:00 by bot-backend · 1 comment
Collaborator

Фидбек Anton 2026-07-02: «Источник сделок устарел (данные до 01.2026) — в Объективе есть все данные, почему не используем?»

Диагноз

«Тренд рынка» (frontend/src/components/site-finder/MarketTrendBlock.tsx:104-111, backend app/api/v1/parcels.py:2724-2831) строится ТОЛЬКО на rosreestr_deals: max дата в БД = 2026-01-01 (Росреестр лагает ~полгода) → recent-окно пусто → status source_stale.

При этом objective_lots_history уже содержит 6 снапшотов (2026-05-17…2026-06-30) с price_per_m2_rub на ~1.77M лотов — полная свежая история цен предложения. Готового расчёта price-trend по лотам в коде нет.

План

  1. Backend: тренд из objective_lots_history — медиана ₽/м² по снапшотам для ЖК радиуса (те же mapping-комплексы), Δ% за период, честный caveat «по ценам предложения (Объектив)».
  2. Росреестр оставить второй линией «по сделкам» — показывать когда свежий, иначе только offer-trend (не «источник устарел»-тупик).
  3. Frontend: MarketTrendBlock — две серии/бейджа источника, unit в tooltip.
  4. По мере накопления снапшотов история удлиняется сама (снапшоты weekly).
Фидбек Anton 2026-07-02: «Источник сделок устарел (данные до 01.2026) — в Объективе есть все данные, почему не используем?» ## Диагноз «Тренд рынка» (`frontend/src/components/site-finder/MarketTrendBlock.tsx:104-111`, backend `app/api/v1/parcels.py:2724-2831`) строится ТОЛЬКО на `rosreestr_deals`: max дата в БД = 2026-01-01 (Росреестр лагает ~полгода) → recent-окно пусто → status `source_stale`. При этом `objective_lots_history` уже содержит **6 снапшотов (2026-05-17…2026-06-30) с price_per_m2_rub на ~1.77M лотов** — полная свежая история цен предложения. Готового расчёта price-trend по лотам в коде нет. ## План 1. Backend: тренд из `objective_lots_history` — медиана ₽/м² по снапшотам для ЖК радиуса (те же mapping-комплексы), Δ% за период, честный caveat «по ценам предложения (Объектив)». 2. Росреестр оставить второй линией «по сделкам» — показывать когда свежий, иначе только offer-trend (не «источник устарел»-тупик). 3. Frontend: MarketTrendBlock — две серии/бейджа источника, unit в tooltip. 4. По мере накопления снапшотов история удлиняется сама (снапшоты weekly).
Author
Collaborator

Live и прод-верифицировано (PR #2190, qa-скриншот): §4.3 на 66:41:0204016:10 показывает карточку offer_only — медиана 134 983 ₽/м², −8.1% (17.05–30.06.2026, 7 ЖК, ~1.5k лотов), спарклайн, полная подпись источника + caveat про устаревший Росреестр. При свежих сделках offer-тренд идёт второй строкой. Предохранитель: statement_timeout 8s вокруг offer-запроса (холодный прогон на плотном центре ~5.5 с). Follow-up при необходимости: прекомпьют per-complex медиан (weekly Celery). Закрываю.

Live и прод-верифицировано (PR #2190, qa-скриншот): §4.3 на 66:41:0204016:10 показывает карточку `offer_only` — медиана 134 983 ₽/м², −8.1% (17.05–30.06.2026, 7 ЖК, ~1.5k лотов), спарклайн, полная подпись источника + caveat про устаревший Росреестр. При свежих сделках offer-тренд идёт второй строкой. Предохранитель: statement_timeout 8s вокруг offer-запроса (холодный прогон на плотном центре ~5.5 с). Follow-up при необходимости: прекомпьют per-complex медиан (weekly Celery). Закрываю.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2178
No description provided.