Carnaval!

A Shiny app to find Carnaval blocos in São Paulo

8 minute read

I’ve been getting more and more interested in web graphics, particularly d3. All of this of course depends on javascript, a language I don’t know very well. As a way to start learning it, I thought I’d give Shiny a go, as a bridge between R and javascript (I’ve since started a javascript course proper). I’ve been surprised by how simple and powerful Shiny is, although the problems I ran into I wasn’t able to solve.
Anyway, given that it is Carnaval time here in São Paulo, I thought I would make an app that shows the route of each ‘bloco’ (parade) in the city. You can see the finished app here. Here’s a screenshot:

It’s almost what I wanted, but I couldn’t get the map to show the routes as I wanted (I asked for help here on Stack Overflow). Anyway, the whole project was interesting, since it involved scraping the data from a pdf that the city council made available with info on the blocos, and then some (serious) work cleaning it up and geocoding the locations with the fantastic Mapzen, through an R package, rmapzen. The code for getting the data ready is below, and the code for the Shiny app can be accessed on the app page.

library(tabulizer)
library(tidyverse)
library(lubridate)

'%ni%' <- Negate('%in%')


blocos <- extract_tables("http://carnavalderua.prefeitura.sp.gov.br/wp-content/uploads/2017/02/Blocos-Carnaval-de-Rua-de-SP_08022017_por-prefeitura-regional_site.pdf")


carnaval <- do.call(rbind, blocos)
carnaval <- carnaval[-1, ]
carnaval <- as_data_frame(carnaval)
colnames(carnaval) <- carnaval[1, ]
carnaval <- carnaval[c(-1, -433), ]


carnaval <- carnaval %>% 
  mutate(`Trajeto completo` = stringi::stri_trans_general(`Trajeto completo`, "Latin-ASCII"),
         `Trajeto completo` = gsub(" - ", ",", `Trajeto completo`),
         `Trajeto completo` = gsub("-", ",", `Trajeto completo`),
         `Trajeto completo` = gsub(" e ", ",", `Trajeto completo`),
         `Trajeto completo` = gsub(" \\+ ", ",", `Trajeto completo`),
         `Trajeto completo` = gsub("/", ",", `Trajeto completo`),
         `Trajeto completo` = gsub(";", ",", `Trajeto completo`),
         `Trajeto completo` = gsub(" x ", ",", `Trajeto completo`),
         `Trajeto completo` = gsub("\\r", "", `Trajeto completo`),
         `Trajeto completo` = gsub(" > ", ",", `Trajeto completo`),
         `Trajeto completo` = gsub(" – ", ",", `Trajeto completo`),
         `Trajeto completo` = gsub(" com ", ",", `Trajeto completo`),
         `Trajeto completo` = gsub(" ate ", ",", `Trajeto completo`),
         `Trajeto completo` = gsub(" em sentido ", ",", `Trajeto completo`),
         `Trajeto completo` = gsub("nº", "", `Trajeto completo`),
         `Trajeto completo` = gsub("n° ", "", `Trajeto completo`),
         `Trajeto completo` = gsub("r. ", "rua ", `Trajeto completo`),
         Data = paste0(Data, "/2017"),
         Data = parse_date_time(Data, "dmY"),
         Concentração = gsub("h", ":00", Concentração),
         Regional = ifelse(Regional == "Vila Maria /  Vila Guilher",
                           "Vila Maria/Vila Guilherme", ifelse(
                             Regional == "Freguesia do ÓBrasilândia",
                             "Freguesia do Ó/Brasilândia", ifelse(
                               Regional == "Freguesia do Ó/Brasilândi",
                               "Freguesia do Ó/Brasilândia", Regional
                               )))) %>%
  filter(`Trajeto completo` %ni% c("Fixo", "Parado"),
         Regional %ni% c("M'Boi Mirim", "Pirituba/Jaraguá", 
                         "Pirituba/jaraguá", "Parelheiros")) %>% 
  separate(`Trajeto completo`, sep = ",",
           into = c("inicio", "um", "dois", "tres", "quatro", "cinco",
                    "seis", "sete","oito", "nove", "dez", "onze", "doze",
                    "treze"), remove = FALSE)


carnaval$inicio <- gsub("Concentracao na ", "", carnaval$inicio)
carnaval$inicio <- gsub("parque de cachorros na praça Praça Mateus Grow", 
                        "Matheus Grou", carnaval$inicio)
carnaval$inicio <- gsub("Inicio e termino na ", "", carnaval$inicio)
carnaval$inicio <- gsub("Segue pelo ", "", carnaval$inicio)
carnaval$inicio <- gsub("Descer a ", "", carnaval$inicio)
carnaval$inicio <- gsub("saida pela rua ", "", carnaval$inicio)
carnaval$inicio <- gsub("SAIDA DA ", "", carnaval$inicio)
carnaval$inicio <- gsub("sentido ", "", carnaval$inicio)
carnaval$inicio <- gsub("Desce a ", "", carnaval$inicio)
carnaval$inicio <- gsub("Saida da ", "", carnaval$inicio)
carnaval$inicio <- gsub("Vao ate a ", "", carnaval$inicio)
carnaval$inicio <- gsub(" e ficar mais tempo na ", "", carnaval$inicio)
carnaval$inicio <- gsub("Viras a ", "", carnaval$inicio)
carnaval$inicio <- gsub("Viras a esquerda na ", "", carnaval$inicio)
carnaval$inicio <- gsub("Concentracao: ", "", carnaval$inicio)
carnaval$inicio <- gsub("ate a ", "", carnaval$inicio)
carnaval$inicio <- gsub("ate o ", "", carnaval$inicio)
carnaval$inicio <- gsub("ate o numero ", "", carnaval$inicio)
carnaval$inicio <- gsub("ate o final", "", carnaval$inicio)
carnaval$inicio <- gsub("vira a esquerda na ", "", carnaval$inicio)
carnaval$inicio <- gsub("numero \\d*", "", carnaval$inicio)
carnaval$inicio <- gsub("\\r", "", carnaval$inicio)
carnaval$inicio <- gsub("Saindo da ", "", carnaval$inicio)
carnaval$inicio <- gsub("sai da ", "", carnaval$inicio)
carnaval$inicio <- gsub("Sai da ", "", carnaval$inicio)
carnaval$inicio <- gsub("Saida ", "", carnaval$inicio)
carnaval$inicio <- gsub("Saida da ", "", carnaval$inicio)
carnaval$inicio <- gsub("saida ", "", carnaval$inicio)
carnaval$inicio <- gsub(" \\(centro x bairro\\) ", "", carnaval$inicio)
carnaval$inicio <- gsub("saida do bloco da ", "", carnaval$inicio)
carnaval$inicio <- gsub("Entorno ", "", carnaval$inicio)
carnaval$inicio <- gsub("argo da Matriz ", "Largo da Matriz", carnaval$inicio)
carnaval$inicio <- gsub("retorno em ", "", carnaval$inicio)
carnaval$inicio <- gsub("segue ate a ", "", carnaval$inicio)
carnaval$inicio <- gsub("descemos a ", "", carnaval$inicio)
carnaval$inicio <- gsub("Entrar na ", "", carnaval$inicio)
carnaval$inicio <- gsub("indo ate a ", "", carnaval$inicio)
carnaval$inicio <- gsub("Esquina da ", "", carnaval$inicio)
carnaval$inicio <- gsub("Esquina das ", "", carnaval$inicio)
carnaval$inicio <- gsub("Esquina ", "", carnaval$inicio)
carnaval$inicio <- gsub("R\\. ", "Rua ", carnaval$inicio)
carnaval$inicio <- gsub("Descer a ", "", carnaval$inicio)
carnaval$inicio <- gsub("Ruas: ", "", carnaval$inicio)
carnaval$inicio <- gsub(" reto na ", "", carnaval$inicio)
carnaval$inicio <- gsub(" direita na ", "", carnaval$inicio)
carnaval$inicio <- gsub("Volta no ", "", carnaval$inicio)
carnaval$inicio <- gsub(" na altura da ", "", carnaval$inicio)
carnaval$inicio <- gsub("Volta pelo ", "", carnaval$inicio)
carnaval$inicio <- gsub(" entre ", "", carnaval$inicio)
carnaval$inicio <- gsub("Sobe ", "", carnaval$inicio)
carnaval$inicio <- gsub(" fechada as 12h ", "", carnaval$inicio)
carnaval$inicio <- gsub(" inteirua so fica nessa rua entrua a Cardeal ", "", carnaval$inicio)
carnaval$inicio <- gsub(" \\(no estacionamento do lado do Bar Piraja\\) ", 
                        "", carnaval$inicio)
carnaval$inicio <- gsub(" \\(Mercearia Sao Roque\\) ", "", 
                        carnaval$inicio)
carnaval$inicio <- gsub(" Vao ", "", carnaval$inicio)
carnaval$inicio <- gsub(" \\(Subindo\\) ", "", carnaval$inicio)
carnaval$inicio <- gsub(" \\(Em frente ao Teatrua Municipal\\) ", 
                        "", carnaval$inicio)
carnaval$inicio <- gsub("Inicio na rua Galvao Bueno \\(da esquina da rua Americo de Campos\\) ", "rua Galvao Bueno", carnaval$inicio)
carnaval$inicio <- gsub(" \\(pista local\\) ", "", carnaval$inicio)
carnaval$inicio <- gsub(" \\(Em frente a Praca Dom Jose Gaspar\\) ", "", carnaval$inicio)
carnaval$inicio <- gsub(" a Dispersao acontecerua exatamente no ", 
                        "", carnaval$inicio)
carnaval$inicio <- gsub("\\.\\.\\. sem deslocamento ", "", carnaval$inicio)
carnaval$inicio <- gsub("Divinp", "Divino", carnaval$inicio)
carnaval$inicio <- gsub(" e toda extensao de sua rua ", "", carnaval$inicio)
carnaval$inicio <- gsub("Saindo da \\(concentracao\\) da ", "", 
                        carnaval$inicio)
carnaval$inicio <- gsub("Calcadao do ", "", carnaval$inicio)
carnaval$inicio <- gsub(" a partir da ", "", carnaval$inicio)
carnaval$inicio <- gsub(" na alturua do numerua 255 ", "255", carnaval$inicio)
carnaval[6, 6] <- "av. eng. heitor antonio eiras garcia 943"
carnaval[6, 7] <- "rua joão casagrande"
carnaval[6, 8] <- "rua otacilio tomanik"
carnaval[6, 9] <- "praça isai lener"
carnaval[6, 10] <- "av. eiras garcia"
carnaval[7, 6] <- "Rua Conde Silva Penteado"
carnaval[7, 7] <- "Rua Padre Carvalho"
carnaval[12, 6] <- "Rua Iquiririm"
carnaval[20, 6] <- "Praça Escolar"
carnaval[20, 7] <- "Rua Icanhema"
carnaval[20, 8] <- "Rua Padre José Garzotti"
carnaval[20, 9] <- "Rua Mataripe"
carnaval[21, 6] <- "Rua Carolina Roque"
carnaval[21, 6] <- "Rua Atlântico Meridional"
carnaval[21, 6] <- "Rua Miguel Angelo Lupi"
carnaval[36, 7] <- "Av Abel Tavares 1564"


carnaval <- carnaval %>% 
  gather(etapa, rota, inicio:treze) %>% 
  select(-`Trajeto completo`) %>%
  mutate(rota = ifelse(nchar(rota) <= 4, NA, rota),
         rota = ifelse(grepl("\\d", rota), NA, rota),
         rota = trimws(rota),
         rota = gsub("esquerda", "", rota),
         rota = gsub("esquina", "", rota),
         rota = gsub("esquina", "", rota),
         rota = gsub("em direcao", "", rota),
         rota = gsub("anhamgabau", "anhangabau", rota),
         rota = gsub("direita", "", rota),
         rota = gsub("termina", "", rota),
         rota = gsub(" na ", "", rota),
         rota = gsub(" no ", "", rota),
         rota = gsub("chegar", "", rota),
         rota = gsub("acessar", "", rota),
         rota = gsub("Alternativa disperscao: Praca Republica", 
                     "", rota)) %>% 
  filter(!is.na(rota),
         rota %ni% c("INTERVALO", "CONTORNAR MEIA ROTATORIA", 
                     "terminal EMTU. Retorno: Terminal EMTU", 
                     "Volta", "Inicio", "em frente a igreja", "30 vai",
                     "o final", "virar a ", "a Galeria", "da a volta",
                     "o cruzamento", "segue por ele",
                     "DESCER E FAZER O TRAJETO DE VOLTA ATE A RUA APA",
                     "(tres voltas)"),
         nchar(rota) > 2) %>%
  mutate(lon = NA, lat = NA,
         rota = paste0(rota, ", Sao Paulo"))


for(i in 1:nrow(carnaval)){
  if(length(mz_coordinates(mz_search(carnaval$rota[i], 
                             size = 1, 
                             boundary.country = "BR"))[[1]]) > 0 &
     class(try(length(mz_coordinates(mz_search(carnaval$rota[i], 
                             size = 1, 
                             boundary.country = "BR"))[[1]]))) != "try-error"){
    carnaval$lon[i] <- mz_coordinates(mz_search(carnaval$rota[i], 
                             size = 1, 
                             boundary.country = "BR",
                             focus.point = mz_location(lat = -23.5, 
                                                       lon = -46)))[[1]]
  } else {
    carnaval$lon[i] <- NA
    }
  if(length(mz_coordinates(mz_search(carnaval$rota[i], 
                             size = 1, 
                             boundary.country = "BR"))[[2]]) > 0 &
     class(try(length(mz_coordinates(mz_search(carnaval$rota[i], 
                             size = 1, 
                             boundary.country = "BR"))[[2]]))) != "try-error"){
    carnaval$lat[i] <- mz_coordinates(mz_search(carnaval$rota[i], 
                             size = 1, 
                             boundary.country = "BR",
                             focus.point = mz_location(lat = -23.5, 
                                                       lon = -46)))[[2]]
  } else {
    carnaval$lat[i] <- NA
  }
}

colnames(carnaval)[2] <- "Nome do bloco"

carnaval <- carnaval %>% 
  mutate(rota = gsub(", Sao Paulo", "", rota)) %>%
  filter(lat >= -24, lat <= -23,
         lon >= -47, lon <= -46) %>%
  group_by(Regional, `Nome do bloco`, Data) %>%
  distinct(Regional, `Nome do bloco`, Data, etapa, .keep_all = T) %>%
  mutate(stage = ifelse(etapa == "inicio", "A", ifelse(
    etapa == "um", "B", ifelse(etapa == "dois", "C", ifelse(
      etapa == "tres", "D", ifelse(etapa == "quatro", "E", ifelse(
        etapa == "cinco", "F", ifelse(etapa == "seis", "G", ifelse(
          etapa == "sete", "H", ifelse(etapa == "oito", "I", ifelse(
            etapa == "nove", "J", ifelse(etapa == "dez", "K", ifelse(
              etapa == "onze", "L", ifelse(etapa == "doze", "M", "N")))))
          ))))))))) %>%
  arrange(`Nome do bloco`, stage, Data) %>%
  ungroup() %>%
  mutate(Regional = ifelse(Regional == "Jaçanã / Tremembé", "Jaçanã/Tremembé",
                           ifelse(Regional == "Casa verde", "Casa Verde",
                                  Regional)))
comments powered by Disqus