ENTSO-E API en Python: Análisis energético en Europa

Programa tus análisis energéticos europeos automáticamente con Python y la API de ENTSO-E. Te lo explicamos paso a paso con ejemplos prácticos.

Si comparamos España ES con Italia IT_SACO_AC, observamos que el incremento del precio horario de la electricidad en España tarda más en llegar.

Análisis horario del precio de la electricidad en Europa, mostrando cómo la posición geográfica y la generación solar afectan los precios energéticos.
F1. Comparación horaria del precio de electricidad en Europa

Uno de los motivos es que la generación solar abarata el precio de la electricidad.

Aunque ambos países tienen la misma zona horaria, Italia está más al este que España, por lo que el sol se pone antes en Italia que en España.

En este tutorial, te explicaremos cómo descargar datos energéticos europeos a través de la API de ENTSO-E y analizarlos con Python.

Preguntas

  1. ¿Cómo acceder a la API de ENTSO-E para descargar datos energéticos europeos?
  2. ¿Qué función se usa para descargar datos de generación?
  3. ¿Y los precios de la electricidad?
  4. ¿Cómo usar los códigos de área para descargar datos por país?
  5. ¿Cómo se agrupan los datos para realizar comparaciones horarias?
  6. ¿Cómo descagar múltiples áreas de mercado a la vez?

Metodología

Conseguir Token de Acceso

Para descargar los datos de ENTSO-E programáticamente, necesitas un token de acceso.

Siguiendo los pasos de la documentación oficial, te registras en la página de ENTSO-E, y posteriormente tendrás que enviarles un correo electrónico a transparency@entsoe.eu con el asunto “Restful API access”.

API_TOKEN = 'TU_TOKEN'

Para trabajar con la API de ENTSO-E en Python, lo tenemos muy fácil gracias a la librería de código abierto entsoe, que tiene integrada los endpoints más comunes de la API.

Tenemos dos maneras de trabajar con esta librería:

  1. EntsoePandasClient descarga y preprocesa los datos en formato DataFrame para analizarlos con pandas más cómodamente.
  2. EntsoeRawClient nos devuelve los datos en bruto, con formato XML.

Para ir directos al grano, vamos a trabajar con EntsoePandasClient.

from entsoe import EntsoePandasClient

client = EntsoePandasClient(api_key=API_TOKEN)

Descargar Generación por Tecnología en Italia

Para meternos en faena, vamos a descargar los datos de generación por tecnología en Italia durante el mes de febrero de 2024.

import pandas as pd

start = pd.Timestamp('20240201', tz='Europe/Rome')
end = pd.Timestamp('20240229T2359', tz='Europe/Rome')

df = client.query_generation(
    country_code='IT',
    start=start, end=end
)
Datos de generación energética por tecnología en Italia durante febrero de 2024, mostrando la distribución de fuentes como solar, eólica, y convencional.
F2. Generación energética por tecnología en Italia

Comparación Horaria de Generación por Tecnología

Como acostumbramos, vamos a crear una matriz de calor para destacar las diferencias en la generación por tecnología en Italia según la hora del día.

df['hour'] = df.index.hour
df.groupby(['hour']).sum()

Dado que en febrero no hay muchas horas de sol, la generación solar solo fue significativa durante pocas horas, desde las 9 hasta las 15.

Matriz de calor representando la generación por tecnología en Italia a lo largo del día, evidenciando las horas de mayor producción solar.
F3. Matriz de calor de generación energética en Italia

¿Qué conclusiones adicionales puedes identificar a partir de este análisis? Te leo en los comentarios.

Descargar Precios Electricidad por Área en Europa

Vamos a subir el nivel: descargaremos los precios de la electricidad por área en Europa.

Para ello, necesitamos los códigos de los países que la librería entsoe utiliza para identificar las áreas de mercado.

areas = [
    'AT', 'BE', 'BG', 'HR', 'CZ', 'DE_LU', 'DK_1',
    'EE', 'FI', 'MK', 'FR', 'GR', 'HU', 'IE_SEM',
    'IT_SACO_AC', 'LV', 'LT', 'LU_BZN', 'ME', 'NL', 'NO_1',
    'PL', 'PT', 'RO', 'SE_1', 'RS', 'SK', 'SI',
    'ES', 'CH', 'UA_IPS'
]

Iteramos sobre cada área para descargar los precios de febrero 2024 y acumularlos en una lista.

¿Conoces a alguien que podría interesarle este artículo? Compártelo con ellos.

ls = []
for area in areas:
    s = client.query_day_ahead_prices(
        country_code=area,
        start=start, end=end
    )
    s.name = area
    ls.append(s)

Finalmente, concatenamos la lista en un DataFrame donde cada columna representa un área de mercado.

df = pd.concat(ls, axis=1)
Visualización de los precios de la electricidad por área de mercado en Europa durante febrero de 2024, con datos descargados usando la API de ENTSO-E.
F4. Precios de electricidad por área en Europa

Comparación Horaria de Precios Electricidad

Para el precio, calculamos el promedio por hora, que es más representativo que la suma (la cual habíamos utilizado para la generación).

df['hour'] = df.index.hour
df.groupby(['hour']).mean()

Fijaros cómo el precio de la electricidad mueve su franja más cara conforme el sol se acuesta y la demanda aumenta, dependiendo del país.

Análisis horario del precio de la electricidad en Europa, mostrando cómo la posición geográfica y la generación solar afectan los precios energéticos.
F1. Comparación horaria del precio de electricidad en Europa

Si comparamos España ES con Italia IT_SACO_AC, observamos que el incremento del precio en España tarda más en llegar porque teniendo la misma zona horaria, España está más al oeste.

¿Qué conclusiones adicionales puedes identificar a partir de este análisis? Te leo en los comentarios.

Conclusiones

  1. Acceso a la API de ENTSO-E: EntsoePandasClient es el cliente que, con el token de acceso, nos permite descargar datos y analizarlos con pandas cómodamente.
  2. Descarga de datos de generación: client.query_generation para descargar los datos de generación de energía por tecnología de un país específico.
  3. Descarga de precios de la electricidad: client.query_day_ahead_prices para obtener los precios de la electricidad dada un área de mercado específica.
  4. Uso de códigos de área para datos por país: country_code para especificar el área de mercado de la que queremos descargar los datos.
  5. Agrupación de datos para comparaciones horarias: df.index.hour para obtener la hora y df.groupby para agregar los valores por cada hora aplicando una función matemática.
  6. Descarga de múltiples áreas de mercado: pd.concat para concatenar los múltiples indicadores descargados tras iterar sobre una lista de códigos de área.

Si pudieras programar lo que quisieras, ¿qué sería?

Puede que te eche una mano creando tutoriales que te ayuden. Te leo en los comentarios.

Great! You’ve successfully signed up.

Welcome back! You've successfully signed in.

You've successfully subscribed to datons.

Success! Check your email for magic link to sign-in.

Success! Your billing info has been updated.

Your billing was not updated.