Como automatizar seu download de dados?
A automatização da obtenção de dados utilizados em análises traz dois benefícios principais: i) poupa tempo ao analista e ii) garante um padrão na execução de comandos e tratamentos básicos. Essa é a primeira etapa daquilo que chamamos de ETL (Extraction, Transform and Load). Existem diversas ferramentas que auxiliam na extração de dados de diversas fontes. O R é uma delas. Através do R é possível: realizar download de bases conectando-se a um endereço online, conectar-se a APIs, etc. Muitas fontes usuais já possuem pacotes para uma conexão “nativa” com o R. Será objetivo desse tutorial apresentar algumas dessas funcionalidades.
key words: Web Scraping, Download de dados, ETL
Utilizando o pacote Sidrar para download de dados do IBGE
O pacote Sidrar permite o R acessar de forma simples o API criado pelo IBGE (Instituto Brasileiro de Geografia e Estatística) e consumir os dados nele disponível. Normalmente, para acessar esse tipo de aplicação é necessário enviar a um servidor requisições (request) no modelo HTTP (Hypertext Transfer Protocol) que nada mais é do que uma linguagem para comunicação de um servidor com uma máquina cliente. No entanto, o objetivo desse pacote é simplificar essa comunicação além de converter a um formato mais facilmente tratável a resposta da solicitação enviada.
Para obter o dados basta usar a função get_sidra
. Você pode ver quais os parâmetros dessa função utilizando help(get_sidra)
. Há duas formas de especificar a consulta que deseja realizar:
- explicitando os parâmetros utilizando as variáveis de entrada da função
get_sidra
; - fornecendo um texto no formato de consulta utilizado pela requisição enviado ao API.
Nesse segundo caso a estrutura os parâmetros são fornecidos por meio de um texto separado por “/”. Vamos a dois exemplos que ilustram ambas as execuções.
require(installr)
require2(sidrar)
tb_ibge = get_sidra(x = 1612, period = "all", variable = 109,
classific = "c81", category = list(2713),
geo = "Region", geo.filter = "all")
str(tb_ibge)
## 'data.frame': 230 obs. of 13 variables:
## $ Nível Territorial (Código) : chr "2" "2" "2" "2" ...
## $ Nível Territorial : chr "Grande Região" "Grande Região" "Grande Região" "Grande Região" ...
## $ Unidade de Medida (Código) : chr "" "" "" "" ...
## $ Unidade de Medida : chr "" "" "" "" ...
## $ Valor : num NA NA NA NA NA NA NA NA NA NA ...
## $ Grande Região (Código) : chr "1" "1" "1" "1" ...
## $ Grande Região : chr "Norte" "Norte" "Norte" "Norte" ...
## $ Ano (Código) : chr "1974" "1975" "1976" "1977" ...
## $ Ano : chr "1974" "1975" "1976" "1977" ...
## $ Variável (Código) : chr "109" "109" "109" "109" ...
## $ Variável : chr "Área plantada" "Área plantada" "Área plantada" "Área plantada" ...
## $ Produto das lavouras temporárias (Código): chr "2713" "2713" "2713" "2713" ...
## $ Produto das lavouras temporárias : chr "Soja (em grão)" "Soja (em grão)" "Soja (em grão)" "Soja (em grão)" ...
tb_ibge2 = get_sidra (api="/t/1612/p/all/v/109/c81/2713/n2/all")
str(tb_ibge2)
## 'data.frame': 230 obs. of 13 variables:
## $ Nível Territorial (Código) : chr "2" "2" "2" "2" ...
## $ Nível Territorial : chr "Grande Região" "Grande Região" "Grande Região" "Grande Região" ...
## $ Unidade de Medida (Código) : chr "" "" "" "" ...
## $ Unidade de Medida : chr "" "" "" "" ...
## $ Valor : num NA NA NA NA NA NA NA NA NA NA ...
## $ Ano (Código) : chr "1974" "1974" "1974" "1974" ...
## $ Ano : chr "1974" "1974" "1974" "1974" ...
## $ Variável (Código) : chr "109" "109" "109" "109" ...
## $ Variável : chr "Área plantada" "Área plantada" "Área plantada" "Área plantada" ...
## $ Produto das lavouras temporárias (Código): chr "2713" "2713" "2713" "2713" ...
## $ Produto das lavouras temporárias : chr "Soja (em grão)" "Soja (em grão)" "Soja (em grão)" "Soja (em grão)" ...
## $ Grande Região (Código) : chr "1" "2" "3" "4" ...
## $ Grande Região : chr "Norte" "Nordeste" "Sudeste" "Sul" ...
Os objetos tb_ibge e tb_ibge2 são idênticos. A tabela abaixo deixa mais claro quais dados estão sendo solicitados para o API.
Parâmetro API | Descrição | Parâmetro equivalente na função get_sidra |
---|---|---|
t | Nº da tabela pesquisada. | x |
p | Período de tempo solicitado. | period |
v | Nº da variável pesquisada na tabela. | variable |
c | Categoria (se houver) da variável pesquisada (ex. sexo, cultura cultivada, etc) na tabela. No api deve-se colocar c junto ao código da categoria. | classific |
n | Nível territorial (ex. federal, estadual, etc) das variáveis solicitadas. No api deve-se colocar n junto ao código do nível territorial. | geo |
Os exemplos solicitaram:
A tabela número 1.612 cujo nome é “Área plantada, área colhida, quantidade produzida, rendimento médio e valor da produção das lavouras temporárias” (variáveis x e t);
Todos os períodos de dados disponíveis (variáveis period e p);
Variável número 109 referente a Área plantada em Hectares (variáveis variable e v);
Filtro na categoria de código c81 - Produto das lavouras temporárias (variáveis classific e c) retornando apenas a variável referente ao produto 2713 - Soja (em grão) (variáveis category ou preenchendo após “/” no API);
Filtro no nível territorial de código n2 - Region (variáveis geo e n) retornando todos os dados segmentados por esse nível geográfico (variáveis geo.filter ou preenchendo após “/” no API).
Você pode ver mais informações sobre os parâmetros e funcionalidades do API do IBGE aqui, além de outras funcionalidades do pacote Sidrar. É possível até mesmo estruturar os parâmetros de consulta automaticamente utilizando o endereço anterior.
Utilizando o pacote BETS para acessar dados do BACEN, FGV, IBGE e IPEADATA
O pacote BETS permite acesso rápido e fácil a diversas séries temporais referentes a variáveis econômicas brasileiras. Essencialmente as duas principais funções relacionadas a esse pacote são BETSsearch
e BETSget
.
A primeira função tem o intuito de descobrir o código das séries procuradas. A procura tem como parâmetro informações como descrição, fonte, periodicidade, entre outros. A segunda função é a que retorna os dados quanto ao código das séries fornecidas, sendo possível especificar o horizonte temporal desejado. Vamos para alguns exemplos.
require2(BETS)
head(BETSsearch(description = "ipca")) ## Busca séries que contenham na descrição "ipca"
## # A tibble: 6 x 7
## code description unit periodicity start last_value source
## <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 10764 National Consumer Price I~ Monthly~ M 31/01~ mar/2018 IBGE
## 2 10841 National Consumer Price I~ Monthly~ M 31/01~ mar/2018 BCB-D~
## 3 10842 National Consumer Price I~ Monthly~ M 31/01~ mar/2018 BCB-D~
## 4 10843 National Consumer Price I~ Monthly~ M 31/01~ mar/2018 BCB-D~
## 5 10844 National Consumer Price I~ Monthly~ M 31/01~ mar/2018 BCB-D~
## 6 11426 Broad national consumer p~ Monthly~ M 31/01~ mar/2018 BCB-D~
tabela_ipca = BETSget(10764, from = "2014-01-01", to = "2021-06-23", data.frame = TRUE) ## Obtem a série identificada
head(BETSsearch(description = "exchange")) ## Busca séries que contenham na descrição "exchange"
## # A tibble: 6 x 7
## code description unit periodicity start last_value source
## <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 1 Exchange rate - Free - U~ c.m.u.~ D 28/11~ 26/03/2018 Sisbace~
## 2 10622 Federal securities debt ~ % M 31/01~ mar/2018 BCB-DST~
## 3 10663 Federal securities debt ~ c.m.u.~ M 31/01~ mar/2018 BCB-Dem~
## 4 10664 Federal securities debt ~ c.m.u.~ M 31/01~ mar/2018 BCB-Dem~
## 5 10665 Federal securities debt ~ c.m.u.~ M 31/01~ mar/2018 BCB-Dem~
## 6 10666 Federal securities debt ~ c.m.u.~ M 31/01~ mar/2018 MF-STN
tabela_cambio = BETSget(1, data.frame = TRUE, from = "2018-01-01", to = "2021-06-23") ## Obtem a série identificada
Realizando o download de planilhas e outros arquivos diretamente da Web
Caso os dados que deseja não estejam em nenhum banco estruturado para consumo, como vimos anteriormente, ainda é possível baixá-los facilmente desde que estejam acessíveis via URL.
Tomaremos como exemplo a obtenção das cotações do contrato nº 11 de açúcar negociado na ICE (Intercontinental Exchange). Para obter o link que disponibiliza os dados acesse o site da ICE clicando aqui. Em seguida, siga o procedimento ilustrado abaixo.
O link obtido será copiado para a área de transferência e deve ser colado no objeto url
no código abaixo. A função download.file
é utilizada para fazer o download. Nela você deve informar uma variável texto contendo o endereço da Web, o nome a ser dado ao arquivo baixado e o modo de download. De forma simplificada basta saber que esse último parâmetro devera ser wb para download de planilhas e w para arquivos de texto.
require2(readxl)
url = "https://www.theice.com/publicdocs/futures_us_reports/sugar/Sugar%2011%20Historical%20Prices.xls"
download.file(url, dest = "NY11.xls", mode = "wb") ## realiza o download do arquivo e armazena do diretório atual
preco.acucar <- read_excel("NY11.xls", skip = 4) ## carrega o arquivo para o R
O arquivo será armazenado no diretório atual utilizado pelo R. A função read_excel
carrega o arquivo para o objeto preco.acucar
. Esse mesmo procedimento pode ser utilizado para baixar outros tipos de arquivos, como por exemplo arquivos de texto (.txt).
O problema dessa abordagem é que ela exige que o link o qual os dados estão disponíveis não se altere. Logo, quando há a necessidade de definir parâmetros na consulta que gerará os dados, como a escolha de períodos ou o nome da série que deseja baixar, essa funcionalidade será limitada pois um novo endereço é gerado a cada download.
Para superar essa limitação temos outra abordagem mais sofisticada o qual será tema de estudo da parte II desse tutorial.