Diez frases ingeniosas de Python para generar funciones de series temporales
Introducción
Los datos de series de tiempo normalmente requieren una comprensión profunda para poder construir modelos de pronóstico eficaces y reveladores. Dos propiedades clave son fundamentales en el pronóstico de series temporales: representación y granularidad.
La representación implica el uso de enfoques significativos para transformar datos temporales sin procesar (por ejemplo, mediciones diarias o horarias) en patrones informativos. La granularidad consiste en analizar con qué precisión dichos patrones capturan variaciones a lo largo del tiempo.
Como dos caras de la misma moneda, su diferencia es sutil, pero una cosa es segura: ambas se logran mediante ingeniería de funciones.
Este artículo presenta 10 frases ingeniosas simples de Python para generar características de series de tiempo basadas en diferentes características y propiedades subyacentes a los datos de series de tiempo sin procesar. Estas frases ingeniosas se pueden utilizar de forma aislada o en combinación para ayudarle a crear conjuntos de datos más informativos que revelen mucho sobre el comportamiento temporal de sus datos: cómo evolucionan, cómo fluctúan y qué tendencias exhiben a lo largo del tiempo.
Tenga en cuenta que nuestros ejemplos utilizan Pandas y NumPy.
1. Característica de retraso (representación autorregresiva)
La idea detrás del uso de funciones de representación autorregresiva o de retardo es más simple de lo que parece: consiste en agregar la observación anterior como una nueva característica predictiva en la observación actual. En esencia, este es posiblemente el método más simple para representar la dependencia temporal, por ejemplo, entre el instante de tiempo actual y los anteriores.
Como primer código de ejemplo de una sola línea en esta lista de 10, veamos este más de cerca.
Este ejemplo de una sola línea supone que ha almacenado un conjunto de datos de series temporales sin procesar en un DataFrame llamado df, uno de cuyos atributos existentes se denomina “valor”. Tenga en cuenta que el argumento en la función shift() se puede ajustar para recuperar el valor registrado n instantes u observaciones anteriores al actual:
df[‘lag_1’] = gl[‘value’].cambio(1)
df[‘lag_1’] = df[‘value’].cambio(1)
Para datos de series de tiempo diarias, si desea capturar valores anteriores para un día determinado de la semana, por ejemplo, el lunes, tendría sentido utilizar shift(7).
2. Media móvil (suavizado a corto plazo)
Para capturar tendencias locales o fluctuaciones más suaves a corto plazo en los datos, generalmente es útil utilizar medias móviles a lo largo de las n observaciones pasadas que conducen a la actual: esta es una forma simple pero muy útil de suavizar valores de series de tiempo sin procesar, a veces caóticos, sobre una característica determinada.
Este ejemplo crea una nueva característica que contiene, para cada observación, la media móvil de los tres valores anteriores de esta característica en observaciones recientes:
df[‘rolling_mean_3’] = gl[‘value’].rolling(3).mean()
df[‘rolling_mean_3’] = df[‘value’].laminación(3).significar()
Función de serie temporal suavizada con media móvil
3. Desviación estándar móvil (volatilidad local)
De manera similar a las medias móviles, también existe la posibilidad de crear nuevas características basadas en la desviación estándar móvil, lo cual es eficaz para modelar cuán volátiles son las observaciones consecutivas.
Este ejemplo presenta una característica para modelar la variabilidad de los últimos valores durante una ventana móvil de una semana, suponiendo observaciones diarias.
df[‘rolling_std_7’] = gl[‘value’].rolling(7).std()
df[‘rolling_std_7’] = df[‘value’].laminación(7).enfermedad de transmisión sexual()
4. Media en expansión (memoria acumulativa)
La media en expansión calcula la media de todos los puntos de datos hasta (e incluyendo) la observación actual en la secuencia temporal. Por lo tanto, es como una media móvil con un tamaño de ventana en constante aumento. Es útil analizar cómo evoluciona a lo largo del tiempo la media de los valores de un atributo de una serie temporal, capturando así tendencias ascendentes o descendentes de manera más confiable en el largo plazo.
df[‘expanding_mean’] = gl[‘value’].expansión().media()
df[‘expanding_mean’] = df[‘value’].en expansión().significar()
5. Diferenciación (eliminación de tendencias)
Esta técnica se utiliza para eliminar tendencias a largo plazo, destacando las tasas de cambio, algo importante en series temporales no estacionarias para estabilizarlas. Calcula la diferencia entre observaciones consecutivas (actuales y anteriores) de un atributo objetivo:
df[‘diff_1’] = gl[‘value’].diff()
df[‘diff_1’] = df[‘value’].diferencia()
6. Funciones basadas en el tiempo (extracción de componentes temporales)
Sencillo pero muy útil en aplicaciones del mundo real, este resumen se puede utilizar para descomponer y extraer información relevante de la función de fecha y hora completa o indexar su serie temporal en torno a:
df[‘month’]df[‘dayofweek’] = gl[‘Date’].dt.mes, df[‘Date’].dt.díade la semana
df[‘month’], df[‘dayofweek’] = df[‘Date’].dt.mes, df[‘Date’].dt.día de la semana
Importante: tenga cuidado y compruebe si en su serie temporal la información de fecha y hora está contenida en un atributo normal o como índice de la estructura de datos. Si fuera el índice, es posible que necesites usar esto en su lugar:
df[‘hour’]df[‘dayofweek’] = df.index.hora, df.index.díade la semana
df[‘hour’], df[‘dayofweek’] = df.índice.hora, df.índice.día de la semana
7. Correlación rodante (relación temporal)
Este enfoque va un paso más allá de hacer rodar las estadísticas a lo largo de una ventana de tiempo para medir cómo los valores recientes se correlacionan con sus contrapartes rezagadas, ayudando así a descubrir la evolución de la autocorrelación. Esto es útil, por ejemplo, para detectar cambios de régimen, es decir, cambios de comportamiento abruptos y persistentes en los datos a lo largo del tiempo, que tienen lugar cuando las correlaciones móviles comienzan a debilitarse o revertirse en algún momento.
df[‘rolling_corr’] = gl[‘value’].rolling(30).corr(df[‘value’].cambio(1))
df[‘rolling_corr’] = df[‘value’].laminación(30).corri(df[‘value’].cambio(1))
8. Características de Fourier (estacionalidad)
Las transformaciones sinusoidales de Fourier se pueden utilizar en atributos de series temporales sin procesar para capturar patrones cíclicos o estacionales. Por ejemplo, la aplicación de la función seno (o coseno) transforma la información cíclica del día del año subyacente a las características de fecha y hora en características continuas útiles para aprender y modelar patrones anuales.
df[‘fourier_sin’] = np.sin(2 * np.pi * df[‘Date’].dt.díadelaño / 365) df[‘fourier_cos’] = np.cos(2 * np.pi * df[‘Date’].dt.díadelaño/365)
df[‘fourier_sin’] = notario público.pecado(2 * notario público.pi* df[‘Date’].dt.día del año / 365)
df[‘fourier_cos’] = notario público.porque(2 * notario público.pi* df[‘Date’].dt.día del año / 365)
Permítanme usar una línea de dos líneas, en lugar de una sola línea en este ejemplo, por una razón: tanto el seno como el coseno juntos son mejores para capturar el panorama general de posibles patrones de estacionalidad cíclica.
9. Media ponderada exponencialmente (suavizado adaptativo)
La media ponderada exponencialmente (o EWM, para abreviar) se aplica para obtener ponderaciones que decaen exponencialmente y dan mayor importancia a las observaciones de datos recientes sin dejar de conservar la memoria a largo plazo. Es un enfoque más adaptativo y algo “más inteligente” que prioriza las observaciones recientes sobre el pasado lejano.
df[‘ewm_mean’] = gl[‘value’].ewm(span=5).mean()
df[‘ewm_mean’] = df[‘value’].ewm(durar=5).significar()
10. Entropía rodante (complejidad de la información)
¡Un poco más de matemáticas para el último! La entropía móvil de una característica determinada durante una ventana de tiempo calcula qué tan aleatorios o dispersos son los valores durante esa ventana de tiempo, revelando así la cantidad y complejidad de la información que contiene. Los valores más bajos de la entropía móvil resultante indican una sensación de orden y previsibilidad, mientras que cuanto más altos son estos valores, mayor es el “caos y la incertidumbre”.
df[‘rolling_entropy’] = gl[‘value’].rolling(10).apply(lambda x: -np.sum((p:=np.histogram(x, bins=5)[0]/len(x))*np.log(p+1e-9)))
df[‘rolling_entropy’] = df[‘value’].laminación(10).aplicar(lambda incógnita: –notario público.suma((pag:=notario público.histograma(incógnita, contenedores=5)[0]/len(incógnita))*notario público.registro(pag+1e–9)))
Concluyendo
En este artículo, hemos examinado e ilustrado 10 estrategias, que abarcan una sola línea de código cada una, para extraer una variedad de patrones e información de datos de series temporales sin procesar, desde tendencias más simples hasta otras más sofisticadas, como la estacionalidad y la complejidad de la información.