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.