Introduction to downloading economic data in R

Ирина Голощапова
Центр макроэкономического анализа и краткосрочного прогнозирования
Open Data Science

План

  • Зачем нужна автоматизация выгрузки данных

  • Что мы можем использовать в R для выгрузки экономических данных

  • Как мы можем это использовать

План

Подготовимся!

Ссылка на презентацию: http://irinagoloshchapova.github.io/Progs/OpenData_March_2017/

Зачем автоматизировать

Зачем автоматизировать

  • Частая необходимость быстро выгрузить данные: регулярные мониторинги и отчеты, dashboards

  • Громоздкие, но повторяющиеся вычисления

  • Нужно скачивать мно-о-о-го данных

  • Нужен быстрый доступ к полной структуре баз данных

Что использовать

Что использовать

  • R Packages
  • Подключение к API

Как использовать

Как использовать

Начало работы в R

install.packages(c('devtools', 'tidyverse', 'ggthemes', 'httr', 'jsonlite'))

devtools::install_github("vincentarelbundock/WDI")
devtools::install_github("GIST-ORNL/wbstats")
devtools::install_github('mingjerli/IMFData')
devtools::install_github('christophergandrud/imfr')

Как использовать: R packages

Как использовать: R Packages

В первую очередь: Google it!

cat_lazy_google

Как использовать: R Packages

Как использовать: R Packages

Ключевые принципы

  • Просмотреть документацию и выбрать нужную библиотеку: CRAN, GitHub

  • Понять структуру поиска данных и их загрузки: Tutorials

  • Попробовать простой пример: GitHub, R-Bloggers, Google

  • Загружать все, что хочется: R

Как использовать: R Packages

Пример: World Bank

Просмотреть документацию и выбрать нужную библиотеку

WDI или wbstats

Как использовать: R Packages

Пример: World Bank

Как использовать: R Packages

Пример: World Bank

Понять структуру поиска данных и их загрузки в выбранной библиотеке

  • установить библиотеку

  • найти коды нужных индикаторов

  • определиться с выборкой стран

  • определиться с временным периодом выгрузки

  • выбрать формат выгрузки данных

  • загрузить!

Как использовать: R Packages

Пример: World Bank

Попробовать простой пример

library(wbstats)
library(ggplot2)

oil_data <- wb(indicator = c("CRUDE_DUBAI", "CRUDE_BRENT", "CRUDE_WTI", "CRUDE_PETRO"),
               startdate = "2012M01", enddate = "2014M12", freq = "M", POSIXct = TRUE)

ggplot(oil_data, aes(x = date_ct, y = value, colour = indicator)) + geom_line(size = 1) +
  labs(title = "Crude Oil Price Comparisons", x = "Date", y = "US Dollars")

Как использовать: R Packages

Пример: World Bank

Загружать все, что хочется!

library(wbstats)
library(ggplot2)
library(ggthemes)

wbsearch(pattern = "inflation", fields = "indicator", extra = TRUE)

#             indicatorID                             indicator
# 8294  NY.GDP.DEFL.KD.ZG    Inflation, GDP deflator (annual %)
# 10895    FP.CPI.TOTL.ZG Inflation, consumer prices (annual %)

deflator <- wb(indicator = "NY.GDP.DEFL.KD.ZG", country = "RU", mrv = 16, freq = "Y", POSIXct = TRUE)
CPI <- wb(indicator = "FP.CPI.TOTL.ZG", country = "RU", mrv = 16, freq = "Y", POSIXct = TRUE)

inflation_data <- rbind(deflator, CPI)

g <- ggplot(inflation_data, aes(x = date_ct, y = value, colour = indicator)) + geom_line(size = 1)
g <- g + labs(title = "Inflation data", x = NULL, y = NULL)
g <- g + guides(colour = guide_legend(title = '', size = 3.5))
g <- g + theme_solarized(light = FALSE)
g <- g + scale_colour_solarized()
g <- g + theme(legend.position = 'top')
g

Как использовать: R Packages

Пример: World Bank

Визуализация результата

inflation_wb_results

Как использовать: R Packages

Пример: International Monetary Fund

Просмотреть документацию и выбрать нужную библиотеку

IMFData или imfr

Как использовать: R Packages

Пример: International Monetary Fund

Как использовать: R Packages

Пример: International Monetary Fund

Понять структуру поиска данных и их загрузки в выбранной библиотеке

  • установить библиотеку

  • выбрать базу данных (database ID)

  • определиться с параметрами данной базы данных (dimensions)

  • найти коды нужных индикаторов

  • определиться с выборкой стран

  • определиться с временным периодом

  • определиться с финальным форматом выгрузки данных

  • загрузить!

Как использовать: R Packages

Пример: International Monetary Fund

Попробовать простой пример

library(IMFData)

databaseID <- "IFS"
startdate = "2001-01-01"
enddate = "2016-12-31"
checkquery = FALSE

## Germany, Norminal GDP in Euros, Norminal GDP in National Currency
queryfilter <- list(CL_FREQ = "", CL_AREA_IFS = "GR", CL_INDICATOR_IFS = c("NGDP_EUR", 
    "NGDP_XDC"))

GR.NGDP.query <- CompactDataMethod(databaseID, queryfilter, startdate, enddate, 
    checkquery)

GR.NGDP.query$Obs[[1]][1:5, ]
#   @TIME_PERIOD @OBS_VALUE
# 1      2001-Q1    35.2366
# 2      2001-Q2    36.7264
# 3      2001-Q3    39.8428
# 4      2001-Q4    40.3881
# 5      2002-Q1    37.4971

Как использовать: R Packages

Пример: International Monetary Fund

Загружать все, что хочется!

library(IMFData)
library(ggplot2)

availableDB <- DataflowMethod()
availableDB$DatabaseID
# FSI
# "Financial Soundness Indicators (FSI)" 
FSI.available.codes <- DataStructureMethod("FSI")
names(FSI.available.codes)
# [1] "CL_FREQ"          "CL_AREA_FSI"      "CL_INDICATOR_FSI"

CodeSearch(FSI.available.codes, "CL_INDICATOR_FSI", "Debt")
# FSHG_PT
# Financial Soundness Indicators, Encouraged Set, Households, Household Debt to Gross Domestic Product (GDP), Percent

databaseID <- "FSI"
startdate = "2000-01-01"
enddate = "2016-12-31"
checkquery = FALSE

queryfilter <- list(CL_FREQ = "", CL_AREA_FSI = "RU", CL_INDICATOR_FSI = "FSHG_PT")
indicator_query <- CompactDataMethod(databaseID, queryfilter, startdate, enddate, checkquery)
indicator_query$Obs[[1]]

Как использовать: R Packages

Пример: International Monetary Fund

Визуализация результата

fsi_results

Как использовать: подключение к API

Как использовать: подключение к API

В первую очередь: Вчитаться в документацию к API!

cat_lazy_google

Как использовать: подключение к API

Ключевые принципы

  • Вчитаться в документацию к API: официальные сайты статведомств

  • Понять структуру работы с API: подключение, формирование запроса, формат получения данных

  • Написать код для загрузки простого примера: загрузить хоть что-нибудь

  • Обобщить код для своих потребностей: функции для загрузки, введение нужных параметров

Как использовать: подключение к API

Пример: World Bank

World Bank for Developers: API Documentation

Как использовать: подключение к API

Пример: World Bank

Понять структуру работы с API

  • вид API

  • форматы данных, доступные для загрузки

    format=json
    
  • получить список стран

    http://api.worldbank.org/countries
    
  • получить список показателей

    http://api.worldbank.org/indicators
    
  • определить формат и период времени для загрузки

    date=2000:2001; date=2009Q1:2010Q3; date=2009M01:2010M08
    

Как использовать: подключение к API

Пример: World Bank

Понять структуру работы с API

  • понять структуру формирования url
# url parameters
base_url <- 'http://api.worldbank.org'
countries <- '/countries/'
indicators <- '/indicators/'
date <- '?date='
per_page <- '&per_page=20000'
format <- '&format=json'

start_period <- '1950'
end_period <- '2016'

# building url for API call
paste0(base_url, countries, <COUNTRIES_QUERY>, indicators, <INDICATOR_QUERY>, date, start_period, ':', end_period, per_page, format)

Как использовать: подключение к API

Пример: World Bank

Написать код для загрузки простого примера

#  get list of countries 
## loading libraries
library(httr)
library(jsonlite)
library(tidyverse)
library(ggplot2)

## generate url 
url <- 'http://api.worldbank.org/countries?format=json&per_page=300'

## get data
raw.result <- GET(url)
names(raw.result)
this.content <- fromJSON(rawToChar(raw.result$content))
str(this.content)
length(this.content)
View(this.content[[2]])
wb_countries <- this.content[[2]]

Как использовать: подключение к API

Пример: World Bank

Написать код для загрузки простого примера

#  get list of indicators
## generate url 
url <- 'http://api.worldbank.org/indicators?format=json&per_page=20000'

## get data
raw.result <- GET(url)
this.content <- fromJSON(rawToChar(raw.result$content))
# str(this.content)
# length(this.content)
wb_indicators <- this.content[[2]]

# view data
View(wb_indicators)
# Attention! Nested data.frame for topics!

Как использовать: подключение к API

Пример: World Bank

Написать код для загрузки простого примера

# example query for one indicator
url <- 'http://api.worldbank.org/countries/br;ru/indicators/SP.POP.TOTL?date=2013Q1:2015Q4&format=json'
raw.result <- GET(url)

example_query <- fromJSON(rawToChar(raw.result$content))
# str(example_query)
View(example_query[[2]])

Как использовать: подключение к API

Пример: World Bank

Обобщить код для своих потребностей

  • сохранение таблиц со значениями нужных параметров

  • функции для загрузки, подходящие под задачу

Как использовать: подключение к API

Пример: World Bank

Обобщить код для своих потребностей

# generalizing previous url building code for several indicators
queries <- lapply(<INPUT_CODES>, FUN = function(x) paste0(base_url, countries, wb_countries_query, indicators, x, date, start_period, ':', end_period, per_page, format))

# example of input codes
input_codes <- c('i_acc_deposit_A1', 'GFDD.AI.25')

Как использовать: подключение к API

Пример: World Bank

Обобщить код для своих потребностей

# download_wb_function.R
# source('download_wb_function.R')

library(dplyr)
library(tidyr)
library(purrr)
library(lubridate)
library(httr)
library(jsonlite)
library(data.table)

options(stringsAsFactors = FALSE)

##--------------------------------------------------------------------------
## Functions: download and basic processing
##--------------------------------------------------------------------------
# try.error function
try.error <- function(x)
{
  y = NA
  try_error = tryCatch(data.frame(x), error = function(e) e)
  if (!inherits(try_error, "error"))
    y = data.frame(x)
  return(y)
}

# download_WB function
download_WB <- function(queries) {
  new_data_list <- list()

  for (i in length(queries):1) {
    cat("Iteration = ", iter <- i, "\n")
    this.query       <- queries[[i]]
    this.raw.answer  <- GET(this.query)
    this.content <- fromJSON(rawToChar(this.raw.answer$content))
    new_data_list[[i]] <- try.error(this.content[[2]])
    cat(ifelse(is.na(new_data_list[i]), 'False\n', 'True\n'))

    if (!is.na(new_data_list[i])) {
      metadata <- data.frame(Indicator_Id = new_data_list[[i]]$indicator$id, 
                             Indicator_Value = new_data_list[[i]]$indicator$value, 
                             Country_Id = new_data_list[[i]]$country$id, 
                             Country_Value = new_data_list[[i]]$country$value)
      new_data_list[[i]] <- select(new_data_list[[i]], -c(indicator, country))
      new_data_list[[i]] <- mutate(new_data_list[[i]], Indicator_Id = metadata$Indicator_Id, 
                                    Indicator_Value = metadata$Indicator_Value, 
                                    Country_Id = metadata$Country_Id, 
                                    Country_Value = metadata$Country_Value)
    }
    else {new_data_list[i] <- NULL}

    Sys.sleep(time = 0.01)
  }

  new_data_df <- rbindlist(new_data_list) 
  return(new_data_df)
}
## ----------------------------------------------------------------------
# new_data_df <- download_WB(queries)
## ----------------------------------------------------------------------

Спасибо за внимание!

Irina Goloshchapova - @irina_g (ods), igoloshchapova@forecast.ru

R Moscow Meetup

Data Visualization Meetup