Cómo conseguir datos de ESIOS con su API

Uno de los primeros retos a los que se enfrentan los analistas del sector es conseguir automatizar la entrada de los datos. Generalmente, en el sector energético y particularmente en el eléctrico, se disponen de grandes cantidades de datos y variables accesibles por diferentes vías, y obviamente resultaría tremendamente engorroso e ineficiente descargar manualmente cada día desde la web decenas de archivos.

En el caso español, REE dispone de una avanzada plataforma pública donde cualquiera, de forma gratuita, puede visualizar y descargar la información relativa al sistema eléctrico. Dicha plataforma, llamada ESIOS, tiene además una API.

¿Qué es una API y cómo se pueden descargar los datos de REE?

Una API es el acrónimo inglés de application programming interface, y tal y como dice la propia wikipedia:

Una API representa la capacidad de comunicación entre componentes de software. Se trata del conjunto de llamadas a ciertas bibliotecas que ofrecen acceso a ciertos servicios desde los procesos y representa un método para conseguir abstracción en la programación, generalmente (aunque no necesariamente) entre los niveles o capas inferiores y los superiores del software. Uno de los principales propósitos de una API consiste en proporcionar un conjunto de funciones de uso general, por ejemplo, para dibujar ventanas o iconos en la pantalla. De esta forma, los programadores se benefician de las ventajas del API haciendo uso de su funcionalidad, evitándose el trabajo de programar todo desde el principio. Las API asimismo son abstractas: el software que proporciona una cierta API generalmente es llamado la implementación de esa API.

En lo que respecta a REE, el primer paso es acudir a su documentación para entender qué parámetros se pueden utilzar y cómo se tienen que realizar las llamadas, pero para los ávidos de información voy a pasar directamente a exponer un ejemplo (qué mejor forma de aprender).

Ejemplo: descargar los datos históricos de la generación programada eólica en el PBF

El siguiente ejemplo lo realizaré en R y la interfaz RStudio, software gratuito e instalable en cualquier Mac, Linux o Windows. Si se quiere saber cómo instalarlo, basta con seguir los pasos de este tutorial.

A continuación, pasaré directamente a conseguir los datos desde el 1 de enero de 2014, la fecha más antigua desde la que puedo llamar los datos:

1. Conseguir el token de REE

Antes de picar código, envía un email a consultasios@ree.es para solicitar a REE un token único y personal. Con este token has de realizar las llamadas a su API. Es gratis y generalmente te lo enviarán al email en máximo 24 horas.

2. Instalación y carga en RStudio las siguientes librerías

  • RCurl: para conectarte a la API de ESIOS.
  • jsonlite: para importar y trabajar los archivos a los que se llaman desde la API.
  • lubridate: para trabajar las fechas (indispensable si uno no queire asignar valores a horas equivocadas).
  • dplyr: básico para escribir un código limpio y entendible.
install.packages("RCurl", "jsonlite", "lubridate", "dplyr")
library(RCurl)
library(dplyr)
library(lubridate)
library(jsonlite)

3. Introduzco la ruta del indicador de la eólica y tu token

Para saber el ID lo más fácil es navegar por la web y decidir qué datos son los que quieres captar automáticamente vía API. En este caso, he visto la pantalla de la generación eólica programada en el PBF:

Lo que interesa en la URL de nuestro navegador, donde se identifica el ID de la eólica con el siguiente número:

Será este número el que utilice para llamar a los datos. También se puede conseguir el ID utilizando la misma API a través de una query o búsqueda, que sería lo más práctico.

A continuación, introduzco la siguiente ruta y el token que me ha enviado REE (el token que he puesto en el código es el de la propia documentación de la API. ¡Recuerda poner el tuyo propio!)

# Definición del ID del indicador
indicador <- 10073

# Token
httpheader <- 'Authorization: Token token="cd1ef004d4b59456a62610af711340aebc1555e30c4bf656640326358c92341b"'

# Hasta qué fecha fin quiero los datos
hoy <- ymd_hms(paste0(Sys.Date(), " 00:00:00" ), tz = "Europe/Madrid")

# URL
uri <- paste0("https://api.esios.ree.es/indicators/", indicador, "?start_date=", "01-01-2014", "T", "00:00:00+02:00&end_date=", as.Date(hoy), "T", "23:50:00+02:00&geo_agg=sum&geo_ids&time_trunc=hour&time_agg=&locale=es")

La URL del objeto uri tiene varios parámetros, como la fecha de inicio, la fecha fin, o si deseo agregaciones de datos o truncarlos por días, meses, etc. En este caso, no necesito nada de eso.

4. Extracción de datos

La llamada recupera un archivo de texto, que trabajado con la libraría jsonlite y dplyr se transforma en una tabla limpia y legible:

# Extracción del JSON
extraccion <- getURI(uri, httpheader = httpheader)
extraccion <- fromJSON(txt=extraccion)

# Limpieza de la tabla
extraccion <- extraccion %>%
                          as.data.frame() %>%
                          select(indicator.values.tz_time, indicator.values.value) %>%
                          mutate(name = "eólica") %>%
                          select(indicator.values.tz_time, name, indicator.values.value)
## Warning in (function (..., row.names = NULL, check.rows = FALSE,
## check.names = TRUE, : row names were found from a short variable and have
## been discarded
# Corrección de la fecha para tenerla en hora local peninsular
extraccion$indicator.values.tz_time <- ymd_hms(extraccion$indicator.values.tz_time, tz = "Europe/Madrid", locale = Sys.getlocale("LC_TIME"))
## Date in ISO8601 format; converting timezone from UTC to "Europe/Madrid".
# NOmbramos las nuevas columnas
colnames(extraccion) <- c("datetime", "name", "value")

Esta es la tabla conseguida vía API:

##              datetime   name  value
## 1 2014-01-01 00:00:00 eólica 9578.4
## 2 2014-01-01 01:00:00 eólica 9660.4
## 3 2014-01-01 02:00:00 eólica 9583.0
## 4 2014-01-01 03:00:00 eólica 9250.3
## 5 2014-01-01 04:00:00 eólica 9263.4
## 6 2014-01-01 05:00:00 eólica 9253.8

5. Exportamos los datos a un csv para abrir en Excel

Finalmente, para los analistas que quieren trabajar en Excel, lo más sencillo es exportar la tabla a un csv para realizar el análisis correspondiente:

# Nombre del archivo a exportar
nombre_archivo <- "generacionEolicaPBF"

# Exportación a csv
write.csv2(extraccion, row.names = FALSE, file = paste0("/Users/pherreraariza/Downloads/", nombre_archivo, ".csv"))

Para los usuarios más avanzados, lo propio es escribir una función que itere sobre una lista de indicadores (por ejemplo, el resto de tecnologíias del programa base de funcionamiento), pero esto lo escribiré en otro post!

AVISO PARA OS WINDOWS

Parece que los usuarios de Windows tienen algún problema con el código de llamada a la API. Con la librería httr el problema parece corregirse, al adaptar la llamada al encabezado que ESIOS requiere:

extraccion <- httr::GET(uri, httr::add_headers(`Accept` = "application/json; application/vnd.esios-api-v1+json",
                                                         `Content-Type` = "application/json",
                                                         `HOST` = host,
                                                         `Authorization`= 'Token token="cd1ef004d4b59456a62610af711340aebc1555e30c4bf656640326358c92341b"',
                                                         `Cookie` = ""))
  extraccion <- content(extraccion, as = "text", encoding = "UTF-8")
  extraccion <- fromJSON(txt=extraccion)

 Share!

 
comments powered by Disqus