fix(tradein/estimator): честная маркировка quarter-precision дат ДКП + insufficient_data флаг для sell-time-sensitivity (#1995) #2355

Merged
lekss361 merged 1 commit from fix/tradein-actual-deals-real-dates into main 2026-07-04 00:14:02 +00:00
Owner

Closes #1995

Ключевая находка: «01.01.26 у всех сделок» (жалоба из UX-аудита) — НЕ ETL-баг, а честный предел источника: rosreestr open dataset публикует только квартальную гранулярность (period_start_date = первый день квартала), не точную дату сделки — задокументировано в самом комментарии схемы 01_schema_rosreestr_deals.sql ещё на моменте её создания. Живой прод-SQL подтвердил: ровно 9 distinct дат на 9 кварталов, 5510 сделок все датированы 2026-01-01. Второй симптом («за 3 дн до» одинаково у многих строк) — тот же root cause на уровень ниже: раз deal_date константа внутри квартала, для разных несвязанных сделок street_sales_vs_listings() находит один и тот же «ближайший» listing.

Фикс — честная маркировка, без фабрикации/сглаживания данных:

  • AnalogLot.date_precision / SalesListingPair.deal_date_precision ("day"/"quarter") — фронт (парный issue #06a) может показать «Q1 2026» вместо ложной точной даты.
  • SellTimeBucket.insufficient_data (n_lots < settings.sell_time_sensitivity_min_n_lots=10, порог 1-в-1 с существующим прецедентом AvitoImvSummary.thin_market) — немонотонность на малых бакетах помечается честно, не сглаживается статистически.

Важно про rebase: ветка была срезана до мержа #2337 (Group E4 scraper_kit migration — переключение call sites estimator.py на scraper_kit.providers.*, другая, гейтнутая deep-code-reviewer'ом задача другой сессии). Rebase прошёл чисто (0 конфликтов — разные регионы estimator.py), после rebase независимо перезапустил ruff + все тесты, трогающие estimator.py (включая test_estimator_cian_integration.py/test_estimator_imv_integration.py/test_estimator_yandex_integration.py из #2337) — 48/48 passed, взаимодействия не найдено.

Проверено: ruff чисто, 26 relevant tests + широкий cross-check с #2337's тестами (48 passed). code-reviewer APPROVE (backward-compat со старыми persisted-оценками подтверждён — Optional-поле с default None, старый JSONB десериализуется без ошибок).

Closes #1995 **Ключевая находка:** «01.01.26 у всех сделок» (жалоба из UX-аудита) — НЕ ETL-баг, а честный предел источника: rosreestr open dataset публикует только квартальную гранулярность (`period_start_date` = первый день квартала), не точную дату сделки — задокументировано в самом комментарии схемы `01_schema_rosreestr_deals.sql` ещё на моменте её создания. Живой прод-SQL подтвердил: ровно 9 distinct дат на 9 кварталов, 5510 сделок все датированы `2026-01-01`. Второй симптом («за 3 дн до» одинаково у многих строк) — тот же root cause на уровень ниже: раз `deal_date` константа внутри квартала, для разных несвязанных сделок `street_sales_vs_listings()` находит один и тот же «ближайший» listing. **Фикс — честная маркировка, без фабрикации/сглаживания данных:** - `AnalogLot.date_precision` / `SalesListingPair.deal_date_precision` (`"day"`/`"quarter"`) — фронт (парный issue #06a) может показать «Q1 2026» вместо ложной точной даты. - `SellTimeBucket.insufficient_data` (`n_lots < settings.sell_time_sensitivity_min_n_lots=10`, порог 1-в-1 с существующим прецедентом `AvitoImvSummary.thin_market`) — немонотонность на малых бакетах помечается честно, не сглаживается статистически. **Важно про rebase:** ветка была срезана до мержа `#2337` (Group E4 scraper_kit migration — переключение call sites `estimator.py` на `scraper_kit.providers.*`, другая, гейтнутая deep-code-reviewer'ом задача другой сессии). Rebase прошёл чисто (0 конфликтов — разные регионы `estimator.py`), после rebase независимо перезапустил ruff + все тесты, трогающие `estimator.py` (включая `test_estimator_cian_integration.py`/`test_estimator_imv_integration.py`/`test_estimator_yandex_integration.py` из #2337) — 48/48 passed, взаимодействия не найдено. Проверено: ruff чисто, 26 relevant tests + широкий cross-check с #2337's тестами (48 passed). code-reviewer APPROVE (backward-compat со старыми persisted-оценками подтверждён — `Optional`-поле с default None, старый JSONB десериализуется без ошибок).
lekss361 added 1 commit 2026-07-04 00:11:32 +00:00
fix(tradein/estimator): честная маркировка quarter-precision дат ДКП + insufficient_data флаг для sell-time-sensitivity (#1995)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 1m34s
56929d6480
"01.01.26 у всех сделок" — не ETL-баг, а честный предел источника:
rosreestr open dataset публикует только квартальную гранулярность
(period_start_date = первый день квартала), не точную дату сделки
(задокументировано в 01_schema_rosreestr_deals.sql ещё на моменте
создания схемы). Живой SQL подтвердил: 9 distinct дат на 9 кварталов,
5510 сделок все на 2026-01-01.

Фикс — честная маркировка, без фабрикации данных:
- AnalogLot.date_precision / SalesListingPair.deal_date_precision
  ("day"/"quarter") — фронт может показать "Q1 2026" вместо ложной
  точной даты.
- SellTimeBucket.insufficient_data (n_lots < sell_time_sensitivity_min_n_lots=10,
  паттерн 1-в-1 с существующим AvitoImvSummary.thin_market) —
  немонотонность на малых бакетах помечается, не сглаживается статистически.
lekss361 merged commit 758d7c6bf8 into main 2026-07-04 00:14:02 +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#2355
No description provided.