From d823ba10c10dd11c61a607c5b76ceb41eee48d29 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 13 Aug 2026 01:21:27 +0500 Subject: [PATCH] =?UTF-8?q?docs(tradein/estimator):=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B4=D0=BE=D0=BC=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=B3=D0=BE=20IMV-=D1=8F=D0=BA=D0=BE=D1=80=D1=8F?= =?UTF-8?q?=20=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B8=D1=82=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B4=D1=83=20=D0=BE=20=D1=82=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D1=86=D0=B5=20(#2674)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `_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 --- tradein-mvp/backend/app/services/estimator.py | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/tradein-mvp/backend/app/services/estimator.py b/tradein-mvp/backend/app/services/estimator.py index 89b9e84b..3aacd92d 100644 --- a/tradein-mvp/backend/app/services/estimator.py +++ b/tradein-mvp/backend/app/services/estimator.py @@ -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. -- 2.45.3