fix(tradein/estimator): per-city ценовой band ДКП-сделок для всей Свердловской обл. (66) #2485
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2485
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-oblast-c1-price-band"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что
Глобальный плаузибл-band
DEAL_MIN_PPM2=50_000(estimator.py) молча резал 46.6% не-ЕКБ сделок — легитимные дешёвые города (Североуральск p50=21.7k ₽/м², Новоуральск 36k, Асбест 41k — все ниже 50k). Band стал per-city, чтобы дешёвые сделки выживали, а мусор (доли/ошибки) резался.Изменения
deal_city_price_bands(city PK, ppm2_min/max, n_deals, refreshed_at): populate изdeals(source=rosreestr,city<>'Екатеринбург',count>=30),ppm2_min=GREATEST(p1,8000),ppm2_max=LEAST(p99,800000), idempotent upsert (ON CONFLICT DO UPDATE), HAVING-guardp99>=8000(airtight против inverted band). Пример bands: Североуральск [9316, 45668], Серов [14504, 92500], Н.Тагил [16955, 108175]._fetch_dkp_corridorSQL:LEFT JOIN deal_city_price_bands b+price_per_m2 BETWEEN COALESCE(b.ppm2_min, :ppm_min) AND COALESCE(b.ppm2_max, :ppm_max)._is_plausible_deal(city, bands)+_fetch_deals:_load_city_price_bands(TTL-cache, graceful empty), SELECT добавилcity.EKB инвариант
'Екатеринбург' исключён из band-таблицы → оба пути (COALESCE /
.get) fallback на глобальные 50k/800k → EKB-сделки byte-identical. Verified:dealsспеллит EKB только как'Екатеринбург'(49 791, без вариантов). Регресс-гейт байт-зелёный (фикстура реплеит_price_from_inputs, который upstream от этих фильтров — они не гоняются в реплее). Nuance (deep-review): interior-EKB оценки идентичны; boundary-EKB (radius <1км от banded-соседа) / common-street corridor могут подтянуть не-ЕКБ сделки — унаследовано от mig-177 (#2482), corridor advisory (display-only, не клампит).Проверка
test_search_cache_hitdeselect, как в CI). ruff clean.SELECT count(*) FROM deal_city_price_bands(должен быть >0 — не-ЕКБ сделки уже в проде после A2).Follow-ups (не в этом PR)
_fetch_dkp_corridor(street-name collision между городами) → C2.Зависит от A1+A2 (уже в проде: 96 974 сделки, +47 183 не-ЕКБ, геокод 99.9%).