feat(macro): ЕМИСС income_per_capita → macro_indicator (#946 pt2) #1144

Merged
bot-backend merged 1 commit from feat/emiss-macro-indicators-946 into main 2026-06-07 13:45:14 +00:00
Collaborator

Что

#946 part 2: ЕМИСС/fedstat-индикатор «Среднедушевые денежные доходы населения» (fedstat id=57039, OKATO 65 Свердл, квартальный, ₽) в macro_indicator (source='emiss'). Это высокоценный индикатор для affordability-слоя прогноза.

Как (ключевой момент про reachability)

ЕМИСС блокирует dev-IP WAF'ом, но доступен с прод-IP. Поэтому:

  • Добавлен pure SDMX-ML v1.0 GenericData-парсер (stdlib ElementTree, без новых deps) — dev-тестируется на реальной прод-фикстуре (emiss_income_57039.xml).
  • Live-fetch исполняется на проде (Celery). Verified end-to-end: httpx POST data.do?id=57039&format=sdmx из gendesign-worker-1 → 200 + SDMX, парсер извлёк 9 Свердл-квартальных строк (2024-Q1…2026-Q1).
  • Целевой ОКАТО-фильтр — точный dict-lookup 65000000000 (фикстура содержит РФ/ЦФО/Адыгею для теста исключения).

Содержимое

  • rosstat_emiss.pyparse_emiss_sdmx() + EMISS-fetch (_http_post, verify=False как у open-data).
  • rosstat_macro_sync.pydual-source таска (open-data + ЕМИСС, per-source try/except: один источник падает — другой всё равно апсертит, ошибка re-raise в Celery/GlitchTip). UPSERT_EMISS_SQL: SAVEPOINT-per-row, CAST not ::, ON CONFLICT по PK.
  • site_finder/macro.pyincome_per_capita → region-aware (additive).
  • Фикстуры (реальный прод-SDMX + empty) + 16 парсер-тестов на реальных значениях + worker-тесты.

НЕ landed (честно, задокументировано в коде)

  • ИПЦ (id=31074) и индекс цен СМР — многомерные; дефолт-экспорт data.do не содержит Свердл-срез, нужна dataGrid.do-выборка (selectedFilterIds + filter-tree AJAX) + reCAPTCHA на странице индикатора. reCAPTCHA = не обходим (правило). Field-id-карта (57831/58273/57937/33560/3) сохранена для будущей итерации.

Качество

  • code-reviewer: APPROVE — оба gate (SDMX region-filter + period→date mapping; SQL-upsert) пройдены; region-фильтр exact-match (adversarial-фикстура + flip-target тест), quarter→month сверено на 4 реальных кварталах, dual-source guard корректен, macro.py no-regression, без новых deps, scope-honesty. Полный backend-suite 2309 passed, 0 failed, ruff чисто, uv sync --frozen ок. parcels.py не тронут (без коллизий с ИРД/КРТ-треком).

Refs #946 (доходы landed; ИПЦ/СМР reCAPTCHA-blocked).

## Что #946 part 2: ЕМИСС/fedstat-индикатор **«Среднедушевые денежные доходы населения»** (fedstat `id=57039`, OKATO 65 Свердл, квартальный, ₽) в `macro_indicator` (`source='emiss'`). Это высокоценный индикатор для affordability-слоя прогноза. ## Как (ключевой момент про reachability) ЕМИСС блокирует dev-IP WAF'ом, но **доступен с прод-IP**. Поэтому: - Добавлен pure **SDMX-ML v1.0 GenericData-парсер** (stdlib ElementTree, без новых deps) — dev-тестируется на реальной прод-фикстуре (`emiss_income_57039.xml`). - Live-fetch исполняется на проде (Celery). **Verified end-to-end:** httpx POST `data.do?id=57039&format=sdmx` из `gendesign-worker-1` → 200 + SDMX, парсер извлёк 9 Свердл-квартальных строк (2024-Q1…2026-Q1). - Целевой ОКАТО-фильтр — точный dict-lookup `65000000000` (фикстура содержит РФ/ЦФО/Адыгею для теста исключения). ## Содержимое - `rosstat_emiss.py` — `parse_emiss_sdmx()` + EMISS-fetch (`_http_post`, verify=False как у open-data). - `rosstat_macro_sync.py` — **dual-source** таска (open-data + ЕМИСС, per-source try/except: один источник падает — другой всё равно апсертит, ошибка re-raise в Celery/GlitchTip). `UPSERT_EMISS_SQL`: SAVEPOINT-per-row, `CAST` not `::`, ON CONFLICT по PK. - `site_finder/macro.py` — `income_per_capita` → region-aware (additive). - Фикстуры (реальный прод-SDMX + empty) + 16 парсер-тестов на реальных значениях + worker-тесты. ## НЕ landed (честно, задокументировано в коде) - **ИПЦ (id=31074)** и **индекс цен СМР** — многомерные; дефолт-экспорт `data.do` не содержит Свердл-срез, нужна `dataGrid.do`-выборка (`selectedFilterIds` + filter-tree AJAX) **+ reCAPTCHA** на странице индикатора. reCAPTCHA = не обходим (правило). Field-id-карта (57831/58273/57937/33560/3) сохранена для будущей итерации. ## Качество - `code-reviewer`: ✅ APPROVE — оба gate (SDMX region-filter + period→date mapping; SQL-upsert) пройдены; region-фильтр exact-match (adversarial-фикстура + flip-target тест), quarter→month сверено на 4 реальных кварталах, dual-source guard корректен, macro.py no-regression, без новых deps, scope-honesty. Полный backend-suite **2309 passed, 0 failed**, ruff чисто, `uv sync --frozen` ок. `parcels.py` не тронут (без коллизий с ИРД/КРТ-треком). Refs #946 (доходы landed; ИПЦ/СМР reCAPTCHA-blocked).
bot-backend added the
data
scope/backend
GG-форсайт
site-finder
labels 2026-06-07 13:45:11 +00:00
bot-backend added 1 commit 2026-06-07 13:45:12 +00:00
feat(macro): ЕМИСС среднедушевые доходы (id=57039) -> macro_indicator (#946 part2)
All checks were successful
CI / changes (push) Successful in 6s
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 6s
Deploy / changes (push) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
Deploy / build-backend (push) Successful in 1m31s
Deploy / build-frontend (push) Has been skipped
Deploy / build-worker (push) Successful in 2m33s
Deploy / deploy (push) Successful in 1m12s
CI / backend-tests (push) Successful in 6m23s
CI / backend-tests (pull_request) Successful in 6m31s
1f66dfd400
Расширяет Росстат-скрейпер ЕМИСС/fedstat-рядом «Среднедушевые денежные доходы
населения» (fedstat id=57039, OKATO 65=Свердл, квартальный, руб). Добавляет pure
SDMX-ML v1.0 GenericData-парсер (stdlib ElementTree, dev-тестируем на фикстурах) +
EMISS-ветку Celery-таски rosstat_macro_sync (open-data + ЕМИСС, per-source guard,
source='emiss', frequency параметризован, CAST not ::, SAVEPOINT per-row).
income_per_capita проброшен в site_finder/macro (region='sverdl').

ЕМИСС за WAF с dev -> fetch исполняется на проде (verified: httpx POST из
gendesign-worker-1 -> 200 + SDMX, парсер извлёк 9 Свердл-строк). ИПЦ (id=31074) /
индекс цен СМР НЕ landed: многомерные, дефолт-экспорт data.do без Свердл, нужна
dataGrid-выборка (selectedFilterIds + filter-tree AJAX + reCAPTCHA) -- задокументировано.

Refs #946.
bot-backend merged commit 1f66dfd400 into main 2026-06-07 13:45:14 +00:00
Sign in to join this conversation.
No reviewers
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#1144
No description provided.