The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

fedstatAPIr

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 они должны быть такими же. Однако разные регистры фильтров и лишние пробелы не сломают фильтрацию.

Доступны следующие специальные значения фильтров:

  1. Звездочка ("*") выбирает все данные по этому полю фильтра.

Важно: все фильтры с несколькими возможными значениями должны быть явно указаны. Если фильтр не указан, будет возвращена ошибка с перечислением неуказанных полей. Используйте "*" для явного выбора всех значений. Это важно контролировать ответственно, так как Вы можете случайно сделать запрос на всю базу данных. Безответственная настройка фильтров приведет к замедлению работы сервиса для всех пользователей 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 является оберткой из отдельных функций, которые отвечают за:

  1. Загрузку id фильтров и CSRF-токена через GET запрос (fedstat_get_data_ids);
  2. Фильтрацию данных на основе filters с учетом специальных значений (fedstat_data_ids_filter);
  3. Отправку POST запроса с телом из фильтров (fedstat_post_data_ids_filtered);
  4. Парсинг полученного SDMX файла в таблицу (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, можно изменять самостоятельно

Устранение проблем

Ошибка 403 (Forbidden)

ЕМИСС может блокировать запросы с нестандартными заголовками. Пакет устанавливает заголовки по умолчанию, но если блокировка всё ещё происходит, можно вручную задать свои:

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"
))

Вызовите эту команду один раз перед использованием функций пакета.

Ошибка 503 (Service Unavailable)

ЕМИСС перегружен. Рекомендации:

Ошибка 302 (Redirect)

Сервер отклонил запрос. Возможные причины:

Проверьте доступные значения фильтров через fedstat_get_data_ids().

“CSRF token validation failed”

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() делает это автоматически при повторных попытках.

“No data found” / HTML вместо данных

Обновите пакет до версии >= 1.1.0. Старая версия обращается к устаревшему эндпойнту, который больше не отдаёт данные.

Помощь

Вопросы можно писать на почту deniskrylovvit@gmail.com


Разработка

Буду рад Вашему вкладу в проект. Перед коммитом изменений необходимо пройти R CRAN check –as-cran.

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.