PyTimeTK

Dans ce tutoriel, nous allons montrer comment utiliser la librairie python PyTimeTK pour analyser des données de type série temporelle.

PyTimeTK

PyTimeTK, une librairie optimisée

L’analyse des séries chronologiques est fondamentale dans de nombreux domaines, des prévisions commerciales à la recherche scientifique. Bien que l’écosystème Python propose des outils tels que pandas, ils peuvent parfois être verbeux et ne pas être optimisés pour toutes les opérations, en particulier pour les agrégations et visualisations complexes basées sur le temps.

PytimeTK offre un mélange de facilité d’utilisation et d’efficacité de calcul et simplifie considérablement le processus de manipulation et de visualisation des séries chronologiques. En tirant parti du backend Polars, vous pouvez bénéficier d’améliorations de vitesse allant de 3X à un énorme 3500X, ce qui est un plus.

Conditions préalables — Assurez-vous que Python 3.9 ou version ultérieure est installé sur votre système.

Installez la dernière version stable de pytimetk à l’aide de pip : la dernière version est la 0.2.0

pip install pytimetk

Alternativement, vous pouvez installer la version de développement :

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

Gestion des données / Data Wrangling

summum_by_time — Résumez un objet DataFrame ou Groupby par heure. Cette fonction est utile pour effectuer des agrégations sur un ensemble de données avec un objet groupby sur une fréquence temporelle. Nous pouvons utiliser plusieurs fonctions d’agrégation telles que (Somme, Médiane, Minimum, Maximum, Écart type, Variance, Première valeur du groupe, Dernière valeur du groupe, Nombre de valeurs, Nombre de valeurs uniques, Corrélation entre les valeurs.

Les fonctions d’agrégation lambda personnalisées peuvent être utilisé également) sur une trame de données avec des fréquences variées comme (telles que « D » pour quotidien ou « MS » pour le début du mois, – S : deuxième fréquence – min : fréquence minute – H : fréquence horaire – D : fréquence quotidienne – W : hebdomadaire – M : fréquence de fin de mois – MS : fréquence de début de mois – Q : fréquence de fin de trimestre – QS : fréquence de début de trimestre – Y : fréquence de fin d’année – YS : fréquence de début d’année)

df.groupby('category_1').summarize_by_time(
date_column = 'order_date',
value_column = ['total_price', 'quantity'],
freq = 'MS',
agg_func = ['sum', 'mean', 'median','min',
('q25', lambda x: np.quantile(x, 0.25)),
('q75', lambda x: np.quantile(x, 0.75)),
'max',('range',lambda x: x.max() - x.min())],
wide_format = False,
engine = 'pandas')

pad_by_time — Rendre les séries temporelles irrégulières régulières en les complétant avec les données manquantes. Par exemple, si vous disposez de données historiques mensuelles pour lesquelles il manque quelques mois, utilisez pad_by_time et complétez les données manquantes avec des valeurs nulles.

df.groupby('category_1').pad_by_time(
date_column = 'order_date',
freq = 'W',
end_date = df.order_date.max())

future_frame — Cette fonction est utilisée pour étendre un dataframe ou un objet Groupby avec des dates futures basées sur une longueur spécifiée, liant éventuellement les données d’origine. Ceci est principalement utile pour préparer un futur ensemble de données qui peut être utilisé pour les prédictions.

df.groupby('category_2').future_frame(
date_column = 'order_date',
length_out = 12 # Extend data for future 3 months )

Visualisation des données

plot_timeseries() — Crée des tracés de séries chronologiques à l’aide de différents moteurs de traçage tels que Plotnine, Matplotlib et Plotly.

  • Génère des tracés interactifs (idéal pour l’exploration et les applications rationalisées/brillantes)
  • Consolide plus de 20 lignes de code plotnine/matpotlib et plotly
  • S’adapte bien à de nombreuses séries temporelles
  • Peut être converti de plotly interactif en tracés plotnine/matplotlib statiques en changeant le moteur de plotly en plotnine ou Matplotlib.
  • Des groupes peuvent être ajoutés à l’aide de pandas groupby()
df.groupby('id').plot_timeseries('date', 'value',
facet_ncol = 2, # 2-column faceted plot
facet_scales = "free_y",
smooth_frac = 0.2, # Apply smoothing to the time series data
smooth_size = 2.0,
y_intercept = None,
x_axis_date_labels = "%Y",
engine = 'plotly',
width = 600,
height = 500)

PyTimeTK

Détection des anomalies

La détection d’anomalies dans l’analyse de séries chronologiques est un processus crucial pour identifier des modèles inhabituels qui s’écartent du comportement attendu. Ces anomalies peuvent signifier des événements critiques, souvent imprévus, dans les données de séries chronologiques. Une détection efficace des anomalies contribue à maintenir la qualité et la fiabilité des données, garantissant ainsi des prévisions et une prise de décision précises.

Le défi consiste à faire la distinction entre les véritables anomalies et les fluctuations naturelles, ce qui nécessite des techniques analytiques sophistiquées et une compréhension approfondie des modèles sous-jacents des séries chronologiques. Par conséquent, la détection des anomalies est un élément essentiel de l’analyse des séries chronologiques, favorisant la gestion proactive des risques et des opportunités dans des environnements dynamiques.

Pytimetk utilise les méthodes suivantes pour déterminer les anomalies dans les données de séries chronologiques :

1- Décomposition des séries chronologiques :

  • La première étape consiste à décomposer la série chronologique en plusieurs composantes. Généralement, cela inclut les composants de tendance, de saisonnalité et de reste (ou résiduel).
  • La tendance représente le modèle ou la direction sous-jacente des données au fil du temps. La saisonnalité capture des modèles ou des cycles récurrents sur une période spécifique, par exemple quotidienne, hebdomadaire, mensuelle, etc.
  • Le reste (ou résiduel) est ce qui reste une fois que la tendance et les composantes saisonnières ont été supprimées de la série chronologique d’origine.

2- Générer des restes :

  • Après décomposition, le composant restant est extrait. Cette composante reflète la partie de la série chronologique qui ne peut être expliquée par les composantes tendancielles et saisonnières.
  • L’idée est que si la tendance et la saisonnalité représentent des modèles prévisibles et donc « normaux », le reste est celui où les anomalies sont les plus susceptibles de se manifester.

Il existe 2 techniques courantes de décomposition saisonnière ; STL et Twitter ;

  • STL (Seasonal and Trend Decomposition) est une méthode polyvalente et robuste pour décomposer des séries chronologiques. STL fonctionne très bien dans des circonstances où une tendance à long terme est présente. L’algorithme de Loess fait généralement un très bon travail pour détecter la tendance. Cependant, dans les cas où la composante saisonnière est plus dominante que la tendance, Twitter a tendance à mieux performer.
  • La méthode Twitter est une méthode de décomposition similaire à celle utilisée dans le package AnomalyDetection de Twitter. La méthode Twitter fonctionne de manière identique à STL pour supprimer le composant saisonnier. La principale différence réside dans la suppression de la tendance, qui s’effectue en supprimant la médiane des données plutôt qu’en ajustant un lissage. La médiane fonctionne bien lorsqu’une tendance à long terme est moins dominante que la composante saisonnière à court terme. En effet, le lissage a tendance à surajuster les anomalies.

Anamolize — Détecte les anomalies dans les données de séries chronologiques, soit pour une seule série chronologique, soit pour plusieurs séries chronologiques regroupées par une colonne spécifique. Cette fonction utilise le traitement parallèle pour accélérer le calcul pour les grands ensembles de données comportant de nombreux groupes de séries chronologiques. Le traitement parallèle entraîne une surcharge et peut ne pas être plus rapide sur de petits ensembles de données. Pour utiliser le traitement parallèle, définissez threads = -1 pour utiliser tous les processeurs disponibles.

# Anomalize the data 
anomalize_df = tk.anomalize(
df, "date", "value",method = "twitter",
iqr_alpha = 0.10, # To determine the threshold for detecting outliers.
clean_alpha = 0.75, # To determine the threshold for cleaning the outliers
clean = "min_max", # specifies the method used to clean the anomalies
verbose = True, # To display additional info and progress during the execution )

Cette fonction renvoie une trame de données avec les colonnes mentionnées ci-dessous où recomposed_l1 et l2 sont les limites de niveau inférieur et supérieur de la série chronologique recomposée.

PyTimeTK

Plot_Anomalies — Crée un tracé d’anomalies dans les données de séries chronologiques à l’aide de Plotly, Matplotlib.

anomalize_df.plot_anomalies(date_column = « date »,engine = « plotly »))

PyTimeTK

Plot_Anomalies_decomp — Cette fonction récupère les données de la fonction anomalize() et renvoie un tracé de la décomposition des anomalies. Il renvoie un graphique des tendances observées, saisonnières et restantes. Nous pouvons également utiliser Groupby pour le tracer par catégorie.

anomalize_df.plot_anomalies_decomp(« date », engine = ‘plotly’)

PyTimeTK

Plot_Anomalies_cleaned — Cette fonction récupère les données de la fonction anomalize() et renvoie un tracé des anomalies nettoyées, ce qui signifie que nous pouvons visualiser les données avant et après la suppression des anomalies.

anomalize_df.plot_anomalies_cleaned(« date »)

PyTImeTK

Ingénierie des fonctionnalités

Ajout de fonctionnalités aux DataFrames de séries temporelles (augmentation) à l’aide des fonctions ci-dessous du package pytimetk

  1. augment_timeseries_signature -Prend un DataFrame et une colonne de date en entrée et renvoie le df d’origine avec les 29 fonctionnalités différentes basées sur la date et l’heure ajoutées en tant que nouvelles colonnes avec le nom de la fonctionnalité basé sur date_column.
  2. Augment_holiday_signature — Développe 4 fonctionnalités de vacances différentes à partir d’une seule date/heure pour 137 pays.
  3. Augment_lags — Ajoute des décalages à un objet Pandas DataFrame ou DataFrameGroupBy.
  4. Augment_leads — Ajoute des leads à un objet Pandas DataFrame ou DataFrameGroupBy.
  5. Augment_diffs -Ajoute des différences à un objet Pandas DataFrame ou DataFrameGroupBy.
  6. Augment_rolling — Appliquez une ou plusieurs fonctions de défilement basées sur des séries et des tailles de fenêtre à une ou plusieurs colonnes d’un DataFrame.
  7. Augment_rolling_apply — Appliquer une ou plusieurs fonctions de roulement et tailles de fenêtre basées sur un DataFrame
  8. augment_expanding -Appliquez une ou plusieurs fonctions d’expansion basées sur des séries à une ou plusieurs colonnes d’un DataFrame.
  9. augment_expanding_apply — Appliquez une ou plusieurs fonctions d’expansion basées sur DataFrame à une ou plusieurs colonnes d’un DataFrame.
  10. augment_fourier- Ajoute des transformations de Fourier à un objet Pandas DataFrame ou DataFrameGroupBy.
  11. Augment_hilbert — Applique la transformation Hilbert aux colonnes spécifiées d’un DataFrame.
  12. Augment_wavelet — Applique la transformation Wavely aux colonnes spécifiées d’un DataFrame.

Comparaison avec Pandas

Comme le montre le tableau, pytimetk n’est pas seulement une question de vitesse ; cela simplifie également votre base de code. Par exemple, summary_by_time() convertit une routine double boucle for de 6 lignes dans pandas en une opération concise de 2 lignes. Et avec le moteur Polars, obtenez des résultats 13,4 fois plus rapides que les pandas !

De même, plot_timeseries() rationalise considérablement le processus de traçage, en encapsulant ce qui nécessiterait généralement 16 lignes de code matplotlib dans une simple commande de 2 lignes dans pytimetk, sans sacrifier la personnalisation ou la qualité. Et avec les moteurs plotly et plotnine, vous pouvez créer des tracés interactifs et de superbes visualisations statiques avec seulement quelques lignes de code.

Pour les fonctionnalités de calendrier, pytimetk propose augment_timeseries_signature() qui réduit plus de 30 lignes d’extractions pandas dt. Pour les fonctionnalités dynamiques, pytimetk propose augment_rolling(), qui est 10 à 3 500 fois plus rapide que les pandas. Il propose également pad_by_time() pour combler les lacunes de vos données de séries chronologiques, et anomalize() pour détecter et corriger les anomalies dans vos données de séries chronologiques.