[tradein][data] avito 54% NULL lat → невидим PostGIS-радиусу: geo-backfill + dedup на ингесте (рычаг точности массы оценок) #1967

Closed
opened 2026-06-27 08:51:59 +00:00 by lekss361 · 3 comments
Owner

Из стратегического аудита 2026-06-27. Наибольший рычаг точности массовых оценок.

Проблема

  • avito 54.2% NULL lat — половина крупнейшего источника (40k листингов) невидима для PostGIS ST_DWithin радиус-поиска аналогов → не попадает в оценку. Прямо бьёт по точности там, где больше всего объёма.
  • Дубли (yandex 797 пар до 3×, cian 93) корраптят median и раздувают n_analogs (#1871) — часть с NULL source_id обходят unique-constraint. (radius-path dedup частично в #1880, но ингест-дедуп нужен.)

DoD

  • avito geo-backfill: довести покрытие координат (инструменты есть — backfill_listings_coords_geoportal.py street+house match, cadastral_geo_match.py). Геокодить на ингесте (не post-hoc), чтобы новые листинги сразу имели lat/lon.
  • dedup на ингесте: когда source_id NULL/нестабилен — content-ключ (norm address + area + floor + price); не плодить дубли в active.
  • Замер: avito geo-coverage до/после; n_analogs до/после на тест-наборе адресов; sanity медианы.

Связано: первопричина «точность упирается в данные, не в формулу». Refs аудит 0627, #1871, #1840 (URL-EKB-фильтр), #1880 (radius dedup).

Из стратегического аудита 2026-06-27. **Наибольший рычаг точности массовых оценок.** ## Проблема - **avito 54.2% NULL lat** — половина крупнейшего источника (40k листингов) невидима для PostGIS ST_DWithin радиус-поиска аналогов → не попадает в оценку. Прямо бьёт по точности там, где больше всего объёма. - **Дубли** (yandex 797 пар до 3×, cian 93) корраптят median и раздувают `n_analogs` (#1871) — часть с NULL source_id обходят unique-constraint. (radius-path dedup частично в #1880, но ингест-дедуп нужен.) ## DoD - **avito geo-backfill**: довести покрытие координат (инструменты есть — `backfill_listings_coords_geoportal.py` street+house match, `cadastral_geo_match.py`). Геокодить на ингесте (не post-hoc), чтобы новые листинги сразу имели lat/lon. - **dedup на ингесте**: когда source_id NULL/нестабилен — content-ключ (norm address + area + floor + price); не плодить дубли в active. - Замер: avito geo-coverage до/после; n_analogs до/после на тест-наборе адресов; sanity медианы. Связано: первопричина «точность упирается в данные, не в формулу». Refs аудит 0627, #1871, #1840 (URL-EKB-фильтр), #1880 (radius dedup).
lekss361 added the
data
priority/p1
scope/backend
scrapers
tradein
labels 2026-06-27 08:53:17 +00:00
Author
Owner

Свежий замер 2026-06-27 (ssh→tradein-postgres, active listings) подтверждает проблему:

  • avito geo (lat NOT NULL): 53% active~47% (≈14k из 30327 активных) без координат → невидимы для PostGIS ST_DWithin.
  • Для контраста: cian/yandex geo = 100% active (они отдают координаты на SERP; avito намеренно NULL на SERP-карточке avito.py:2001-2002, заполняется только geocode-cron'ом, который не успевает).

Привязка к аудиту покрытия полей: #2011 (tracking). Этот тикет остаётся владельцем geo-backfill — дублей не завожу.

Свежий замер 2026-06-27 (ssh→tradein-postgres, active listings) подтверждает проблему: - **avito geo (lat NOT NULL): 53% active** → **~47% (≈14k из 30327 активных) без координат** → невидимы для PostGIS ST_DWithin. - Для контраста: cian/yandex geo = 100% active (они отдают координаты на SERP; avito намеренно NULL на SERP-карточке `avito.py:2001-2002`, заполняется только geocode-cron'ом, который не успевает). Привязка к аудиту покрытия полей: #2011 (tracking). Этот тикет остаётся владельцем geo-backfill — дублей не завожу.
Author
Owner

Working on this (автономный проход по backlog) — ветка fix/tradein-avito-geo-backfill. Учитывая размер DoD (2 разных концерна: geo-backfill/ingest-геокодинг + ingest-дедуп), делаю первым геокодинг-часть (наибольший рычаг per формулировка issue); dedup-на-ингесте — отдельным follow-up, если не влезет в этот заход.

Working on this (автономный проход по backlog) — ветка `fix/tradein-avito-geo-backfill`. Учитывая размер DoD (2 разных концерна: geo-backfill/ingest-геокодинг + ingest-дедуп), делаю первым геокодинг-часть (наибольший рычаг per формулировка issue); dedup-на-ингесте — отдельным follow-up, если не влезет в этот заход.
Author
Owner

Закрыто PR #2346. Важная поправка метрики для будущих читателей: живой прод-замер на момент фикса (2026-07-04) показал NULL lat = 4.3% (393/9181 active avito), а не 47% как в исходной постановке issue (аудит 06-27) — разрыв уже почти закрыт побочно dedup-миграциями 159-167 (active avito-set 30k→9.2k) и nightly geocode_missing_listings (крутится с PR #1549). Задача была уже маргинальной на момент выполнения, не "наибольшим рычагом" как изначально казалось.

Сделано: подключил существующий, но никогда не запускавшийся recurring точный street+house геокодер (backfill_listings_coords_geoportal.py, #1841) в scheduler, окном перед грубым Nominatim-геокодом. Эффект — единицы-десятки строк (текущих live-кандидатов ~210), но устраняет up-to-24h задержку для новых NULL-coord листингов.

Dedup-на-ингесте (вторая половина исходного DoD) — НЕ сделан, отдельный follow-up при необходимости.

Закрыто PR #2346. Важная поправка метрики для будущих читателей: живой прод-замер на момент фикса (2026-07-04) показал NULL lat = **4.3%** (393/9181 active avito), а не 47% как в исходной постановке issue (аудит 06-27) — разрыв уже почти закрыт побочно dedup-миграциями 159-167 (active avito-set 30k→9.2k) и nightly `geocode_missing_listings` (крутится с PR #1549). Задача была уже маргинальной на момент выполнения, не "наибольшим рычагом" как изначально казалось. Сделано: подключил существующий, но никогда не запускавшийся recurring точный street+house геокодер (`backfill_listings_coords_geoportal.py`, #1841) в scheduler, окном перед грубым Nominatim-геокодом. Эффект — единицы-десятки строк (текущих live-кандидатов ~210), но устраняет up-to-24h задержку для новых NULL-coord листингов. Dedup-на-ингесте (вторая половина исходного DoD) — НЕ сделан, отдельный follow-up при необходимости.
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#1967
No description provided.