fedstatAPIr представляет собой неофициальное API для загрузки данных с fedstat.ru (система ЕМИСС Росстата) с заданными фильтрами.
Пакет позволяет сэкономить ⏳ и нервы 😡 при работе с бесконечно падающим ЕМИСС через автоматическое повторение неотвеченных запросов и сохранение ранее использованных настроек фильтров.
Проект уже существует длительное время и, по-видимому, получился довольно стабильным ⚖️ и легковесным 🪽. Если пакет оказал влияние на Вашу деятельность, просим оказать поддержку. Если будет набрана необходимая сумма, также сделаем порт на Python и API для витрины данных Росстата (showdata). Спасибо за использование пакета!
На данный момент пакет доступен только на R, Вы можете загрузить fedstatAPIr из CRAN, используя следующую команду в R:
install.packages("fedstatAPIr")Версия для разработки может быть загружена следующей командой:
# install.packages("devtools")
devtools::install_github("DenchPokepon/fedstatAPIr")Загрузим данные по инфляции к предыдущему месяцу и к соотв. месяцу прошлого года за январь 2023 года по всем товарам и услугам только по России
Возьмем номер индикатора из URL веб страницы с данными https://fedstat.ru/indicator/31074
library(fedstatAPIr)
data <- fedstat_data_load_with_filters(
indicator_id = "31074",
filters = list(
"Классификатор объектов административно-территориального деления (ОКАТО)" = "Приморский край",
"Виды показателя" = c(
"К соответствующему периоду предыдущего года",
"К предыдущему месяцу"
),
"Период" = "Январь",
"Год" = "2023",
"Виды товаров и услуг" = "*"
)
)| EI | ObsValue | PERIOD | Time | s_POK | s_grtov | s_OKATO | s_OKATO_code | s_POK_code | s_grtov_code |
|---|---|---|---|---|---|---|---|---|---|
| процент | 100.83 | январь | 2023 | К предыдущему месяцу | Все товары и услуги | Приморский край | 05000000000 | 44 | 1 |
| процент | 111.25 | январь | 2023 | К соответствующему периоду предыдущего года | Все товары и услуги | Приморский край | 05000000000 | 9 | 1 |
| процент | 100.61 | январь | 2023 | К предыдущему месяцу | Все товары | Приморский край | 05000000000 | 44 | 2 |
| процент | 111.13 | январь | 2023 | К соответствующему периоду предыдущего года | Все товары | Приморский край | 05000000000 | 9 | 2 |
| процент | 100.78 | январь | 2023 | К предыдущему месяцу | Базовый индекс потребительских цен | Приморский край | 05000000000 | 44 | 3 |
| процент | 113.62 | январь | 2023 | К соответствующему периоду предыдущего года | Базовый индекс потребительских цен | Приморский край | 05000000000 | 9 | 3 |
Необходимо учитывать, что ЕМИСС часто находится под большой нагрузкой, поэтому не стоит загружать больше 500 тысяч строк за один запрос. В случае большой выгрузки желательно разбить запросы на подзапросы, в ином случае ЕМИСС может игнорировать такие большие запросы.
Фильтры задаются в виде именованного R списка (list):
filters = list(
"Название поля фильтра 1" = c("Значение 1", "Значение 2"),
"Название поля фильтра 2" = "Значение 1",
"Название поля фильтра 3" = "*" # все значения
)Где "Название поля фильтра" может быть, например
"Год", а значение для этого поля "2023".
Поля и значения фильтров берутся прямо из названий фильтров на
fedstat.ru, в filters они должны быть такими же. Однако
разные регистры фильтров и лишние пробелы не сломают фильтрацию.
Доступны следующие специальные значения фильтров:
"*") выбирает все данные по этому полю
фильтра.Важно: все фильтры с несколькими возможными
значениями должны быть явно указаны. Если фильтр не указан, будет
возвращена ошибка с перечислением неуказанных полей. Используйте
"*" для явного выбора всех значений. Это важно
контролировать ответственно, так как Вы можете случайно сделать запрос
на всю базу данных. Безответственная настройка фильтров приведет к
замедлению работы сервиса для всех пользователей fedstat.ru.
Библиотека стремится поддерживать загрузку всех доступных на fedstat индикаторов, на данный момент поддерживается абсолютное большинство, но в некоторых случаях специальных индикаторов могут быть непредвиденные баги.
Внутри пакета доступна база данных всех индикаторов, по которым
представлены данные на fedstat.ru. Она содержится в переменной
fedstat_indicators_names_database.
Все доступные фильтры каждого индикатора можно посмотреть через вызов функции
data_ids <- fedstat_get_data_ids("31074")Результат выглядит следующим образом
| filter_field_id | filter_field_title | filter_value_id | filter_value_title | filter_field_object_ids |
|---|---|---|---|---|
| 0 | Показатель | 31074 | Индексы потребительских цен на товары и услуги | filterObjectIds |
| 3 | Год | 2002 | 2002 | columnObjectIds |
| 3 | Год | 2003 | 2003 | columnObjectIds |
| 3 | Год | 2004 | 2004 | columnObjectIds |
| 3 | Год | 2005 | 2005 | columnObjectIds |
| 3 | Год | 2006 | 2006 | columnObjectIds |
Также можно посмотреть полный внутренний словарь (соотношения кодов и
человеческих названий сущностей) через задание аргумента
return_type = "dictionary"
data_dict <- fedstat_data_load_with_filters(
indicator_id = "31074",
filters = list(
# Здесь фильтры не важны, но нужно поставить валидную комбинацию, которая отдаст хотя бы одну строчку данных
"Классификатор объектов административно-территориального деления (ОКАТО)" = "Приморский край",
"Виды показателя" = c(
"К соответствующему периоду предыдущего года",
"К предыдущему месяцу"
),
"Период" = "Январь",
"Год" = "2023",
"Виды товаров и услуг" = "*"
),
return_type = "dictionary"
)| field_id | field_title | value_id | value_title |
|---|---|---|---|
| s_POK | Виды показателя | 4 | К декабрю предыдущего года |
| s_POK | Виды показателя | 29 | К предыдущему кварталу |
| s_POK | Виды показателя | 44 | К предыдущему месяцу |
| s_POK | Виды показателя | 30 | К соответствующему кварталу предыдущего года |
| s_POK | Виды показателя | 9 | К соответствующему периоду предыдущего года |
| s_POK | Виды показателя | 41 | Квартал к отчетному году |
Функция fedstat_data_load_with_filters является оберткой
из отдельных функций, которые отвечают за:
fedstat_get_data_ids);filters с учетом
специальных значений (fedstat_data_ids_filter);fedstat_post_data_ids_filtered);fedstat_parse_sdmx_to_table).По каждой функции доступна подробная документация, которую можно
вызвать в R через функцию help(). Например
help("fedstat_data_load_with_filters") или
?fedstat_data_load_with_filters.
Загрузим данные, используя каждую функцию отдельно:
# CSRF-токен автоматически извлекается и передаётся через атрибуты data_ids.
# Токен одноразовый — каждый POST потребляет токен.
data_ids <- fedstat_get_data_ids("31074")
data_ids_filtered <- data_ids %>%
fedstat_data_ids_filter(
filters = list(
"Классификатор объектов административно-территориального деления (ОКАТО)" = "Приморский край",
"Виды показателя" = c(
"К соответствующему периоду предыдущего года",
"К предыдущему месяцу"
),
"Период" = "Январь",
"Год" = "2023",
"Виды товаров и услуг" = "*"
)
)
data_sdmx_parsed <- data_ids_filtered %>%
fedstat_post_data_ids_filtered(data_format = "sdmx") %>%
fedstat_parse_sdmx_to_table()
# Для повторной загрузки или загрузки в другом формате нужен новый токен:
data_ids_for_excel <- fedstat_get_data_ids("31074") %>%
fedstat_data_ids_filter(
filters = list(
"Классификатор объектов административно-территориального деления (ОКАТО)" = "Приморский край",
"Виды показателя" = c(
"К соответствующему периоду предыдущего года",
"К предыдущему месяцу"
),
"Период" = "Январь",
"Год" = "2023",
"Виды товаров и услуг" = "*"
)
)
# Также можем загружать excel
data_xls_binary <- data_ids_for_excel %>%
fedstat_post_data_ids_filtered(data_format = "excel")
# Также можем записать в xls файл.
writeBin(data_xls_binary, "data.xls")
# Его формат зависит от колонки filter_field_object_ids в data_ids, можно изменять самостоятельноЕМИСС может блокировать запросы с нестандартными заголовками. Пакет устанавливает заголовки по умолчанию, но если блокировка всё ещё происходит, можно вручную задать свои:
httr::set_config(httr::add_headers(
'User-Agent' = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
'Accept' = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
'Accept-Language' = "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
'Connection' = "keep-alive"
))Вызовите эту команду один раз перед использованием функций пакета.
ЕМИСС перегружен. Рекомендации:
Сервер отклонил запрос. Возможные причины:
Проверьте доступные значения фильтров через
fedstat_get_data_ids().
CSRF-токен одноразовый. При использовании отдельных функций (не
обёртки) нужно заново вызвать fedstat_get_data_ids() для
каждого POST:
data_ids <- fedstat_get_data_ids("31074") # <- свежий токен
data <- data_ids %>%
fedstat_data_ids_filter(filters = ...) %>%
fedstat_post_data_ids_filtered() %>%
fedstat_parse_sdmx_to_table()Функция-обёртка fedstat_data_load_with_filters() делает
это автоматически при повторных попытках.
Обновите пакет до версии >= 1.1.0. Старая версия обращается к устаревшему эндпойнту, который больше не отдаёт данные.
Вопросы можно писать на почту deniskrylovvit@gmail.com
Буду рад Вашему вкладу в проект. Перед коммитом изменений необходимо пройти R CRAN check –as-cran.