PyTimeTK

En este tutorial, mostraremos cómo usar la biblioteca de Python PyTimeTK para analizar datos de series de tiempo.

PyTimeTK

PyTimeTK, una biblioteca optimizada

El análisis de series de tiempo es fundamental para muchos campos, desde la previsión empresarial hasta la investigación científica. Aunque el ecosistema Python ofrece herramientas como pandas, a veces pueden ser detalladas y no estar optimizadas para todas las operaciones, especialmente para visualizaciones y agregaciones complejas basadas en el tiempo.

PytimeTK ofrece una combinación de facilidad de uso y eficiencia computacional y simplifica enormemente el proceso de manipulación y visualización de series temporales. Al aprovechar el backend de Polars, puedes beneficiarte de mejoras de velocidad que van desde 3X hasta la friolera de 3500X, lo cual es una ventaja.

Requisitos previos: asegúrese de tener Python 3.9 o posterior instalado en su sistema.

Instale la última versión estable de pytimetk usando pip: la última versión es 0.2.0

instalación de pip en pytimetk

Alternativamente, puedes instalar la versión de desarrollo:

pip instalar git+https://github.com/business-science/pytimetk.git

Gestión de datos/Wrangling de datos

summum_by_time: resume un objeto DataFrame o Groupby por tiempo. Esta función es útil para realizar agregaciones en un conjunto de datos con un objeto groupby en una frecuencia temporal. Podemos utilizar varias funciones de agregación como (Suma, Mediana, Mínimo, Máximo, Desviación estándar, Varianza, Primer valor del grupo, Último valor del grupo, Número de valores, Número de valores únicos, Correlación entre valores.

Las funciones de agregación lambda personalizadas también se pueden usar en un marco de datos con frecuencias variables como (como “D” para diario o “MS” para inicio de mes, – S: segunda frecuencia – min: frecuencia de minutos – H: frecuencia horaria – D : frecuencia diaria – W: semanal – M: frecuencia de fin de mes – MS: frecuencia de inicio de mes – Q: frecuencia de fin de trimestre – QS: frecuencia de inicio de trimestre – Y: frecuencia de fin de año – YS: frecuencia de inicio de año)

df.groupby('Categoría 1').summarize_by_time(
columna_fecha = 'fecha de orden',
columna_valor = ['precio total', 'cantidad'],
frecuencia = 'EM',
agg_func = ['suma', 'significar', 'mediana','mínimo',
('q25', lambda x: np.cuantil(x, 0.25)),
('q75', lambda x: np.cuantil(x, 0.75)),
'máximo',('ordenado',lambda x:x.max() - X.min())],
formato_ancho = Falso,
motor = 'panda')

pad_by_time: convierte las series temporales irregulares en regulares rellenándolas con datos faltantes. Por ejemplo, si tiene datos históricos mensuales a los que les faltan algunos meses, use pad_by_time y complete los datos faltantes con valores cero.

df.groupby('Categoría 1').pad_by_time(
columna_fecha = 'fecha de orden',
frecuencia = 'W',
fecha_final = df.fecha_pedido.max())

Future_frame: esta función se utiliza para ampliar un marco de datos u objeto Groupby con fechas futuras basadas en una longitud especificada, vinculando opcionalmente los datos originales. Esto es principalmente útil para preparar un conjunto de datos futuro que pueda usarse para predicciones.

df.groupby('categoría_2').futuro_frame(
columna_fecha = 'fecha de orden',
longitud_fuera = 12 # Ampliar datos para los próximos 3 meses)

Visualización de datos

plot_timeseries(): crea gráficos de series temporales utilizando diferentes motores de trazado como Plotnine, Matplotlib y Plotly.

  • Genera tramas interactivas (ideal para exploración y aplicaciones optimizadas/brillantes)
  • Consolida más de 20 líneas de código plotnine/matpotlib y plotly.
  • Se adapta bien a muchas series temporales
  • Se puede convertir de plotly interactivo a plotnine/matplotlib estático cambiando el motor de plotly a plotnine o Matplotlib.
  • Se pueden agregar grupos usando pandas groupby()
df.groupby('identificación').plot_timeseries('fecha', 'valor',
faceta_ncol = 2, # Gráfico facetado de 2 columnas
escalas_facetas = "libre_y",
suave_frac = 0.2, # Aplicar suavizado a los datos de series temporales.
tamaño_liso = 2.0,
intersección y = Ninguna,
x_axis_date_labels = “%Y”,
motor = 'trama',
ancho = 600,
altura = 500)

PyTimeTK

Detección de anomalías

La detección de anomalías en el análisis de series temporales es un proceso crucial para identificar patrones inusuales que se desvían del comportamiento esperado. Estas anomalías pueden significar eventos críticos, a menudo imprevistos, en los datos de series temporales. La detección eficaz de anomalías ayuda a mantener la calidad y la confiabilidad de los datos, lo que garantiza una previsión y una toma de decisiones precisas.

El desafío es distinguir entre verdaderas anomalías y fluctuaciones naturales, lo que requiere técnicas analíticas sofisticadas y una comprensión profunda de los patrones subyacentes de las series temporales. Por lo tanto, la detección de anomalías es una parte esencial del análisis de series temporales, apoyando la gestión proactiva de riesgos y oportunidades en entornos dinámicos.

Pytimetk utiliza los siguientes métodos para determinar anomalías en los datos de series de tiempo:

1- Descomposición de series temporales:

  • El primer paso consiste en descomponer la serie temporal en varios componentes. Normalmente, esto incluye componentes de tendencia, estacionalidad y resto (o residual).
  • La tendencia representa el patrón subyacente o la dirección de los datos a lo largo del tiempo. La estacionalidad captura patrones o ciclos recurrentes durante un período de tiempo específico, por ejemplo, diario, semanal, mensual, etc.
  • El resto (o residual) es lo que queda después de que se hayan eliminado los componentes tendencial y estacional de la serie temporal original.

2- Generar sobras:

  • Después de la descomposición, se extrae el componente restante. Este componente refleja la parte de la serie temporal que no puede explicarse por los componentes tendencial y estacional.
  • La idea es que si bien la tendencia y la estacionalidad representan patrones predecibles y, por lo tanto, "normales", es en el resto donde es más probable que se manifiesten las anomalías.

Existen dos técnicas comunes de descomposición estacional; STL y Twitter;

  • STL (Descomposición estacional y de tendencias) es un método versátil y sólido para descomponer series temporales. STL funciona muy bien en circunstancias en las que existe una tendencia a largo plazo. El algoritmo de Loess generalmente hace un muy buen trabajo al detectar la tendencia. Sin embargo, en los casos en los que el componente estacional es más dominante que la tendencia, Twitter tiende a tener un mejor desempeño.
  • El método Twitter es un método de descomposición similar al utilizado en el paquete AnomalyDetection de Twitter. El método Twitter funciona de manera idéntica a STL para eliminar el componente estacional. La principal diferencia es la eliminación de tendencia, que se realiza eliminando la mediana de los datos en lugar de ajustar un suavizado. La mediana funciona bien cuando una tendencia a largo plazo es menos dominante que el componente estacional a corto plazo. De hecho, el suavizado tiende a sobreajustar las anomalías.

Anamolize: detecta anomalías en los datos de series temporales, ya sea para una única serie temporal o para varias series temporales agrupadas por una columna específica. Esta característica utiliza procesamiento paralelo para acelerar el cálculo de grandes conjuntos de datos con muchos grupos de series temporales. El procesamiento paralelo genera gastos generales y puede que no sea más rápido en conjuntos de datos pequeños. Para utilizar el procesamiento paralelo, establezca subprocesos = -1 para utilizar todos los procesadores disponibles.

# Anomalizar los datos 
anomalize_df = tk.anomalize(
df, "fecha", "valor",método = "gorjeo",
iqr_alfa = 0.10, # Para determinar el umbral para detectar valores atípicos.
limpio_alfa = 0.75, # Para determinar el umbral para limpiar los valores atípicos
limpio = "mínimo máximo", # especifica el método utilizado para limpiar las anomalías
detallado = Verdadero, # Para mostrar información adicional y progreso durante la ejecución)

Esta función devuelve un marco de datos con las columnas que se mencionan a continuación, donde recomposed_l1 y l2 son los límites de nivel superior e inferior de la serie temporal recompuesta.

PyTimeTK

Plot_Anomalies: crea un gráfico de anomalías en datos de series temporales utilizando Plotly, Matplotlib.

anomalize_df.plot_anomalías(fecha_columna = " fecha ",motor = “trama”))

PyTimeTK

Plot_Anomalies_decomp: esta función recupera datos de la función anomalize() y devuelve un gráfico de la descomposición de la anomalía. Devuelve un gráfico de tendencias observadas, estacionales y restantes. También podemos usar Groupby para trazarlo por categoría.

anomalize_df.plot_anomalies_decomp(" fecha ", motor = 'trama')

PyTimeTK

Plot_Anomalies_cleaned: esta función recupera los datos de la función anomalize() y devuelve un gráfico de las anomalías limpiadas, lo que significa que podemos visualizar los datos antes y después de que se eliminen las anomalías.

anomalize_df.plot_anomalies_cleaned(" fecha ")

PyTImeTK

Ingeniería de características

Agregar funcionalidad a los marcos de datos de series temporales (aumento) utilizando las siguientes funciones del paquete pytimetk

  1. augment_timeseries_signature: toma un marco de datos y una columna de fecha como entrada y devuelve el df original con las 29 funciones diferentes basadas en fecha y hora agregadas como nuevas columnas con el nombre de la función basado en date_column.
  2. Augment_holiday_signature: amplía 4 funciones de vacaciones diferentes desde una única fecha/hora para 137 países.
  3. Augment_lags: agrega retrasos a un objeto Pandas DataFrame o DataFrameGroupBy.
  4. Augment_leads: agrega clientes potenciales a un objeto Pandas DataFrame o DataFrameGroupBy.
  5. Augment_diffs: agrega diferencias a un objeto Pandas DataFrame o DataFrameGroupBy.
  6. Augment_rolling: aplique una o más funciones de desplazamiento basadas en series y tamaños de ventana a una o más columnas de un DataFrame.
  7. Augment_rolling_apply: aplica una o más funciones móviles y tamaños de ventana según un DataFrame
  8. augment_expanding: aplica una o más funciones de expansión basadas en series a una o más columnas de un DataFrame.
  9. augment_expanding_apply: aplica una o más funciones de expansión basadas en DataFrame a una o más columnas de un DataFrame.
  10. augment_fourier: agrega transformaciones de Fourier a un objeto Pandas DataFrame o DataFrameGroupBy.
  11. Augment_hilbert: aplica la transformación de Hilbert a las columnas especificadas de un DataFrame.
  12. Augment_wavelet: aplica la transformación Wavely a las columnas especificadas de un DataFrame.

Comparación con los pandas

Como muestra la tabla, pytimetk no se trata solo de velocidad; también simplifica su código base. Por ejemplo, resumen_by_time() convierte una rutina de bucle for doble de 6 líneas en pandas en una operación concisa de 2 líneas. ¡Y con el motor Polars, obtén resultados 13,4 veces más rápido que los pandas!

Del mismo modo, plot_timeseries() agiliza enormemente el proceso de trazado, encapsulando lo que normalmente requeriría 16 líneas de código matplotlib en un comando simple de 2 líneas en pytimetk, sin sacrificar la personalización o la calidad. Y con los motores plotly y plotnine, puedes crear gráficos interactivos y visualizaciones estáticas sorprendentes con solo unas pocas líneas de código.

Para las funciones de calendario, pytimetk ofrece augment_timeseries_signature() que reduce más de 30 líneas de extractos de pandas dt. Para funciones dinámicas, pytimetk ofrece augment_rolling(), que es de 10 a 3500 veces más rápido que los pandas. También ofrece pad_by_time() para llenar los vacíos en los datos de sus series temporales y anomalize() para detectar y corregir anomalías en los datos de sus series temporales.