C. Lente

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.