Nem sempre os dados que precisamos para uma análise podem ser encontrados em uma base consolidada. Muitas vezes as informações que queremos não estão imediatamente disponíveis e precisam ser coletadas com o tempo através de um processo lento e monótono.
Imagine, por exemplo, que quiséssemos baixar os dados meteorológicos das maiores cidades do mundo a cada 12 horas para uma análise sobre previsões do tempo. Um programador desavisado talvez criasse alarmes em seu relógio e para baixar as tabelas necessárias quando eles tocassem.
Mas isso não parece uma boa estratégia, certo?
DarkSky
Para demonstrar uma alternativa a este método, vamos usar um serviço de previsões do tempo chamado DarkSky. Esta plataforma ficou conhecida recentemente pela sua precisão incrível e pelo seu aplicativo extremamente bem feito, mas uma coisa que poucos sabem é que a DarkSky também disponibiliza uma API para qualquer um interessado em dados meteorológicos.
Para a nossa sorte, o hrbrmstr já criou uma interface em R para essa API que pode ser instalada facilmente com o comando abaixo:
# install.packages("devtools")
devtools::install_github("hrbrmstr/darksky")
Depois de instalado o pacote, vá para o portal do desenvolvedor da DarkSky, crie uma conta e obtenha uma chave secreta para acessar a API.
Sys.setenv(DARKSKY_API_KEY = "SUA CHAVE SECRETA")
Baixando os dados
O primeiro passo da nossa análise é determinar as latitudes e longitudes das maiores cidades do mundo para que possamos pedir as previsões do tempo destas coordenadas.
Com o pacote maps
podemos fazer isso de uma maneira bastante simples:
forecasts <- maps::world.cities %>%
dplyr::as_tibble() %>%
dplyr::filter(pop > 2000000) %>%
dplyr::rename(country = country.etc) %>%
dplyr::select(name, country, lat, long) %>%
dplyr::mutate(
currently = list(""),
hourly = list(""),
daily = list(""))
No trecho de código acima pegamos todas as cidades com mais de 2 milhões de
habitantes (juntamente com suas localizações) da base maps::world.cities
.
As últimas 4 linhas são uma preparação para a obtenção das previsões do tempo
que faremos logo a seguir:
for (i in 1:nrow(forecasts)) {
forecast <- darksky::get_current_forecast(forecasts$lat[i], forecasts$long[i])
forecasts$currently[i] <- forecast$currently %>% dplyr::as_tibble() %>% list()
forecasts$hourly[i] <- forecast$hourly %>% dplyr::as_tibble() %>% list()
forecasts$daily[i] <- forecast$daily %>% dplyr::as_tibble() %>% list()
}
Na coluna currently
guardamos o estado meteorológico atual da cidade, enquanto
em hourly
e daily
colocamos as previsões do tempo para as próximas 48 horas
e para os próximos 7 dias respectivamente. Agora só resta salvar isso tudo em um
arquivo RDS:
file <- lubridate::now() %>%
lubridate::ymd_hms() %>%
as.character() %>%
stringr::str_replace_all("[-: ]", "_") %>%
stringr::str_c(".rds")
readr::write_rds(forecasts, stringr::str_c("DIRETÓRIO DOS ARQUIVOS", file))
cronR
Perceba que o script descrito na seção anterior não depende de nenhum input do
programador e pode ser rodado automaticamente. Agora só nos resta automatizar
essa execução, tarefa que realizaremos com o pacote cronR
. Ele funciona nas
plataformas Mac e Linux e pode ser instalado com o comando a seguir:
install.packages("cronR")
Esse pacote nos permite agendar a execução de qualquer comando para que ela ocorra a cada tantos minutos/horas/dias/… Certifique-se de que você está em uma máquina ou servidor que não será desligado, verifique se o cron daemon está ativo e agende a execução do nosso script:
cmd <- cronR::cron_rscript("CAMINHO PARA SCRIPT")
cronR::cron_add(cmd, "daily", "12AM")
cronR::cron_add(cmd, "daily", "12PM")
E isso é tudo! No meu caso, agendei o script para executar diariamente às 00:00 e às 12:00, mas a frequência das chamadas fica a seu critério (lembrando apenas que o plano gratuito da API do DarkSky só permite 1000 chamadas por dia). Para saber mais sobre como mudar a frequência das execuções, consulte a documentação do cronR.
Conclusão
Como vimos, não é difícil agendar a execução de um script. A maior parte do
nosso trabalho é criar um código que funcione independentemente do programador
(por exemplo nomeando os arquivos gerados automaticamente), mas depois disso
é só chamar cronR::cron_rscript()
e cronR::cron_add()
.
No meu próximo post usarei os dados baixados com esse tutorial para uma análise sobre previsões meteorológicas, então fique ligado na parte dois!
P.S.: Se você quiser o código completo do meu arquivo get_forecasts.R
,
disponibilizei ele como um Gist.
Além disso, também disponibilizei uma versão em inglês deste post no
meu blog pessoal. Abraços!