Ирина Голощапова
Центр макроэкономического анализа и краткосрочного прогнозирования
Open Data Science
Зачем нужна автоматизация выгрузки данных
Что мы можем использовать в R для выгрузки экономических данных
Как мы можем это использовать
Подготовимся!
Ссылка на презентацию: http://irinagoloshchapova.github.io/Progs/OpenData_March_2017/
Частая необходимость быстро выгрузить данные: регулярные мониторинги и отчеты, dashboards
Громоздкие, но повторяющиеся вычисления
Нужно скачивать мно-о-о-го данных
Нужен быстрый доступ к полной структуре баз данных
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')
В первую очередь: Google it!
Просмотреть документацию и выбрать нужную библиотеку: CRAN, GitHub
Понять структуру поиска данных и их загрузки: Tutorials
Попробовать простой пример: GitHub, R-Bloggers, Google
Загружать все, что хочется: R
Просмотреть документацию и выбрать нужную библиотеку
Понять структуру поиска данных и их загрузки в выбранной библиотеке
установить библиотеку
найти коды нужных индикаторов
определиться с выборкой стран
определиться с временным периодом выгрузки
выбрать формат выгрузки данных
загрузить!
Попробовать простой пример
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")
Загружать все, что хочется!
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
Визуализация результата
Просмотреть документацию и выбрать нужную библиотеку
Понять структуру поиска данных и их загрузки в выбранной библиотеке
установить библиотеку
выбрать базу данных (database ID)
определиться с параметрами данной базы данных (dimensions)
найти коды нужных индикаторов
определиться с выборкой стран
определиться с временным периодом
определиться с финальным форматом выгрузки данных
загрузить!
Попробовать простой пример
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
Загружать все, что хочется!
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]]
Визуализация результата
В первую очередь: Вчитаться в документацию к API!
Вчитаться в документацию к API: официальные сайты статведомств
Понять структуру работы с API: подключение, формирование запроса, формат получения данных
Написать код для загрузки простого примера: загрузить хоть что-нибудь
Обобщить код для своих потребностей: функции для загрузки, введение нужных параметров
Понять структуру работы с API
вид API
форматы данных, доступные для загрузки
format=json
получить список стран
http://api.worldbank.org/countries
получить список показателей
http://api.worldbank.org/indicators
определить формат и период времени для загрузки
date=2000:2001; date=2009Q1:2010Q3; date=2009M01:2010M08
Понять структуру работы с API
# 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)
Написать код для загрузки простого примера
# 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]]
Написать код для загрузки простого примера
# 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!
Написать код для загрузки простого примера
# 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]])
Обобщить код для своих потребностей
сохранение таблиц со значениями нужных параметров
функции для загрузки, подходящие под задачу
Обобщить код для своих потребностей
# 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')
Обобщить код для своих потребностей
# 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