fix(tradein/sale-share): гард по этажности — отсечь near-neighbor mis-match #2084

Merged
lekss361 merged 1 commit from fix/tradein-floors-guard into main 2026-06-28 21:32:24 +00:00
Owner

Проблема (Мраморская 34к4)

Гео-фильтр ≤300м (мигр.150) слишком широк для плотной застройки: к 5-этажному дому «Мраморская 34к4» примагничены чужие листинги 9/16/19-этажных зданий (Благодатская 15, Мраморская 6, башни) на 229-282м — все <300м, фильтр их не отсекал → «не те адреса в карточках».

Сигнал чёткий: дом 5 этажей, листинги заявляют total_floors 9/16/19 → другое здание.

Фикс — гард по этажности

  • мигр.152: +houses.zhkh_floors (smallint, бэкфилл из zhkh_floors_raw: «10-30»/«8,чердак» → max int). Во v_building_sale_share во ВСЕ 5 FILTER (числители + медианы) добавлен гард, рядом с гео-фильтром:
    AND (l.total_floors IS NULL OR COALESCE(hg.zhkh_floors, hg.total_floors) IS NULL
         OR abs(l.total_floors - COALESCE(hg.zhkh_floors, hg.total_floors)) <= 3)
    
    Гео-фильтр 300м сохранён. ЖКХ-этажность приоритетнее total_floors.
  • buildings_query.build_listings_query: тот же гард в детальной выдаче.

Keep-логика: листинг с неизвестной этажностью ИЛИ дом без этажности → оставляем; режем только явное расхождение >3.

Импакт (прод-замер)

  • Отсекает 2754 листинга (12%) — height-mismatched mis-matches.
  • Покрытие этажности: 75% домов total_floors, 73% ЖКХ-floors (COALESCE → ~80%+).

Природа

Это паллиатив (чистит метрику+карточки), как и гео-фильтр. Корень — house_id_fk неверен. Полная корректность маппа = P4c (мерж дублей домов через tradein_canon_addr — Вайнера/Мраморская 34к2/34к4 ×2) + P4b ре-backfill. Гард убирает видимые «чужие адреса» сейчас.

Проверки

  • ruff clean; pytest test_buildings_api → 26 green.
  • Серия sale-share-фиксов: #2077 ЖКХ, #2080 гео, #2082 матчер, #2083 дедуп+алиасы, этот = гард этажей.

После мержа

Verify: Мраморская 34к4 карточка без 9/16/19-эт. чужих; новый ≥5% распределение.

## Проблема (Мраморская 34к4) Гео-фильтр ≤300м (мигр.150) **слишком широк для плотной застройки**: к 5-этажному дому «Мраморская 34к4» примагничены чужие листинги **9/16/19-этажных** зданий (Благодатская 15, Мраморская 6, башни) на **229-282м** — все <300м, фильтр их не отсекал → «не те адреса в карточках». Сигнал чёткий: дом 5 этажей, листинги заявляют `total_floors` 9/16/19 → другое здание. ## Фикс — гард по этажности - **мигр.152**: `+houses.zhkh_floors` (smallint, бэкфилл из `zhkh_floors_raw`: «10-30»/«8,чердак» → max int). Во `v_building_sale_share` во ВСЕ 5 FILTER (числители + медианы) добавлен гард, рядом с гео-фильтром: ``` AND (l.total_floors IS NULL OR COALESCE(hg.zhkh_floors, hg.total_floors) IS NULL OR abs(l.total_floors - COALESCE(hg.zhkh_floors, hg.total_floors)) <= 3) ``` Гео-фильтр 300м сохранён. ЖКХ-этажность приоритетнее `total_floors`. - **`buildings_query.build_listings_query`**: тот же гард в детальной выдаче. Keep-логика: листинг с неизвестной этажностью ИЛИ дом без этажности → оставляем; режем только явное расхождение >3. ## Импакт (прод-замер) - Отсекает **2754 листинга (12%)** — height-mismatched mis-matches. - Покрытие этажности: 75% домов `total_floors`, 73% ЖКХ-floors (COALESCE → ~80%+). ## Природа Это **паллиатив** (чистит метрику+карточки), как и гео-фильтр. Корень — `house_id_fk` неверен. Полная корректность маппа = **P4c** (мерж дублей домов через `tradein_canon_addr` — Вайнера/Мраморская 34к2/34к4 ×2) + **P4b** ре-backfill. Гард убирает видимые «чужие адреса» сейчас. ## Проверки - ruff clean; `pytest test_buildings_api` → 26 green. - Серия sale-share-фиксов: ✅ #2077 ЖКХ, ✅ #2080 гео, ✅ #2082 матчер, ✅ #2083 дедуп+алиасы, **этот** = гард этажей. ## После мержа Verify: Мраморская 34к4 карточка без 9/16/19-эт. чужих; новый ≥5% распределение.
lekss361 added 1 commit 2026-06-28 21:31:39 +00:00
fix(tradein/sale-share): гард по этажности — отсечь near-neighbor mis-match
All checks were successful
CI / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
ebc3813648
Гео-фильтр ≤300м (мигр.150) широк для плотной застройки: к 5-этажному дому
(Мраморская 34к4) примагничены чужие листинги 9/16/19-этажных башен (Благодатская
15, Мраморская 6) на 229-282м — все <300м, фильтр не отсекал.

- мигр.152: +houses.zhkh_floors (parse zhkh_floors_raw "10-30"→max); гард во view
  во всех 5 FILTER: считать листинг только если abs(l.total_floors -
  COALESCE(zhkh_floors, total_floors)) <= 3 (или этажность неизвестна). Гео-фильтр
  300м сохранён.
- buildings_query.build_listings_query: тот же гард в детальной выдаче.

Прод-замер: отсекает 2754 листинга (12%) height-mismatched. Покрытие этажности
75% total_floors / 73% ЖКХ. ruff clean, pytest 26 green.
lekss361 merged commit a96af4c19c into main 2026-06-28 21:32:24 +00:00
lekss361 deleted branch fix/tradein-floors-guard 2026-06-28 21:32:24 +00:00
Sign in to join this conversation.
No reviewers
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#2084
No description provided.