Compare commits
2 commits
d823ba10c1
...
95e3b209ce
| Author | SHA1 | Date | |
|---|---|---|---|
| 95e3b209ce | |||
| 81980da4d4 |
1 changed files with 31 additions and 9 deletions
|
|
@ -1158,11 +1158,34 @@ def _fetch_house_imv_anchor(
|
||||||
"""Достаёт РЕАЛЬНУЮ Avito IMV-оценку target-дома из `house_imv_evaluations`.
|
"""Достаёт РЕАЛЬНУЮ Avito IMV-оценку target-дома из `house_imv_evaluations`.
|
||||||
|
|
||||||
В отличие от `avito_imv_evaluations` (keyed estimate_id — пустая, on-demand
|
В отличие от `avito_imv_evaluations` (keyed estimate_id — пустая, on-demand
|
||||||
скрейп), `house_imv_evaluations` популирована (~2951 домов, fresh) и keyed по
|
скрейп), `house_imv_evaluations` keyed по house_id. Резолвим строку:
|
||||||
house_id. Резолвим строку: WHERE house_id = target_house_id, предпочитаем
|
WHERE house_id = target_house_id + band-guard по rooms/area. Best-effort:
|
||||||
запись с ближайшими rooms+area (минимизируем |Δrooms|*10 + |Δarea%|), иначе
|
None при любой ошибке / отсутствии house_id / пустой таблице — estimator
|
||||||
самую свежую (fetched_at DESC). Best-effort: None при любой ошибке / отсутствии
|
продолжает на гео-tier'ах (no regress).
|
||||||
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/прогон.
|
||||||
|
· Корень — не свежесть, а РАЗНЫЕ БАЗЫ РЕМОНТА: median_price к моменту
|
||||||
|
блендa уже умножена на _repair_coefficient(repair_state), а якорь стоит
|
||||||
|
в том классе отделки, в котором строку спросили. Чинится приведением
|
||||||
|
якоря к базе цели (#2677).
|
||||||
|
|
||||||
Returns dict {recommended_price, lower_price, higher_price, market_count,
|
Returns dict {recommended_price, lower_price, higher_price, market_count,
|
||||||
rooms, area_m2} или None.
|
rooms, area_m2} или None.
|
||||||
|
|
@ -3266,8 +3289,7 @@ def _price_from_inputs(
|
||||||
)
|
)
|
||||||
if same_quarter_ratio > settings.estimate_quarter_match_skip_ratio:
|
if same_quarter_ratio > settings.estimate_quarter_match_skip_ratio:
|
||||||
logger.info(
|
logger.info(
|
||||||
"quarter_index: Guard-2 skip (same-quarter ratio=%.2f > %.2f)"
|
"quarter_index: Guard-2 skip (same-quarter ratio=%.2f > %.2f) for %s",
|
||||||
" for %s",
|
|
||||||
same_quarter_ratio,
|
same_quarter_ratio,
|
||||||
settings.estimate_quarter_match_skip_ratio,
|
settings.estimate_quarter_match_skip_ratio,
|
||||||
target_quarter,
|
target_quarter,
|
||||||
|
|
@ -3319,7 +3341,7 @@ def _price_from_inputs(
|
||||||
analogs_with_qi,
|
analogs_with_qi,
|
||||||
)
|
)
|
||||||
explanation = (explanation or "") + (
|
explanation = (explanation or "") + (
|
||||||
f" Учтена локация квартала" f" (индекс цен квартала ×{qi_factor:.2f})."
|
f" Учтена локация квартала (индекс цен квартала ×{qi_factor:.2f})."
|
||||||
)
|
)
|
||||||
sources_used_pre = sorted(set(sources_used_pre) | {"quarter_index"})
|
sources_used_pre = sorted(set(sources_used_pre) | {"quarter_index"})
|
||||||
|
|
||||||
|
|
@ -6766,7 +6788,7 @@ def _enforce_zero_analog_low(
|
||||||
"""
|
"""
|
||||||
if n_analogs == 0 and confidence != "low":
|
if n_analogs == 0 and confidence != "low":
|
||||||
logger.warning(
|
logger.warning(
|
||||||
"ghost_anchor_guard #1871: forcing confidence 'low' (was %s, " "median=%s, sources=%s)",
|
"ghost_anchor_guard #1871: forcing confidence 'low' (was %s, median=%s, sources=%s)",
|
||||||
confidence,
|
confidence,
|
||||||
median_price,
|
median_price,
|
||||||
sources_used,
|
sources_used,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue