- NSPD-skraper переехал в backend/app/services/scrapers/nspd_kn.py + Celery task scrape_nspd_region (beat: 20-е февраля/мая/авг/нояб). Redis lock 3h, WAF auto-retry, heartbeat в nspd_scrape_runs. - Recommend_mix Tier 3: per-bucket elasticity через регрессию по «доминирующему bucket» каждого ЖК. Weighted-elasticity для inverse-mode. UI показывает разброс эластичностей и переключение regression/fallback. - Cadastre vs market cross-check: spatial-join cad_buildings → ekb_districts_geom; cadastre_vs_market_pct в scope, аномалии (>+50% / <-30%) подсвечены в UI. - Sentry release tracking (#4): IMAGE_TAG → backend/.env.runtime → sentry_sdk.init(release=...). Compose v2 env_file optional path. Schemas: 63_schema_nspd_runs.sql (cad_buildings + nspd_scrape_runs/log формализуют то, что уже жило в проде через 61_import_nspd_batch.py), 64_v_zk_rosreestr_velocity.sql (refresh с cad_buildings).
27 lines
1.2 KiB
SQL
27 lines
1.2 KiB
SQL
-- Backfill domrf_kn_objects.cad_quarter через ST_Contains spatial-join.
|
||
--
|
||
-- Логика: каждый ЖК с lat/lon → найти cad-квартал, в полигон которого попадает
|
||
-- точка. Если ЖК на границе двух кварталов — берём первый (ST_Contains
|
||
-- однозначен, ST_Intersects дал бы пересечения).
|
||
--
|
||
-- Запускать ПОСЛЕ 58_fetch_cad_quarters_nspd.py.
|
||
|
||
UPDATE domrf_kn_objects o
|
||
SET cad_quarter = cq.cad_number
|
||
FROM cad_quarters_geom cq
|
||
WHERE o.region_cd = 66
|
||
AND o.latitude IS NOT NULL
|
||
AND o.longitude IS NOT NULL
|
||
AND ST_Contains(
|
||
cq.geom,
|
||
ST_SetSRID(ST_MakePoint(o.longitude, o.latitude), 4326)
|
||
)
|
||
AND (o.cad_quarter IS NULL OR o.cad_quarter <> cq.cad_number);
|
||
|
||
-- Контрольные цифры: сколько ЖК привязано / без привязки.
|
||
SELECT
|
||
COUNT(*) FILTER (WHERE cad_quarter IS NOT NULL) AS with_cad,
|
||
COUNT(*) FILTER (WHERE cad_quarter IS NULL) AS without_cad,
|
||
COUNT(DISTINCT cad_quarter) AS unique_quarters_used
|
||
FROM domrf_kn_objects
|
||
WHERE region_cd = 66 AND district_name IS NOT NULL;
|