Cómo encontrar modelos de estacionalidad en series cronológicas

AEP Consumo de energía por hora | Imagen del autor

En mi vida profesional como científico de datos, he conocido series cronológicas varias veces. La mayor parte de mi conocimiento proviene de mi experiencia académica, en particular de mis lecciones econométricas (tengo un diploma en economía), donde hemos estudiado propiedades estadísticas y modelos de series cronológicas.

Entre los modelos que estudié Samaque reconoce el estacionalidad Sin embargo, de una serie cronológica, nunca hemos estudiado cómo interceptar y reconocer los modelos de estacionalidad.

La mayoría de las veces, tuve que encontrar modelos de temporada en los que simplemente conté visual inspección datos. Fue hasta que me topé Este video de YouTube seguro Transformaciones de Fourier y finalmente descubrió que un periodograma Este.

En este artículo de blog, explicaré y aplicaré conceptos simples que se transformarán en herramientas útiles que cada DS que estudia la serie cronológica debería saber.

Tabla de contenido

  1. ¿Qué es una transformación de Fourier?
  2. Fourier se transforma en Python
  3. Periodograma

Avance

Supongamos que tengo el siguiente conjunto de datos (Consumo de energía AEPLicencia CC0):

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("data/AEP_hourly.csv", index_col=0) 
df.index = pd.to_datetime(df.index)
df.sort_index(inplace=True)

fig, ax = plt.subplots(figsize=(20,4))
df.plot(ax=ax)
plt.tight_layout()
plt.show()
AEP Consumo de energía por hora | Imagen del autor
AEP Consumo de energía por hora | Imagen del autor

Es muy claro, solo de una inspección visual, que Los modelos estacionales juegan un papelSin embargo, podría ser trivial interceptarlos a todos.

Como se explicó anteriormente, el proceso de descubrimiento que había usado fue principalmente manualY podría haber parecido algo de la siguiente manera:

fig, ax = plt.subplots(3, 1, figsize=(20,9))

df_3y = df[(df.index >= '2006–01–01') &amp; (df.index < '2010–01–01')]
df_3M = df[(df.index >= '2006–01–01') &amp; (df.index < '2006–04–01')]
df_7d = df[(df.index >= '2006–01–01') &amp; (df.index < '2006–01–08')]

ax[0].set_title('AEP energy consumption 3Y')
df_3y[['AEP_MW']].groupby(pd.Grouper(freq = 'D')).sum().plot(ax=ax[0])
for date in df_3y[[True if x % (24 * 365.25 / 2) == 0 else False for x in range(len(df_3y))]].index.tolist():
 ax[0].axvline(date, color = 'r', alpha = 0.5)

ax[1].set_title('AEP energy consumption 3M')
df_3M[['AEP_MW']].plot(ax=ax[1])
for date in df_3M[[True if x % (24 * 7) == 0 else False for x in range(len(df_3M))]].index.tolist():
 ax[1].axvline(date, color = 'r', alpha = 0.5)

ax[2].set_title('AEP energy consumption 7D')
df_7d[['AEP_MW']].plot(ax=ax[2])
for date in df_7d[[True if x % 24 == 0 else False for x in range(len(df_7d))]].index.tolist():
 ax[2].axvline(date, color = 'r', alpha = 0.5)

plt.tight_layout()
plt.show()
AEP Consumo de energía por hora, tiempo más pequeño | Imagen del autor
AEP Consumo de energía por hora, tiempo más pequeño | Imagen del autor

Es una visualización más profunda de esta serie de tiempo. Como podemos ver, los siguientes modelos influyen en los datos: ** – un ciclo de 6 meses,

  • un ciclo semanal,
  • y un ciclo diario. **

Este conjunto de datos muestra el consumo de energía, por lo que estos modelos estacionales se deducen fácilmente del conocimiento del campo. Sin embargo, basado solo en una inspección manual, podríamos Falta de información importante. Podría ser parte de la principal desventajas::

  • Subjetividad: Podríamos perder modelos menos obvios.
  • Tomar el tiempo : Debemos probar diferentes plazos uno por uno.
  • Problemas de evolución: Funciona bien para algunos conjuntos de datos, pero ineficaz para un análisis a gran escala.

Como científico de datos, sería útil tener una herramienta que nos brinde Comentarios inmediatos Sobre las frecuencias más importantes que conforman la serie cronológica. Aquí es donde el Transformaciones de Fourier Ven a ayudar.

1. ¿Qué es una transformación de Fourier?

La transformación de Fourier es una herramienta matemática que nos permite «cambiar el dominio».

Por lo general, vemos nuestros datos en el dominio de tiempo. Sin embargo, usando una transformación de Fourier, podemos ir al Campo de frecuenciaque muestra las frecuencias que están presentes en la señal y su contribución relacionadas con la serie temporal original.

Intuición

Cualquier función bien -alta f (x) puede escribirse como una suma de sinusoides con diferentes frecuencias, amplitudes y fases. En términos simples, Cada señal (serie temporal) es solo combinación de Formas de onda simples.

Imagen del autor
Imagen del autor

O:

  • F (f) representa la función en el Campo de frecuencia.
  • f (x) es la función original en el dominio de tiempo.
  • Exp (−i2πf (x)) es un complejo exponencial que actúa como un «filtro de frecuencia».

Entonces, F (f) nos dice Cuánto frecuencia F Este aquí en la función original.

Ejemplo

Veamos una señal compuesta por tres ondas sinusoidales con frecuencias de 2 Hz, 3 Hz y 5 Hz:

Una señal simple en el campo temporal | Imagen del autor
Una señal simple en el campo temporal | Imagen del autor

Ahora, aplicemos una transformación de Fourier para extraer estas frecuencias de señal:

Una señal simple en el campo de frecuencia | Imagen del autor
Una señal simple en el campo de frecuencia | Imagen del autor

El gráfico anterior representa nuestra señal expresada en el campo de frecuencia en lugar del dominio de tiempo clásico. Según el diseño resultante, podemos ver que nuestra señal se descompone en 3 elementos de frecuencia de 2 Hz, 3 Hz y 5 Hz como se esperaba de la señal de inicio.

Como se indicó anteriormente, cualquier función bien alta se puede escribir como una suma de sinusoides. Con la información que tenemos hasta ahora, es posible descomponer nuestra señal en tres sinusoides:

Una simple descomposición de señal en su longitud de onda básica | Imagen del autor
Una simple descomposición de señal en su longitud de onda básica | Imagen del autor

La señal original (en azul) se puede obtener agregando las tres ondas (en rojo). Este proceso se puede aplicar fácilmente en cualquier serie temporal para evaluar las frecuencias principales que componen la serie cronológica.

2 Fourier Transformar en Python

Dado que es bastante fácil cambiar entre el dominio temporal y el área de frecuencia, eche un vistazo a la serie cronológica de consumo de energía AEP que comenzamos a estudiar al comienzo del artículo.

Python proporciona la biblioteca «numpy.fft» para calcular la transformación de Fourier para señales discretas. FFT significa transformación rápida de Fourier, que es un algoritmo utilizado para descomponer una señal discreta en sus componentes de frecuencia:

from numpy import fft

X = fft.fft(df['AEP_MW'])
N = len(X)
frequencies = fft.fftfreq(N, 1)
periods = 1 / frequencies
fft_magnitude = np.abs(X) / N

mask = frequencies >= 0

# Plot the Fourier Transform
fig, ax = plt.subplots(figsize=(20, 3))
ax.step(periods[mask], fft_magnitude[mask]) # Only plot positive frequencies
ax.set_xscale('log')
ax.xaxis.set_major_formatter('{x:,.0f}')
ax.set_title('AEP energy consumption - Frequency-Domain')
ax.set_xlabel('Frequency (Hz)')
ax.set_ylabel('Magnitude')
plt.show()
AEP Consumo de energía por hora en el campo de frecuencia | Imagen del autor
AEP Consumo de energía por hora en el campo de frecuencia | Imagen del autor

Esta es la visualización del campo de frecuencia del consumo de energía AEP_MW. Cuando analizamos el gráfico, ya podemos ver que a ciertas frecuencias, tenemos una mayor amplitud, lo que implica una mayor importancia de estas frecuencias.

Sin embargo, antes de hacerlo, agregamos otra teoría que nos permitirá construir un periodogramaEsto nos dará una mejor visión de las frecuencias más importantes.

3. Periogrograma

El periodograma es una representación de dominio de frecuencia de Densidad espectral de potencia (Psd) de una señal. Mientras que la transformación de Fourier nos dice qué frecuencias están presentes en una señal, el periodograma cuantifica la potencia (o intensidad) de estas frecuencias. Este pasaje es útil como esto Reduce el ruido de frecuencias menos importantes.

Matemáticamente, el periodograma está dado por:

Imagen del autor
Imagen del autor

O:

  • P (f) es la densidad de potencia espectral (PSD) a la frecuencia F,
  • X (f) es la transformación de Fourier de la señal,
  • N es el número total de muestras.

Esto se puede hacer en Python de la siguiente manera:

power_spectrum = np.abs(X)**2 / N # Power at each frequency

fig, ax = plt.subplots(figsize=(20, 3))
ax.step(periods[mask], power_spectrum[mask])
ax.set_title('AEP energy consumption Periodogram')
ax.set_xscale('log')
ax.xaxis.set_major_formatter('{x:,.0f}')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power')
plt.show()
AEP Office Energy Consumo Pardogram | Imagen del autor
AEP Office Energy Consumo Pardogram | Imagen del autor

De este pardograma, ahora es posible extraer conclusiones. Como podemos ver, las frecuencias más poderosas son:

  • 24 Hz, correspondiente a 24 horas,
  • 4.380 Hz, correspondiente a 6 meses,
  • y a 168 Hz, correspondiente al ciclo semanal.

Estos tres son los mismos componentes de estacionalidad que encontramos en el ejercicio manual realizado en la inspección visual. Sin embargo, utilizando esta visualización, podemos ver Otros tres ciclosmás débil en poder, pero presente:

  • Un ciclo de 12 Hz,
  • un ciclo de 84 Hz, correspondiente a la mitad de la mitad,
  • Un ciclo de 8.760 Hz, correspondiente a un año completo.

También es posible usar la función «parodograma» presente en SciPY para obtener el mismo resultado.

from scipy.signal import periodogram

frequencies, power_spectrum = periodogram(df['AEP_MW'], return_onesided=False)
periods = 1 / frequencies

fig, ax = plt.subplots(figsize=(20, 3))
ax.step(periods, power_spectrum)
ax.set_title('Periodogram')
ax.set_xscale('log')
ax.xaxis.set_major_formatter('{x:,.0f}')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power')
plt.show()

Conclusiones

Cuando enfrentamos la serie cronológica, uno de los componentes más importantes a considerar son las valiosas.

En este artículo de blog, hemos visto cómo Descubre fácilmente los valios de temporada En una serie temporal usando un periodograma. Proporcionamos una herramienta simple para implementar que sea extremadamente útil en el proceso exploratorio.

Sin embargo, este es solo un punto de partida para las posibles implementaciones de la transformación de Fourier de las cuales podríamos beneficiarnos, porque hay muchos:

  • Espectrograma
  • Codificación de características
  • Descomposición de series cronológicas

Por favor, deje algunos aplausos si ha apreciado el artículo y no dude en comentar, ¡se agradece cualquier sugerencia y comentario!

_Aquí puede encontrar un cuaderno con el código de esta publicación de blog._