suppressWarnings(suppressMessages({
library(dplyr)
library(purrr)
library(httr2)
}))Preus a les gasolineres d’Espanya
Quinen preus fixen les gasolineres per cada producte al llarg del temps?
Quina informació hi ha al Geoportal?
- On s’ón’ubiquen els punts de recàrrega?
- Quin carburant ofereixen?
- Quin preu cobren? Com canvia al llarg del temps?
- Quin horari obre?
- És d’autoservei?
- És una cooperativa?
- Qui n’és el propietari?
- Existeixen portals similars a Europa
Com obtenim les dades?
Connexió amb la API
Cal connectarnos a la API del geoportal per obtenir les dades que ens interessen. Descarregarem en format .json, que R llegirà com llista. Finalment apilarem totes les observacions en una taula.
El geoportal ofereix múltiples APIs que donen accés a diferent informació (Servicios REST). Estem interessats en l’evolució dels preus de cada producte així que utilitzem la següent estructura:
Part comú: Sempre serà la mateixa
https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/
Part Específica: Escollirem i parametritzarem en funció de l’informació que volem
EstacionesTerrestresHist/FiltroProvinciaProducto/{FECHA}/{IDPROVINCIA}/{IDPRODUCTO}
Exemple en R
Utilitzarem les següents llibreries d’R:
Estem interessats en el preu de la gasolina 95 E5. Ens centrem en la província de Barcelona i volem l’informació del dia anterior. Els productes i províncies tenen codis associats, codificarem la data en format dd-mm-yy:
data <- format(Sys.Date() - 1, "%d-%m-%Y")
producte <- "01"
provincies <- set_names(
c("08", "17", "25", "43"),
c("barcelona", "girona", "lleida", "tarragona")
)Construim l’url per cada província:
base_url <- provincies %>%
map(\(prov) paste0(
"https://sedeaplicaciones.minetur.gob.es/",
"ServiciosRESTCarburantes/PreciosCarburantes/",
"EstacionesTerrestresHist/FiltroProvinciaProducto/",
data, "/", prov, "/", producte
))Demanem l’informació, la convertim en llista i l’apilem en una taula per cada província:
response <- map(base_url, \(url) req_perform(request(url)))
tbl <- response %>%
map(\(resp){
resp_body_json(resp)[["ListaEESSPrecio"]] %>%
map(\(json) as_tibble(list_flatten(json))) %>%
bind_rows() %>%
mutate(PrecioProducto = as.numeric(sub(",", ".", PrecioProducto)))
})Fem una ullada als preus:
with(list_c(tbl), boxplot(PrecioProducto ~ Provincia, xlab = "", ylab = ""))
hist(list_c(tbl)[["PrecioProducto"]], breaks = 30, main = "", xlab = "", ylab = "")
Més enllà
- Mapa de preus de gasolineres