gendesign/backend
lekss361 630a5bbd77 fix(sf): exclude NULL competitors from aggregate calculations (velocity, market_avg, top_sellers)
ЖК без маппинга в Objective (Желдорипотека, Эфес и пр.) остаются в
competitor list для карты, но исключаются из aggregate-метрик.

Добавлен блок market_pulse в ответ /analyze:
- market_avg_price_per_m2: AVG(avg_price_per_m2_rub) по non-null competitors
- avg_velocity_m2: monthly_velocity_sqm из compute_velocity (уже non-null by design)
- market_data_coverage_pct / coverage_pct: priced_count / total * 100
- top_sellers: топ-5 ЖК по units_sold среди priced
- competitors_total / competitors_with_price: для UI badge

competitor list (20 ЖК) не изменён.
2026-05-17 23:41:09 +03:00
..
alembic ops: alembic baseline, pre-commit, TIGER cleanup, pg_dump scripts 2026-04-26 13:08:51 +03:00
app fix(sf): exclude NULL competitors from aggregate calculations (velocity, market_avg, top_sellers) 2026-05-17 23:41:09 +03:00
db/init ops: alembic baseline, pre-commit, TIGER cleanup, pg_dump scripts 2026-04-26 13:08:51 +03:00
output feat(geo): NSPD bulk-fetcher без Playwright + resume-friendly UI 2026-05-11 08:53:28 +03:00
tests feat(obj-3): SF backend migrate to objective_lots ground truth (price 0.3% -> 81%) (#324) 2026-05-17 20:08:17 +00:00
.dockerignore fix(scraper): диагностируем «кнопка не работает» — Redis lock + task_received log 2026-04-28 23:17:42 +03:00
.env.example feat(backend): sentry-sdk init для FastAPI + Celery (#204 backend) (#207) 2026-05-16 15:09:16 +00:00
.env.runtime.example sprint1: nspd scraper industrialization, per-bucket elasticity, cadastre cross-check, sentry releases 2026-04-30 21:51:19 +03:00
alembic.ini ops: alembic baseline, pre-commit, TIGER cleanup, pg_dump scripts 2026-04-26 13:08:51 +03:00
debug.log feat(geo): NSPD bulk-fetcher без Playwright + resume-friendly UI 2026-05-11 08:53:28 +03:00
Dockerfile fix(scraper): диагностируем «кнопка не работает» — Redis lock + task_received log 2026-04-28 23:17:42 +03:00
pyproject.toml fix(scrape-objective): stream-parse lots_pf via ijson to avoid OOM (#315) 2026-05-17 16:37:30 +00:00
uv.lock fix(scrape-objective): stream-parse lots_pf via ijson to avoid OOM (#315) 2026-05-17 16:37:30 +00:00