(low) estimator.py/_fetch_dkp_corridor: low/high_ppm2 = чистые min/max выборки, а не P10/P90 — advisory-текст по одиночному выбросу #1520

Closed
opened 2026-06-15 05:59:10 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: report · Файл: tradein-mvp/backend/app/services/estimator.py:1243-1249, 2566-2574

estimator.py:1245/1247. low_ppm2 = int(ppm2_values[0]) и high_ppm2 = int(ppm2_values[-1]) — абсолютные минимум и максимум отсортированной выборки сделок, тогда как схема DkpCorridor (trade_in.py:109) обещает 'P10-ish'. Soft-bound (estimator.py:2566-2574) при count>=3 сравнивает median_ppm2 с high_ppm21.25 / low_ppm20.75 → текстовая пометка 'оценка выше/ниже коридора реальных сделок Росреестра' срабатывает по одиночному крайнему значению, а не по перцентилю. Усугубляется SBER time-adjust (factor до ~1.6, стр.1227-1230), раздувающим разброс. Импакт: нестабильный advisory-текст в клиентском отчёте на тонких выборках (3-5 сделок); цена не клампится. Фикс: брать _percentile(ppm2_values, 0.1)/0.9 (как уже сделано для медианы на 1246) либо поднять минимальный count для soft-bound.

Почему баг: ppm2_values отсортирован (1232), low=ppm2_values[0] (1245) и high=ppm2_values[-1] (1247) — это min/max, а не P10/P90, хотя схема обещает 'P10-ish'. count>=3 (2566) разрешает срабатывание пометки на выборке из 3 сделок, где [0] и [-1] — крайние точки. Это даёт нестабильный advisory-текст в клиентском отчёте.

Как чинить: Брать low_ppm2 = _percentile(ppm2_values, 0.1) и high_ppm2 = _percentile(ppm2_values, 0.9) (как и обещает docstring схемы), либо поднять минимальный count для advisory-пометки.


deep-audit «армия ботов 2» · verify+harden, confidence 0.8 · unit U124

**Severity:** low · **Категория:** report · **Файл:** `tradein-mvp/backend/app/services/estimator.py:1243-1249, 2566-2574` estimator.py:1245/1247. low_ppm2 = int(ppm2_values[0]) и high_ppm2 = int(ppm2_values[-1]) — абсолютные минимум и максимум отсортированной выборки сделок, тогда как схема DkpCorridor (trade_in.py:109) обещает 'P10-ish'. Soft-bound (estimator.py:2566-2574) при count>=3 сравнивает median_ppm2 с high_ppm2*1.25 / low_ppm2*0.75 → текстовая пометка 'оценка выше/ниже коридора реальных сделок Росреестра' срабатывает по одиночному крайнему значению, а не по перцентилю. Усугубляется SBER time-adjust (factor до ~1.6, стр.1227-1230), раздувающим разброс. Импакт: нестабильный advisory-текст в клиентском отчёте на тонких выборках (3-5 сделок); цена не клампится. Фикс: брать _percentile(ppm2_values, 0.1)/0.9 (как уже сделано для медианы на 1246) либо поднять минимальный count для soft-bound. **Почему баг:** ppm2_values отсортирован (1232), low=ppm2_values[0] (1245) и high=ppm2_values[-1] (1247) — это min/max, а не P10/P90, хотя схема обещает 'P10-ish'. count>=3 (2566) разрешает срабатывание пометки на выборке из 3 сделок, где [0] и [-1] — крайние точки. Это даёт нестабильный advisory-текст в клиентском отчёте. **Как чинить:** Брать low_ppm2 = _percentile(ppm2_values, 0.1) и high_ppm2 = _percentile(ppm2_values, 0.9) (как и обещает docstring схемы), либо поднять минимальный count для advisory-пометки. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.8 · unit U124</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:59:10 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:17 +00:00
bot-backend added the
needs-human
label 2026-06-15 16:44:14 +00:00
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#1520
No description provided.