domklik price history: 42 скачка ровно ×10 (потерянный разряд в цене источника) — миграция 285 их честно пересчитала в +900 %, гейт лоадера такие занулит; п… #3376

Closed
opened 2026-09-05 20:32:47 +00:00 by bot-backend · 1 comment
Collaborator

После миграции 285 (PR #3370, 05.09) у строк загрузчика domklik осталось 42 значения |diff_percent| > 100 (было 10 335 рублёвых). Все 42 совпадают с честным пересчётом из price_rub, диапазон 107–912 %, и это скачки ровно ×10: 420 000 → 4 200 000, 1 400 000 → 14 000 000, 6 390 000 → 64 700 000 — потерянный разряд в priceHistory источника, а не рубли и не рыночное движение.

Расхождение поведений: гейт validate_diff_percent (тот же PR) при НОВОЙ записи такое занулит (|x|>100 = «другая величина»), а миграция пересчитала из цен и оставила. Плюс сама цена price_rub в этих строках битая (×10), и она попадает в любую аналитику по истории цен.

Что решить

  1. Малое: применить тот же гейт задним числом (миграция 286: |diff_percent| > 100 AND change_time <> recorded_at AND source='domklik' → NULL; 42 строки) — единообразие с лоадером.
  2. Честнее: пометить/исключить сами битые цены — признак «соседняя цена ровно в 10 раз» (price_rub / prev IN (10, 0.1) с допуском) → флаг или NULL у price_rub строки-выброса; проверить, не читает ли эти строки оценщик/витрина (история цен в §04?).
  3. Замер: сколько таких ×10 у cian/avito/yandex историй (гейт общий, но миграция была только domklik).

Приёмка

  • count(*) FILTER (WHERE abs(diff_percent) > 100) у строк загрузчика domklik → 0 после выбранного варианта;
  • аналитика #3223 (медианный торг) без строк-выбросов ×10 — сравнить до/после.

Refs #3225, PR #3370.

После миграции 285 (PR #3370, 05.09) у строк загрузчика domklik осталось **42** значения `|diff_percent| > 100` (было 10 335 рублёвых). Все 42 совпадают с честным пересчётом из `price_rub`, диапазон 107–912 %, и это скачки ровно **×10**: `420 000 → 4 200 000`, `1 400 000 → 14 000 000`, `6 390 000 → 64 700 000` — потерянный разряд в `priceHistory` источника, а не рубли и не рыночное движение. Расхождение поведений: гейт `validate_diff_percent` (тот же PR) при НОВОЙ записи такое занулит (|x|>100 = «другая величина»), а миграция пересчитала из цен и оставила. Плюс сама цена `price_rub` в этих строках битая (×10), и она попадает в любую аналитику по истории цен. ## Что решить 1. Малое: применить тот же гейт задним числом (миграция 286: `|diff_percent| > 100 AND change_time <> recorded_at AND source='domklik'` → NULL; 42 строки) — единообразие с лоадером. 2. Честнее: пометить/исключить сами битые цены — признак «соседняя цена ровно в 10 раз» (`price_rub / prev IN (10, 0.1)` с допуском) → флаг или NULL у `price_rub` строки-выброса; проверить, не читает ли эти строки оценщик/витрина (история цен в §04?). 3. Замер: сколько таких ×10 у cian/avito/yandex историй (гейт общий, но миграция была только domklik). ## Приёмка - [ ] `count(*) FILTER (WHERE abs(diff_percent) > 100)` у строк загрузчика domklik → 0 после выбранного варианта; - [ ] аналитика #3223 (медианный торг) без строк-выбросов ×10 — сравнить до/после. Refs #3225, PR #3370.
Author
Collaborator

Приёмка на проде (07.09 ~00:10 UTC, деплой 33444b7e, миграция 286 применена деплоем):

до после
строк offer_price_history 77 754 77 716 (−38: cian 12, domklik 26)
loader-строк с |diff_percent| > 100 (все источники) 44 0
… из них domklik 42 0
повторный dry-run 286 (2 прохода) 38/38/17 0/0/0
медианный торг #3223 (landing_stats SQL, span 14, |pct|≤50) n=7789, снижавших 3811, −2.056 %/мес n=7793, 3813, −2.056

Приёмка «abs(diff_percent) > 100 у загрузчика domklik → 0» выполнена; аналитика #3223 не сдвинулась (×10-точки как первая/последняя уже отсекались фильтром). Гейт drop_decimal_slips на живом тракте (domclick/cian detail). Бэкап 333 затронутых строк — ~/backups/oph_286_backup_20260906.csv на Poincare. Yandex (6 первых точек с вырожденным свидетелем) — #3385.

**Приёмка на проде (07.09 ~00:10 UTC, деплой `33444b7e`, миграция 286 применена деплоем):** | | до | после | |---|---:|---:| | строк `offer_price_history` | 77 754 | **77 716** (−38: cian 12, domklik 26) | | loader-строк с `\|diff_percent\| > 100` (все источники) | 44 | **0** | | … из них domklik | 42 | **0** | | повторный dry-run 286 (2 прохода) | 38/38/17 | **0/0/0** | | медианный торг #3223 (`landing_stats` SQL, span 14, `\|pct\|≤50`) | n=7789, снижавших 3811, −2.056 %/мес | n=7793, 3813, **−2.056** | Приёмка «`abs(diff_percent) > 100` у загрузчика domklik → 0» выполнена; аналитика #3223 не сдвинулась (×10-точки как первая/последняя уже отсекались фильтром). Гейт `drop_decimal_slips` на живом тракте (domclick/cian detail). Бэкап 333 затронутых строк — `~/backups/oph_286_backup_20260906.csv` на Poincare. Yandex (6 первых точек с вырожденным свидетелем) — #3385.
Sign in to join this conversation.
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#3376
No description provided.