Encoberto com chance de cron
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 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
.
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.