Dados do IPEADATA no R: web-scrapping e outras alternativas

Graças ao esforço da comunidade brasileira de R, já foram lançados alguns pacotes para acesso aos dados do IPEADATA através do R, como o ecoseries e o ipeadatar. Ambos os pacotes são de fácil utilização e facilitam a vida de quem precisa coletar os dados da plataforma de dados do IPEA. Infelizmente, estes pacotes encontram-se arquivados no CRAN, que é o servidor oficial de pacotes do R, até a data de publicação deste post. Isso pode ser muito frustrante para quem pretendia instalar os pacotes pela primeira vez ou, por exemplo, para quem os utiliza em ambiente de produção. Portanto, como acessar os dados do IPEADATA até que estes pacotes retornem ao CRAN?

Existem algumas alternativas. Primeiro, vamos carregar os pacotes utilizados neste post:

# Instalar/carregar pacotes
if(!require("pacman")) install.packages("pacman")
pacman::p_load(
"devtools",
"purrr",
"jsonlite",
"magrittr",
"dplyr",
"tidyr",
"lubridate",
"httr"
)

1. Instalar uma versão específica do pacote através do devtools

Com o pacote devtools é possível instalar uma versão específica de um pacote que esteja arquivada no CRAN, de modo que podemos pegar a última versão estável, ou seja, em funcionamento, do pacote e instalar facilmente com a função install_version. No caso do ipeadatar, a penúltima versão disponível no CRAN Package Archive é a 0.1.1, que parece ser estável, haja visto que o pacote foi arquivado após o lançamento da versão 0.1.2. Para instalar por esse método é bastante simples, bastando indicar o pacote, versão e repositório (CRAN).

devtools::install_version(
"ipeadatar", 
version = "0.1.1", 
repos = "http://cran.r-project.org"
)

2. Instalar uma versão específica através do install.packages

O mesmo procedimento anterior é possível de ser feito através do já conhecido install.packages. Basta saber a URL onde a versão do pacote desejado está localizada. Essa informação pode ser obtida na página do CRAN Package Archive. No caso do ipeadatar, uma vez que você tenha a URL, instalar o pacote é similar ao exemplo anterior:

install.packages(
"https://cran.r-project.org/src/contrib/Archive/ipeadatar/ipeadatar_0.1.1.tar.gz", 
repos = NULL, 
type = "source"
)

3. Criar uma função para extrair dados do IPEADATA

A penúltima alternativa deste breve post envolve basicamente replicar o que os pacotes já fazem. Neste caso, iremos utilizar a API do IPEADATA para coletar os dados. A função abaixo realiza a coleta e tratamento prévio dos dados, com um nível básico de robustez contra erros, retornando um objeto tibbl em formato long com colunas de data, valor e código da(s) série(s). A função possui somente um argumento que é o código da série, podendo ser utilizado como vetor de caracteres com mais de um código para coletar em uma única vez.

get_ipea <- function(code){

# Check if argument is character
if (purrr::is_character(code) & !purrr::is_null(code)) {
code <- toupper(code)
} else stop("Code argument must be a character, check the argument.", call. = FALSE)

# Ler página
raw_dados <- try(
suppressWarnings(
purrr::map(
.x = purrr::map(
.x = code,
~paste0(
"http://www.ipeadata.gov.br/api/odata4/ValoresSerie(SERCODIGO='",
.x,
"')"
)
),
~jsonlite::fromJSON(.x)
)
),
silent = TRUE
)

# Warning message for series with null return
if (0 %in% purrr::map(
.x = 1:length(code) %>% purrr::set_names(code),
~length(raw_dados[[.x]][["value"]]))
) {

flag <- purrr::map(
.x = 1:length(code) %>% purrr::set_names(code),
~length(raw_dados[[.x]][["value"]])
) %>%
dplyr::as_tibble() %>%
tidyr::pivot_longer(colnames(.)) %>%
dplyr::filter(value == 0)

if (0 %in% flag$value) {

stop(
paste0(
"Code [",
paste(flag$name, collapse = ", "),
"] not available / not found in IPEADATA."
),
call. = FALSE
)

}

}

# Data wrangling
dados <- purrr::map(.x = 1:length(code), ~raw_dados[[.x]][["value"]]) %>%
dplyr::bind_rows() %>%
dplyr::select("date" = `VALDATA`, "value" = `VALVALOR`, "code" = `SERCODIGO`) %>%
dplyr::mutate(
date = lubridate::as_date(date),
code = as.factor(code)
) %>%
dplyr::as_tibble()

return(dados)

}

A lista de códigos das séries disponíveis no IPEADATA é disponibiliza em um formato não muito convidativo neste link. Portanto, criei um protótipo de pacote chamado tidyipea e disponibilizei no meu GitHub com uma função chamada codes_ipea, que tem a mesma utilidade da função ipeadatar::available_series, retornando todas os códigos de séries disponíveis na API do IPEA.

No tidyipea também é possível utilizar a função get_ipea apresentada acima. Para instalar o pacote, basta executar:

devtools::install_github("schoulten/tidyipea")

Veja detalhes e informações na página do pacote.

4. Fazer web-scrapping simples

Por fim, também é possível fazer um web-scrapping de modo bem simples. O único requisito é saber o código da série que ser quer obter (você pode obter essa informação através do pacote tidyipea). Vamos a um exemplo com dados do CAGED: primeiro criamos um objeto com o código da série, em seguida fazemos a leitura da página com a função GET do pacote httr. Se estiver tudo ok, basta extrairmos o conteúdo do segundo elemento do objeto raw_data, que é uma lista, e realizar pequenas tratativas para transformar em um tibble.

code <- "GAC12_SALMINRE12"

# Ler página usando web-scrapping
raw_data <- httr::GET(
sprintf("http://ipeadata.gov.br/api/odata4/ValoresSerie(SERCODIGO='%s')", code)
)

# Tratar dados
tbl_data <- httr::content(raw_data)[[2]] %>% 
dplyr::bind_rows() %>% 
dplyr::select("date" = `VALDATA`, "value" = `VALVALOR`) %>% 
dplyr::mutate(date = lubridate::as_date(date))

Assim fica demonstrado diversas alternativas para obtenção dos dados do IPEADATA. A recomendação é sempre utilizar pacotes que estão disponíveis no CRAN, pois os mesmos são robustos entre plataformas e contra erros, além de terem sido testados exaustivamente. No momento atual, os pacotes que faziam esse trabalho de coleta de dados do IPEADATA estão arquivados no CRAN, portanto, recomendamos que utilize as alternativas aqui apresentadas em sequência, conforme melhor atender à necessidade em específico.

___________

(*) Gostou? Conheça nosso Curso de Análise de Conjuntura usando o R.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Previsões do Boletim Focus em Anos Eleitorais

Eleições são momentos de incerteza, mas os dados do Boletim Focus mostram que nem toda incerteza é igual. Ao analisar as previsões de inflação, juros e câmbio nos anos que antecederam as eleições de 2014, 2018 e 2022, este post investiga como o mercado revisa cenários macroeconômicos ao longo do tempo.

Como Medir o Ciclo das Concessões de Crédito usando Python

Este exercício apresenta uma análise quantitativa da relação entre o ciclo de concessões de crédito, a atividade econômica e a política monetária no Brasil. Utilizando a linguagem Python, o estudo aplica técnicas de decomposição de séries temporais (X13-ARIMA e Filtro HP) para isolar os componentes cíclicos dos dados. Os resultados da modelagem econométrica confirmam a pró ciclicidade do crédito em relação ao hiato do produto e sua sensibilidade às variações no hiato da taxa de juros real.

Choque de juros e renda em bens duráveis e não duráveis usando Python

Este artigo analisa a dinâmica do consumo no Brasil utilizando Python e modelos de Vetores Autorregressivos (VAR). Ao segregar bens duráveis e não duráveis, o estudo quantifica a sensibilidade a choques de juros e renda. Criamos todo o processo através do ciclo de dados: coleta, tratamento, análise de dados, modelagem e apresentação dos resultados, tudo automatizado usando a linguagem Python.

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.