feat(mera/estimate): характеристики дома из справочника, а не только из формы #3242

Merged
lekss361 merged 1 commit from feat/3234-house-facts-into-estimate into main 2026-08-29 18:06:18 +00:00
Owner

Summary

Tier H в _fetch_analogs («тот же класс дома»: год ±15 + этажность ±30%) написан давно, но его докстринг честно предупреждал: «пропускается если year_built или total_floors неизвестны». Он и пропускался:

  • total_floors брался исключительно из payload, фолбэка не было вообще;
  • фолбэк года шёл в Overpass/OSM (get_house_metadata), а в кэш-таблице house_metadata лежит 68 строк на всю базу.

При этом target_house_id резолвится строкой выше — дом известен, просто его характеристики никто не читал.

После наполнения справочника из дампа ГИС ЖКХ + DOM.РФ (29.08) в houses год есть у 86.8% домов, этажность — у 98.3%, материал стен — у 77%.

Что меняется: приоритет payload → houses → OSM. Пользователь главнее справочника. get_house_metadata вызывается только если после payload+houses что-то осталось неизвестным — то есть внешний вызов с таймаутом в большинстве случаев больше не тратится. Год из справочника проходит тот же _sanitize_build_year. target_total_floors прокинут во все 5 вызовов _fetch_analogs (включая тот, что внутри каскада релаксации).

Замеры (прод, не оценки на глаз)

Оценок всего 1123
Шли без года от пользователя 450, справочник знает для 301
Шли без этажности 240, справочник знает для 108

Цена смешения классов домов в пуле аналогов, на 466 оценках с восстановимым пулом:

сдвиг медианы при разделении полос этажности
p50 2.28%
p75 7.16%
p90 16.34%
больше 5% 35% оценок
больше 10% 18% оценок

Систематического смещения нет (медиана сдвига 0.00%) — смешение классов даёт не сдвиг цены, а шум.

Test plan

  • ruff check app tests — чисто
  • pytest tests/test_3234_house_facts_fallback.py — 9 passed
  • Проверка на вырожденность: при сломанном фолбэке падают 3 из 9 тестов
  • pytest -k "estimator or analog or 3234" — 638 passed, регрессий нет
  • После деплоя — проверить срабатывание по новой INFO-строке house facts fallback house_id=...

Related #3234

## Summary Tier H в `_fetch_analogs` («тот же класс дома»: год ±15 + этажность ±30%) написан давно, но его докстринг честно предупреждал: «пропускается если year_built или total_floors неизвестны». Он и пропускался: - `total_floors` брался **исключительно** из `payload`, фолбэка не было вообще; - фолбэк года шёл в Overpass/OSM (`get_house_metadata`), а в кэш-таблице `house_metadata` лежит **68 строк** на всю базу. При этом `target_house_id` резолвится строкой выше — дом известен, просто его характеристики никто не читал. После наполнения справочника из дампа ГИС ЖКХ + DOM.РФ (29.08) в `houses` год есть у 86.8% домов, этажность — у 98.3%, материал стен — у 77%. **Что меняется:** приоритет `payload → houses → OSM`. Пользователь главнее справочника. `get_house_metadata` вызывается только если после payload+houses что-то осталось неизвестным — то есть внешний вызов с таймаутом в большинстве случаев больше не тратится. Год из справочника проходит тот же `_sanitize_build_year`. `target_total_floors` прокинут во все 5 вызовов `_fetch_analogs` (включая тот, что внутри каскада релаксации). ## Замеры (прод, не оценки на глаз) | | | |---|---| | Оценок всего | 1123 | | Шли без года от пользователя | 450, справочник знает для **301** | | Шли без этажности | 240, справочник знает для **108** | Цена смешения классов домов в пуле аналогов, на 466 оценках с восстановимым пулом: | сдвиг медианы при разделении полос этажности | | |---|---| | p50 | 2.28% | | p75 | 7.16% | | p90 | **16.34%** | | больше 5% | 35% оценок | | больше 10% | 18% оценок | Систематического смещения нет (медиана сдвига 0.00%) — смешение классов даёт не сдвиг цены, а шум. ## Test plan - [x] `ruff check app tests` — чисто - [x] `pytest tests/test_3234_house_facts_fallback.py` — 9 passed - [x] Проверка на вырожденность: при сломанном фолбэке падают 3 из 9 тестов - [x] `pytest -k "estimator or analog or 3234"` — 638 passed, регрессий нет - [ ] После деплоя — проверить срабатывание по новой INFO-строке `house facts fallback house_id=...` Related #3234
lekss361 added 1 commit 2026-08-29 18:00:42 +00:00
feat(mera/estimate): характеристики дома из справочника, а не только из формы
All checks were successful
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 10s
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 4m56s
ca3504059e
Tier H в `_fetch_analogs` («тот же класс дома»: год ±15 + этажность ±30%)
существует давно, но его докстринг честно предупреждал: «пропускается если
year_built или total_floors неизвестны». Он и пропускался — потому что кормили
его так:

- `total_floors` брался ИСКЛЮЧИТЕЛЬНО из `payload`, фолбэка не было вообще;
- фолбэк года шёл в Overpass/OSM (`get_house_metadata`), а в кэше
  `house_metadata` лежит 68 строк на всю базу.

При этом `target_house_id` резолвится строкой выше — дом известен, просто его
характеристики никто не читал. После наполнения справочника из ГИС ЖКХ и DOM.РФ
в `houses` год есть у 86.8% домов, этажность — у 98.3%.

Теперь приоритет: payload → houses → OSM. Пользователь по-прежнему главнее
справочника; Overpass дёргается только если после первых двух что-то осталось
неизвестным, то есть в подавляющем большинстве случаев внешний вызов с
таймаутом больше не тратится. Год из справочника проходит тот же
`_sanitize_build_year`, что и раньше.

Замер на 1123 прошлых оценках: 450 шли без года (для 301 справочник его знает),
240 без этажности (знаем для 108). Цена смешения классов домов в пуле аналогов —
на 466 оценках с восстановимым пулом медианный сдвиг медианы 2.28%, p90 = 16.3%,
у 18% оценок больше 10%. Систематического смещения нет: смешение даёт шум.
lekss361 merged commit 6dd8d131ae into main 2026-08-29 18:06:18 +00:00
lekss361 deleted branch feat/3234-house-facts-into-estimate 2026-08-29 18:06:18 +00:00
Sign in to join this conversation.
No reviewers
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#3242
No description provided.