docs(tradein/estimator): докстринг домового IMV-якоря говорит правду о таблице (#2674)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 11s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m24s
CI / frontend-tests (pull_request) Has been skipped

`_fetch_house_imv_anchor` обещал: «house_imv_evaluations популирована (~2951 домов,
fresh)». Неправда по обоим пунктам. Утверждение пережило и #2677 (#2816) — тот
дописал ниже блок про renovation_type, а ложь строкой выше прочитал и оставил.

Заменено на замер с датой (2026-08-12, прод):
  · 2680 строк, по одной на дом (UNIQUE(house_id) — поэтому ORDER BY в запросе
    выбирает из ≤1 кандидата, а не ранжирует);
  · 2633 (98.2%) старше 40 суток, 2366 из них — один прогон 24.05; свежих 47;
  · дореформенные спрошены с литералом renovation_type='cosmetic' (мода по
    объявлениям дома совпала у 972, разошлась у 1217, у 444 моды нет) и с
    дефолтом house_type='panel' (тип разошёлся у 74 из 2633).

Плюс записаны два решения, отвергнутые замером, — чтобы их не предлагали заново:
  · гейт эры снял бы якорь у 224 оценок из 224 (все band-совместимые строки на
    проде дореформенные, свежих 47 не хватает ни на одну оценку);
  · массовая переоценка упирается в 1628 домов уже в imv_status='ok' при очереди
    7144 и темпе ~25/прогон — и корень всё равно не в свежести, а в базисах
    ремонта, что и починено в #2677.

Только докстринг, исполняемого кода не касается.

Refs #2674, #2677
This commit is contained in:
bot-backend 2026-08-13 01:21:27 +05:00
parent 13ce1045bb
commit d823ba10c1

View file

@ -1184,11 +1184,32 @@ def _fetch_house_imv_anchor(
"""Достаёт РЕАЛЬНУЮ Avito IMV-оценку target-дома из `house_imv_evaluations`.
В отличие от `avito_imv_evaluations` (keyed estimate_id пустая, on-demand
скрейп), `house_imv_evaluations` популирована (~2951 домов, fresh) и keyed по
house_id. Резолвим строку: WHERE house_id = target_house_id, предпочитаем
запись с ближайшими rooms+area (минимизируем |Δrooms|*10 + |Δarea%|), иначе
самую свежую (fetched_at DESC). Best-effort: None при любой ошибке / отсутствии
house_id / пустой таблице estimator продолжает на гео-tier'ах (no regress).
скрейп), `house_imv_evaluations` keyed по house_id. Резолвим строку:
WHERE house_id = target_house_id + band-guard по rooms/area. Best-effort:
None при любой ошибке / отсутствии house_id / пустой таблице estimator
продолжает на гео-tier'ах (no regress).
СОСТОЯНИЕ ТАБЛИЦЫ, замер 2026-08-12 (прежний текст обещал «популирована
~2951 домов, fresh» неправда по обоим пунктам, #2674):
2680 строк, одна на дом (house_imv_eval_house_uniq_idx UNIQUE(house_id)
поэтому ORDER BY ниже выбирает из 1 кандидата, а не ранжирует). 2633 из
них (98.2%) старше 40 суток, 2366 один прогон 2026-05-24; свежих, после
фикса параметров 2026-08-06, всего 47.
Дореформенные 2633 спрошены у Авито с ЛИТЕРАЛОМ renovation_type='cosmetic'
и с дефолтом house_type='panel' при нераспознанном типе: мода ремонта по
объявлениям того же дома совпала лишь у 972 (36.9%), разошлась у 1217
(46.2%), у 444 моды нет; тип дома разошёлся у 74 из 2633 (46 раз ушла
«панель» вместо «монолита»).
ЧТО С ЭТИМ РЕШЕНО (замер на проде, 1081 персистированная оценка):
· Гейт «не брать дореформенные строки» ОТКЛОНЁН: band-совместимая строка
находится у 224 оценок, и все 224 дореформенные. Гейт снял бы якорь у
224 из 224, то есть просто выключил бы механизм.
· Массовая переоценка не чинит корень и упирается в очередь: 1628 из
2633 домов уже в imv_status='ok', а батч берёт только pending/
transient_error, где сейчас 7144 дома при темпе ~25/прогон.
· Корень не свежесть, а разные базисы ремонта; починено в #2677
(`_anchor_repair_factor`), см. ниже.
Returns dict {recommended_price, lower_price, higher_price, market_count,
rooms, area_m2, renovation_type} или None.