Tutorial

API ENTSO-E con Python: Análisis de energía en Europa

Automatiza el análisis del mercado energético europeo usando la API ENTSO-E con Python. Accede a flujos transfronterizos, precios de electricidad y datos de generación de todos los países europeos.

Al comparar España ES con Italia IT_SACO_AC, observamos que el aumento en el precio horario de la electricidad en España tarda más en llegar.

Análisis horario de precios de 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 de Precios de Electricidad en Europa

Una de las razones es que la generación solar reduce el precio de la electricidad.

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

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

Preguntas

  1. ¿Cómo acceder a la API 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 electricidad?
  4. ¿Cómo usar códigos de área para descargar datos por país?
  5. ¿Cómo se agrupan los datos para realizar comparaciones horarias?
  6. ¿Cómo descargar múltiples áreas de mercado a la vez?

Metodología

Obtener token de acceso

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

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

API_TOKEN = 'YOUR_TOKEN'

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

Hay dos formas 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 devuelve los datos en formato crudo, en XML.

Para ir al grano, trabajaremos con EntsoePandasClient.

from entsoe import EntsoePandasClient

client = EntsoePandasClient(api_key=API_TOKEN)

Descargando generación por tecnología en Italia

Para comenzar, vamos a descargar los datos sobre generación por tecnología en Italia durante 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 2024, mostrando la distribución de fuentes como solar, eólica y convencional.
F2. Generación de Energía por Tecnología en Italia

Comparación horaria de generación por tecnología

Como de costumbre, vamos a crear una matriz de calor para resaltar las diferencias en 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 no hay muchas horas de luz solar en febrero, la generación solar solo fue significativa durante unas pocas horas, de 9 a 15.

Matriz de calor que representa la generación por tecnología en Italia a lo largo del día, mostrando las horas de mayor producción solar.
F3. Matriz de Calor de Generación de Energía en Italia

Descargando precios de electricidad por área en Europa

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

Para esto, necesitamos los códigos de país que la librería entsoe usa para identificar á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 los acumulamos en una lista.

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 precios de electricidad por área de mercado en Europa durante febrero 2024, con datos descargados usando la API ENTSO-E.
F4. Precios de Electricidad por Área en Europa

Comparación horaria de precios de electricidad

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

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

Nota cómo el precio de la electricidad mueve su rango más caro a medida que el sol se pone y la demanda aumenta, dependiendo del país.

Análisis horario de precios de 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 de Precios de Electricidad en Europa

Al comparar España ES con Italia IT_SACO_AC, observamos que el aumento de precio en España tarda más en llegar porque, teniendo la misma zona horaria, España está más al oeste.

Conclusiones

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