[tradein] Эстиматор: same-building anchor хрупок (один house_id, exclude avito) — резолвить через фрагменты/кадастр + same-house avito #1774

Closed
opened 2026-06-19 08:26:04 +00:00 by bot-backend · 2 comments
Collaborator

Симптом: _compute_same_building_anchor/_fetch_anchor_comps резолвят дом по raw-адресу и ломаются о грязные адреса (см. соседний issue). Плюс гео-компы (ST_DWithin 1км) исключают avito (фейк-jitter гео, estimator.py:8-9) → same-building avito-объявления (12 шт на доме 11110) НЕ участвуют, хотя дом известен.

Фикс: (а) собирать same-building набор по ВСЕМ записям houses одного дома (по кадастру/нормализованному street+номер), а не одному house_id; (б) включать same-house avito-листинги по совпадению дома (их фейк-гео не важно, если house_id/кадастр совпал). Эстиматор покрыт тестами (pytest) — менять с тестами.


Доказательная база (live prod, cad-кейс ЖК Суходольский квартал, ул. Евгения Савкова 29, ЕКБ; cian 330047129):

  • Один физический дом размазан на несколько houses: 6679=«…Евгения Савкова, 29А» (кадастр 66:41:0313010:11396, сюда матчится cian 330047129), 11110=«ул. Евгения Савкова,29» (12 listings, avito), 7019=«улица Евгения Савкова» (без номера, 42 listings, catch-all). «29»/«29А» не объединены.
  • listings по «Савкова»: avito 330 (41 unmatched), cian 97 (35 unmatched), yandex 48 (4 unmatched).
  • cian 330047129 задвоен: одна копия → house 6679, другая → house_id_fk=NULL.
  • estimator.py:1441 сам фиксирует проблему: «один дом дробится на несколько fk (Хохрякова 48 = 7085/9878/12797)».
**Симптом:** `_compute_same_building_anchor`/`_fetch_anchor_comps` резолвят дом по raw-адресу и ломаются о грязные адреса (см. соседний issue). Плюс гео-компы (ST_DWithin 1км) **исключают avito** (фейк-jitter гео, estimator.py:8-9) → same-building avito-объявления (12 шт на доме 11110) НЕ участвуют, хотя дом известен. **Фикс:** (а) собирать same-building набор по ВСЕМ записям houses одного дома (по кадастру/нормализованному street+номер), а не одному house_id; (б) включать same-house avito-листинги по совпадению дома (их фейк-гео не важно, если house_id/кадастр совпал). Эстиматор покрыт тестами (pytest) — менять с тестами. --- **Доказательная база (live prod, cad-кейс ЖК Суходольский квартал, ул. Евгения Савкова 29, ЕКБ; cian 330047129):** - Один физический дом размазан на несколько `houses`: `6679`=«…Евгения Савкова, **29А**» (кадастр 66:41:0313010:11396, сюда матчится cian 330047129), `11110`=«ул. Евгения Савкова,**29**» (12 listings, avito), `7019`=«улица Евгения Савкова» (**без номера**, 42 listings, catch-all). «29»/«29А» не объединены. - listings по «Савкова»: avito 330 (41 unmatched), cian 97 (35 unmatched), yandex 48 (4 unmatched). - cian 330047129 **задвоен**: одна копия → house 6679, другая → `house_id_fk=NULL`. - `estimator.py:1441` сам фиксирует проблему: «один дом дробится на несколько fk (Хохрякова 48 = 7085/9878/12797)».
bot-backend added the
bug
tradein
scope/backend
labels 2026-06-19 08:26:04 +00:00
Author
Collaborator

PR открыт: #1776

Корень (диагностика прод, дом «Евгения Савкова 29»): Tier A same-building anchor матчит по тексту адреса (не по house_id, фрагментация дома его не ломает), НО гард #1186 (listing_segment IS NULL OR ='vtorichka') выкидывал 4 cian-объявления в том же доме, помеченные novostroyki — хотя их sale_type='free' (свободная продажа собственником) = вторичные перепродажи/переуступки в сданном доме. Цены совпадают с вторичкой.

Фикс (Tier A only, за флагом): впускаем novostroyki при secondary_count>=primary_count (secondary-dominant = дом сдан). Pure/primary-dominated → гард #1186 сохранён. + дедуп комплов по (source, source_id) — убирает дубль source_id=330047129.

Tier C / радиус / ratio не тронуты. 84 unit-теста зелёные. Часть «эксклюзии avito» из заголовка НЕ нужна: Tier A не исключает avito (исключение avito — только радиусный гео-путь из-за jitter-координат). Резолв «один house_id» в Tier A тоже не проблема — он по адресу. Так что #1774 закрывается этим PR; фрагментация домов = #1772.

PR открыт: https://git.gendsgn.ru/lekss361/gendesign/pulls/1776 **Корень (диагностика прод, дом «Евгения Савкова 29»):** Tier A same-building anchor матчит по тексту адреса (не по house_id, фрагментация дома его не ломает), НО гард #1186 `(listing_segment IS NULL OR ='vtorichka')` выкидывал 4 cian-объявления в том же доме, помеченные `novostroyki` — хотя их `sale_type='free'` (свободная продажа собственником) = вторичные перепродажи/переуступки в сданном доме. Цены совпадают с вторичкой. **Фикс (Tier A only, за флагом):** впускаем novostroyki при `secondary_count>=primary_count` (secondary-dominant = дом сдан). Pure/primary-dominated → гард #1186 сохранён. + дедуп комплов по (source, source_id) — убирает дубль source_id=330047129. Tier C / радиус / ratio не тронуты. 84 unit-теста зелёные. Часть «эксклюзии avito» из заголовка НЕ нужна: Tier A не исключает avito (исключение avito — только радиусный гео-путь из-за jitter-координат). Резолв «один house_id» в Tier A тоже не проблема — он по адресу. Так что #1774 закрывается этим PR; фрагментация домов = #1772.
Author
Collaborator

Закрыто — фикс смержен PR #1776 (merge ee27034): Tier-A допускает same-building novostroyki-перепродажи (secondary-dominant gate, estimator.py:1537-1578) + (source, source_id) dedup (схлопывает дубль cian 330047129).

✅ Закрыто — фикс смержен PR #1776 (merge ee27034): Tier-A допускает same-building novostroyki-перепродажи (secondary-dominant gate, estimator.py:1537-1578) + `(source, source_id)` dedup (схлопывает дубль cian 330047129).
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#1774
No description provided.