feat(mera): макро-ряды ЦБ РФ — ипотека по субъектам и ключевая ставка #3427

Merged
lekss361 merged 2 commits from feat/mera-cbr-macro into main 2026-09-08 21:49:00 +00:00
Owner

Что и зачем

Три XLSX ЦБ РФ (выдачи, ставка, задолженность) в разрезе субъектов, помесячно с 01.2019, плюс ключевая ставка через SOAP DailyInfo.asmx (метод KeyRate; GET на нём не работает, только POST). Всё анонимно, без ключа.

До этого PR в МЕРЕ не было ничего про ипотечные ставки: grep по key_rate|mortgage_rate|ипотечн давал единственный хит — строку дисклеймера в PDF-экспортёре.

Таблицы: cbr_mortgage_series (region, period_month, series) и cbr_key_rate.

fetched_at не обновляется в DO UPDATE — по уроку #2846 колонка значит «когда мы ВПЕРВЫЕ увидели период», и по ней меряется такт публикации источника. Время последней загрузки хранит scrape_runs.

Найденное на реальных данных

Раскладка листов у ЦБ разная, и это ловушка. В 02_11/02_13 шапка периодов в строке 3 текстом («Январь 2019»), а в 02_14 (задолженность) — уже в строке 2 и настоящими datetime. С захардкоженным индексом строки серия debt_rub молча давала ноль строк при полностью зелёных тестах — фикстуры были собраны по форме первых двух файлов.

Теперь строка шапки ищется динамически: берётся строка с наибольшим числом распознанных периодов среди первых шести, а ячейка периода принимает и русский текст, и datetime.

Проверка

Прогон на живых файлах ЦБ — каждая из трёх серий даёт 8 736 точек (96 территорий × 91 месяц, 01.2019–07.2026):

серия точек Свердловская обл. последнее значение
rate_rub 8 736 91 месяц 11.49
new_loans_rub 8 736 91 месяц 11 048
debt_rub 8 736 91 месяц 684 772

ruff check — чисто; полный сьют pytest5 655 passed, 37 skipped (в т.ч. два новых регресса: раскладка с datetime-шапкой и «шапка не найдена → пустой результат, а не мусор»).

Границы

estimator.py не тронут — как ипотечная ставка войдёт в оценку, это отдельное продуктовое решение. Этот PR только про данные и их загрузку.

Миграции 292 (таблицы) и 293 (сид расписания, enabled=false, interval_days 7, окно 07:00–08:00 UTC — сверено с соседними сидами). Новая зависимость: openpyxl.

## Что и зачем Три XLSX ЦБ РФ (выдачи, ставка, задолженность) в разрезе субъектов, помесячно с 01.2019, плюс ключевая ставка через SOAP `DailyInfo.asmx` (метод `KeyRate`; GET на нём не работает, только POST). Всё анонимно, без ключа. До этого PR в МЕРЕ **не было ничего** про ипотечные ставки: grep по `key_rate|mortgage_rate|ипотечн` давал единственный хит — строку дисклеймера в PDF-экспортёре. Таблицы: `cbr_mortgage_series (region, period_month, series)` и `cbr_key_rate`. `fetched_at` **не обновляется** в `DO UPDATE` — по уроку #2846 колонка значит «когда мы ВПЕРВЫЕ увидели период», и по ней меряется такт публикации источника. Время последней загрузки хранит `scrape_runs`. ## Найденное на реальных данных **Раскладка листов у ЦБ разная, и это ловушка.** В `02_11`/`02_13` шапка периодов в строке 3 текстом («Январь 2019»), а в `02_14` (задолженность) — уже в строке 2 и настоящими `datetime`. С захардкоженным индексом строки серия `debt_rub` молча давала **ноль строк** при полностью зелёных тестах — фикстуры были собраны по форме первых двух файлов. Теперь строка шапки ищется динамически: берётся строка с наибольшим числом распознанных периодов среди первых шести, а ячейка периода принимает и русский текст, и `datetime`. ## Проверка Прогон на живых файлах ЦБ — каждая из трёх серий даёт **8 736 точек** (96 территорий × 91 месяц, 01.2019–07.2026): | серия | точек | Свердловская обл. | последнее значение | |---|---|---|---| | `rate_rub` | 8 736 | 91 месяц | 11.49 | | `new_loans_rub` | 8 736 | 91 месяц | 11 048 | | `debt_rub` | 8 736 | 91 месяц | 684 772 | `ruff check` — чисто; полный сьют `pytest` — **5 655 passed, 37 skipped** (в т.ч. два новых регресса: раскладка с `datetime`-шапкой и «шапка не найдена → пустой результат, а не мусор»). ## Границы `estimator.py` не тронут — как ипотечная ставка войдёт в оценку, это отдельное продуктовое решение. Этот PR только про данные и их загрузку. Миграции **292** (таблицы) и **293** (сид расписания, `enabled=false`, `interval_days` 7, окно 07:00–08:00 UTC — сверено с соседними сидами). Новая зависимость: `openpyxl`.
lekss361 added 1 commit 2026-09-08 21:34:04 +00:00
feat(mera): макро-ряды ЦБ РФ — ипотека по субъектам и ключевая ставка
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m16s
2abab8218e
Три XLSX ЦБ (выдачи, ставка, задолженность) в разрезе субъектов, помесячно
с 01.2019, + ключевая ставка через SOAP DailyInfo.asmx (метод KeyRate; GET
на нём не работает, только POST). Всё анонимно, без ключа.

Таблицы: cbr_mortgage_series (region, period_month, series) и cbr_key_rate.
fetched_at НЕ обновляется в DO UPDATE — по уроку #2846 колонка значит
«когда мы ВПЕРВЫЕ увидели период» и по ней меряется такт публикации источника.

Раскладка листов у ЦБ РАЗНАЯ, и это ловушка: в 02_11/02_13 шапка периодов в
строке 3 текстом («Январь 2019»), а в 02_14 (задолженность) — уже в строке 2 и
настоящими datetime. С захардкоженным индексом строки серия debt_rub молча
давала НОЛЬ строк при зелёных тестах. Теперь строка шапки ищется динамически:
берётся строка с наибольшим числом распознанных периодов среди первых шести.

Проверено на живых файлах: каждая из трёх серий даёт 8 736 точек
(96 территорий × 91 месяц, 01.2019–07.2026); по Свердловской области 91 месяц,
последняя ставка 11.49.

estimator.py не тронут: как ипотечная ставка войдёт в оценку — отдельное
продуктовое решение, этот PR только про данные.

Миграции 292 (таблицы) и 293 (сид расписания, enabled=false, interval_days 7).
Новая зависимость: openpyxl.
bot-backend added 1 commit 2026-09-08 21:43:18 +00:00
merge main в feat/mera-cbr-macro — оба handler'а (frt_mkd_load + cbr_macro_pull) в реестре
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m12s
1f3566c466
lekss361 merged commit 3bd30aab87 into main 2026-09-08 21:49:00 +00:00
lekss361 deleted branch feat/mera-cbr-macro 2026-09-08 21:49:01 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#3427
No description provided.