• Saltar a la navegación principal
  • Saltar al contenido principal
Logo Codificando Bits

Codificando Bits

  • Academia
    • Rutas
    • Cursos
    • Proyectos
    • Tutoriales
  • Acceder
  • Suscribirse

Pronóstico de demanda energética con SARIMA

En este proyecto veremos cómo entrenar, validar y poner a prueba un modelo de pronósticos de Series de Tiempo usando un modelo SARIMA.

Si estás suscrito a la Academia Online puedes acceder al enlace de descarga del set de datos y al código fuente de este proyecto.

Contenido

¿Qué es SARIMA?

Características de SARIMA

El problema de negocio

Objetivo del proyecto

El set de datos

Limpieza y análisis exploratorio preliminares

Análisis exploratorio detallado

Selección del modelo

Modelo base

Desarrollo del modelo SARIMA

Pronósticos sobre el set de prueba

Posibles mejoras

El código fuente y el set de datos de este proyecto

¿Qué es SARIMA?

SARIMA (del Inglés Seasonal AutoRegressive Integrated Moving Average) es un modelo de pronósticos de Series de Tiempo capaz de capturar tanto variaciones en la tendencia como patrones estacionales en la serie.

En español el término usado para este tipo de modelos sería Modelo Auto-regresivo Integrado de Media Móvil Estacional.

Características de SARIMA

En un modelo SARIMA tendremos los siguientes parámetros que permiten modelar los componentes de tendencia y estacionalidad:

  • Componente no estacional
    • p: el número de términos auto-regresivos (AR)
    • d: el número de diferenciaciones para hacer estacionaria la serie
    • q: el número de términos de media móvil
  • Componente estacional:
    • P: el número de términos auto-regresivos estacionales
    • D: el número de diferenciaciones estacionales
    • Q: el número de términos de media móvil estacionales
    • s: el periodo o estacionalidad de la serie

A lo largo del proyecto veremos cómo estimar estos parámetros al momento de construir un modelo de pronósticos de Series de Tiempo.

El problema de negocio

Usaremos datos reales de demanda de energía eléctrica en el estado de California en Estados Unidos.

En este caso particular, lo que se busca es que la empresa encargada de supervisar el proceso de generación y distribución de energía tenga una operación eficiente, es decir que la oferta energética esté alineada con la demanda esperada.

Esto quiere decir que una sobre-estimación de la demanda (generar más energía de la requerida) conllevará costos asociados al desperdicio de recursos o almacenamiento de energía que no será aprovechada; mientras que una sub-estimación de dicha demanda (generar menos energía de la requerida) podría producir fallos en el suministro, afectando tanto a clientes residenciales como industriales.

Objetivo del proyecto

Teniendo en cuenta lo anterior, nos plantearemos como objetivo para este proyecto:

Desarrollar un modelo predictivo de corto plazo (máximo 24 horas a futuro) que, utilizando datos históricos de consumo horario, permita anticipar la demanda energética.

El set de datos

Para abordar este proyecto usaremos datos reales de demanda de energía eléctrica en el estado de California.

Estos datos se pueden descargar a través de la API de la U.S. Energy Information Administration (EIA). La EIA es un organismo que depende del Departamento de Energía de los Estados Unidos y cuya función es precisamente recopilar datos asociados a la generación y demanda de energía (proveniente de diferentes fuentes).

Para el caso particular de este proyecto los datos ya han sido recolectados y contienen un registro histórico, con frecuencia horaria, de los niveles de demanda energética en el estado de California para el periodo comprendido entre el primero de enero de 2019 y el 20 de julio de 2025.

Así que comencemos realizando la lectura del set de datos, haciendo uso de la librería Pandas:

Contenido exclusivo para suscriptores

Si eres suscriptor accede en este enlace ó suscríbete a la Academia Online y accede a todo el contenido (lecciones en video, código fuente, sets de datos y descargas) de todos los cursos, proyectos y tutoriales.

Pronósticos sobre el set de prueba

Muy bien, habiendo entrenado y evaluado el modelo SARIMA ya estamos listos para generar pronósticos.

Esta es la fase más sencilla de todas y consiste en:

  • Tomar una ventana de 7 días (168 horas) consecutivos del set de datos
  • Y presentarle dicha ventana al modelo entrenado para obtener los pronósticos

Comencemos re-entrenando el modelo exactamente con dicha ventana (que contendrá las últimas 168 horas de nuestro registro histórico):

train_ventana = train[-VENTANA:] # Se entrena sólo con las últimas 24*7 = 168 horas (7 días)
modelo = SARIMAX(train_ventana, 
                 order=(p,d,q), 
                 seasonal_order=(P,D,Q,s),
                 enforce_stationarity=False, # Porque puede ser que esta porción de la serie no sea del todo estacionaria
                 ).fit(disp=False)

Donde en la línea 5 hemos usado el argumento «enforce_stationarity = False» pues el modelo SARIMA asume una serie estacionaria pero puede ser que la ventana de entrenamiento de 168 horas no contenga una serie estrictamente estacionaria.

Y a continuación generamos el pronóstico para las H = 24 horas siguientes:

prons = modelo.get_forecast(steps=H)
prons_df = prons.summary_frame(alpha=0.05) # Intervalo de predicción del 95%
prons_df

donde:

  • En la línea 1 hemos usado «get_forecast» para obtener los pronósticos pero para posteriormente poder calcular los intervalos de predicción.
  • En la línea 2 calculamos los intervalos de predicción de 1 – alpha = 1-0.05 = 0.95 (es decir del 95%)

Con lo anterior obtenemos un DataFrame que contendrá los pronósticos para cada hora (en un horizonte de 24 horas) así como los intervalos de predicción correspondientes:

Los pronósticos de demanda energética para las próximas 24 horas obtenidos con el modelo SARIMA
Los pronósticos de demanda energética para las próximas 24 horas obtenidos con el modelo SARIMA

En particular:

  • «mean» contendrá los pronósticos puntuales
  • «mean_se» contendrá el error estándar de los pronósticos
  • Y las columnas «mean_ci_lower» y «mean_ci_upper» contienen el intervalo de predicción del 95%

Así que lo único que nos resta es generar el gráfico de estos pronósticos para facilitar su interpretación. Además, superpondremos el set de prueba que creamos en la primera parte de este proyecto, el cual contiene precisamente las observaciones reales para este último periodo de 24 horas:

# Graficar serie de prueba, pronósticos e intervalo de predicción
fig, ax = plt.subplots(figsize=(12,5))
sns.lineplot(test, linestyle='--', label='Set de prueba')
sns.lineplot(prons_df, x=prons_df.index, y="mean", color='red', label=f'Pronostico {H} horas con SARIMA')
plt.fill_between(x=prons_df.index, 
                 y1=prons_df["mean_ci_lower"], 
                 y2=prons_df["mean_ci_upper"], 
                 color = 'red',
                 alpha = 0.2,
                 label="Intervalo de predicción del 95%")
ax.set_xlabel('Fecha')
ax.set_ylabel('Demanda (MW)')
ax.grid(True)
ax.legend(loc="lower left");

Con lo cual obtenemos este resultado:

Comportamiento del pronóstico (línea continua roja) obtenido con el modelo SARIMA junto con las observaciones reales (línea punteada azul). En rojo claro el intervalo de predicción del 95%
Comportamiento del pronóstico (línea continua roja) obtenido con el modelo SARIMA junto con las observaciones reales (línea punteada azul). En rojo claro el intervalo de predicción del 95%

¡Y con esto ya tenemos un modelo que es capaz de pronosticar con un alto grado de precisión el comportamiento a futuro de la demanda de energía eléctrica en el estado de California!

Posibles mejoras

Aunque el modelo que acabamos de desarrollar tiene un muy buen desempeño, aún es susceptible de algunas mejoras. En particular sugiero:

  • Ajustar los parámetros p, q, d, P, Q y D usando por ejemplo herramientas como «pmdarima»
  • Incluir variables exógenas como por ejemplo días festivos lo cual podría reducir el sesgo
  • Puede haber estacionalidades de 2 y 6 hrs presentes. SARIMA está diseñado para modelar sólo un componente estacional (el de 24 horas que usamos en este proyecto), así que se podrían usar alternativas como TBATS.

El código fuente y el set de datos de este proyecto

Contenido exclusivo para suscriptores

Si eres suscriptor accede en este enlace ó suscríbete a la Academia Online y accede a todo el contenido (lecciones en video, código fuente, sets de datos y descargas) de todos los cursos, proyectos y tutoriales.

Y recuerda que si eres suscriptor y tienes alguna duda sobre este proyecto me puedes contactar directamente a través del formulario que encontrarás en la Intranet.

Volver al índice de Proyectos

© Codificando Bits, LLC | Blog | Contacto | Servicios | Acerca de | Políticas

¿Has olvidado la contraseña?
¿Has perdido tu contraseña? Por favor, introduce tu nombre de usuario o dirección de correo electrónico. Recibirás por correo electrónico un enlace para crear una nueva contraseña.
body::-webkit-scrollbar { width: 7px; } body::-webkit-scrollbar-track { border-radius: 10px; background: #f0f0f0; } body::-webkit-scrollbar-thumb { border-radius: 50px; background: #dfdbdb }