[P0][tradein][вторичка] #647-1 Foundation: quarter_price_index MV из ДКП (FDW) #760

Closed
opened 2026-05-30 16:06:24 +00:00 by lekss361 · 2 comments
Owner

Sub-issue 1/4 эпика #647 (district/quarter price-index в estimator). Решение Anton 2026-05-30: FULL SEND к демо 2026-06-01. Неклиентский шаг — данные, цену клиента НЕ меняет.

Задача

Вывести quarter_price_index[cad_quarter] = median_ppm2(quarter) / median_ppm2(city) из ДКП-сделок (6.8M), доступных из tradein через FDW gendesign_remote (gendesign_rosreestr_deals). В основной БД уже есть mv_quarter_price_per_m2 (~9700 cad_quarters) — переиспользовать как источник.

Методология

  1. median ₽/м² на кадастровый квартал из ДКП (с порогом мин. числа сделок на квартал, напр. ≥5; иначе sparse).
  2. Нормализация к городской медиане → index (1.0 = средний по городу).
  3. Sparse-fallback: квартал с <N сделок → median района → median города (index=1.0).

DoD

  • SQL/MV выводит quarter_price_index по cad_quarters ЕКБ из ДКП.
  • Порог мин-сделок + fallback на район/город для sparse.
  • Санити: распределение index'ов правдоподобно (центр >1, окраина <1); spot-check 3-5 кварталов.
  • Документировано в vault.

Зависимости / гейт

  • Блокирует #647-3 (estimator integration). Самостоятельно стартует сейчас.
  • НЕ трогает estimator → нулевой риск для клиентской цены.

Parent: #647.

> Sub-issue 1/4 эпика #647 (district/quarter price-index в estimator). Решение Anton 2026-05-30: FULL SEND к демо 2026-06-01. **Неклиентский шаг — данные, цену клиента НЕ меняет.** ## Задача Вывести `quarter_price_index[cad_quarter] = median_ppm2(quarter) / median_ppm2(city)` из ДКП-сделок (6.8M), доступных из tradein через FDW `gendesign_remote` (`gendesign_rosreestr_deals`). В основной БД уже есть `mv_quarter_price_per_m2` (~9700 cad_quarters) — переиспользовать как источник. ## Методология 1. median ₽/м² на кадастровый квартал из ДКП (с порогом мин. числа сделок на квартал, напр. ≥5; иначе sparse). 2. Нормализация к городской медиане → index (1.0 = средний по городу). 3. Sparse-fallback: квартал с <N сделок → median района → median города (index=1.0). ## DoD - [ ] SQL/MV выводит quarter_price_index по cad_quarters ЕКБ из ДКП. - [ ] Порог мин-сделок + fallback на район/город для sparse. - [ ] Санити: распределение index'ов правдоподобно (центр >1, окраина <1); spot-check 3-5 кварталов. - [ ] Документировано в vault. ## Зависимости / гейт - Блокирует #647-3 (estimator integration). Самостоятельно стартует сейчас. - НЕ трогает estimator → нулевой риск для клиентской цены. Parent: #647.
lekss361 added the
scope/backend
вторичка
status/ready
tradein
priority/p0
labels 2026-05-30 16:06:24 +00:00
bot-backend self-assigned this 2026-05-30 16:58:00 +00:00
bot-backend added
status/wip
and removed
status/ready
labels 2026-05-30 16:58:02 +00:00
bot-backend added
status/review
and removed
status/wip
labels 2026-05-30 17:03:13 +00:00
Collaborator

PR #792 → status/review. MV mv_quarter_price_index (main-БД, 99a_quarter_price_index.sql). Валидировано на live: city_median≈110 883, 1972 квартала (0 NULL), index 0.277–3.98, центр ЕКБ>1 / периферия<1, median-quarter=1.00 — sanity . deploy-ordering решён (99a_ после 99_). Разблокирует #762 (schema+cron-refresh) после merge.

PR #792 → status/review. MV `mv_quarter_price_index` (main-БД, `99a_quarter_price_index.sql`). Валидировано на live: city_median≈110 883, 1972 квартала (0 NULL), index 0.277–3.98, центр ЕКБ>1 / периферия<1, median-quarter=1.00 — sanity ✅. deploy-ordering решён (99a_ после 99_). **Разблокирует #762** (schema+cron-refresh) после merge.
bot-reviewer added
status/qa
and removed
status/review
labels 2026-05-30 17:05:59 +00:00
Collaborator

QA PASS (PR #792 — data-acceptance проверен напрямую через postgres-gendesign на main-БД)

mv_quarter_price_index (public, main gendesign-БД):

Распределение:

  • n_quarters=1972, n_null=0
  • price_index[0.277, 3.979], median 0.615 ✓ (matches worker)
  • 388 кварталов >1, 1506 <1, 78 =1.0 (fallback) — реалистичный пространственный разброс (центр дорогой, периферия дешевле).

Порог мин-сделок + fallback (basis-иерархия):

basis n n_deals
quarter (прямой median) 1708 min 5 … max 3450
district (fallback <5) 262 3–4
city_fallback (index=1.000) 2 3

→ ≥5 сделок = прямой quarter-median; <5 = район-median; нет района = city (index 1.0) ✓. Порог ≥5 соблюдён для прямого пути.

Spot-check (center>1 / periphery<1):

  • TOP idx 3.2–3.98 — все 66:41:xxx (ЕКБ-центр, cad-region городского округа) ✓
  • BOTTOM idx 0.277–0.287 — 66:58/66:02/66:17 (периферия/другие МО Свердл. обл.) ✓

Spatial-sanity подтверждён. Неклиентский data-шаг (estimator не тронут, риск 0). Один DoD-итем — «Документировано в vault» — из QA-окна не верифицирую (vault), но data-acceptance полностью зелёный. → status/done, closing. Разблокирует #762.

✅ **QA PASS** (PR #792 — data-acceptance проверен напрямую через `postgres-gendesign` на main-БД) `mv_quarter_price_index` (public, main gendesign-БД): **Распределение:** - `n_quarters=1972`, `n_null=0` ✓ - `price_index` ∈ **[0.277, 3.979]**, median 0.615 ✓ (matches worker) - 388 кварталов >1, 1506 <1, 78 =1.0 (fallback) — реалистичный пространственный разброс (центр дорогой, периферия дешевле). **Порог мин-сделок + fallback (basis-иерархия):** | basis | n | n_deals | |---|---|---| | `quarter` (прямой median) | 1708 | **min 5** … max 3450 | | `district` (fallback <5) | 262 | 3–4 | | `city_fallback` (index=1.000) | 2 | 3 | → ≥5 сделок = прямой quarter-median; <5 = район-median; нет района = city (index 1.0) ✓. Порог ≥5 соблюдён для прямого пути. **Spot-check (center>1 / periphery<1):** - TOP idx 3.2–3.98 — все `66:41:xxx` (ЕКБ-центр, cad-region городского округа) ✓ - BOTTOM idx 0.277–0.287 — `66:58/66:02/66:17` (периферия/другие МО Свердл. обл.) ✓ Spatial-sanity подтверждён. Неклиентский data-шаг (estimator не тронут, риск 0). Один DoD-итем — «Документировано в vault» — из QA-окна не верифицирую (vault), но data-acceptance полностью зелёный. → `status/done`, closing. Разблокирует #762.
bot-qa added
status/done
and removed
status/qa
labels 2026-05-30 17:12:40 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
3 participants
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#760
No description provided.