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
:
<- format(Sys.Date() - 1, "%d-%m-%Y")
data <- "01"
producte <- set_names(
provincies c("08", "17", "25", "43"),
c("barcelona", "girona", "lleida", "tarragona")
)
Construim l’url per cada província:
<- provincies %>%
base_url map(\(prov) paste0(
"https://sedeaplicaciones.minetur.gob.es/",
"ServiciosRESTCarburantes/PreciosCarburantes/",
"EstacionesTerrestresHist/FiltroProvinciaProducto/",
"/", prov, "/", producte
data, ))
Demanem l’informació, la convertim en llista i l’apilem en una taula per cada província:
<- map(base_url, \(url) req_perform(request(url)))
response
<- response %>%
tbl 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