Les données de séries chronologiques sont uniques car elles dépendent les unes des autres de manière séquentielle. En effet, les données sont collectées au fil du temps à intervalles cohérents, par exemple annuels, quotidiens ou même horaires.
Les données de séries chronologiques sont importantes dans de nombreuses analyses, car elles peuvent représenter des modèles pour des questions commerciales telles que la prévision des données, la détection d’anomalies, l’analyse des tendances, etc.
En Python, vous pouvez essayer d’analyser l’ensemble de données de séries chronologiques avec NumPy. NumPy est un package puissant pour les calculs numériques et statistiques, mais il peut être étendu aux données de séries chronologiques.
Comment peut-on faire ça? Essayons-le.
Données de séries chronologiques avec NumPy
Tout d’abord, nous devons installer NumPy dans notre environnement Python. Vous pouvez le faire avec le code suivant si vous ne l’avez pas fait.
Essayons ensuite de lancer des données de séries chronologiques avec NumPy. Comme je l’ai mentionné, les données de séries chronologiques ont des caractéristiques séquentielles et temporelles, nous essaierons donc de les créer avec NumPy.
import numpy as np
dates = np.array(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'], dtype="datetime64")
dates
Output>>
array(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
'2023-01-05'], dtype="datetime64[D]")
Comme vous pouvez le voir dans le code ci-dessus, nous définissons la série chronologique des données dans NumPy avec le dtype
paramètre. Sans eux, les données seraient considérées comme des données de chaîne, mais elles sont désormais considérées comme des données de séries chronologiques.
Nous pouvons créer les données de séries chronologiques NumPy sans les écrire individuellement. Nous pouvons le faire en utilisant la certaine méthode de NumPy.
date_range = np.arange('2023-01-01', '2025-01-01', dtype="datetime64[M]")
date_range
Output>>
array(['2023-01', '2023-02', '2023-03', '2023-04', '2023-05', '2023-06',
'2023-07', '2023-08', '2023-09', '2023-10', '2023-11', '2023-12',
'2024-01', '2024-02', '2024-03', '2024-04', '2024-05', '2024-06',
'2024-07', '2024-08', '2024-09', '2024-10', '2024-11', '2024-12'],
dtype="datetime64[M]")
Nous créons des données mensuelles de 2023 à 2024, avec les données de chaque mois comme valeurs.
Après cela, nous pouvons essayer d’analyser les données basées sur la série datetime NumPy. Par exemple, nous pouvons créer des données aléatoires avec autant de données que notre plage de dates.
data = np.random.randn(len(date_range)) * 10 + 100
Output>>
array([128.85379394, 92.17272879, 81.73341807, 97.68879621,
116.26500413, 89.83992529, 93.74247891, 115.50965063,
88.05478692, 106.24013365, 92.84193254, 96.70640287,
93.67819695, 106.1624716 , 97.64298602, 115.69882628,
110.88460629, 97.10538592, 98.57359395, 122.08098289,
104.55571757, 100.74572336, 98.02508889, 106.47247489])
En utilisant la méthode aléatoire de NumPy, nous pouvons générer des valeurs aléatoires pour simuler l’analyse de séries chronologiques.
Par exemple, nous pouvons essayer d’effectuer une analyse de moyenne mobile avec NumPy en utilisant le code suivant.
def moving_average(data, window):
return np.convolve(data, np.ones(window), 'valid') / window
ma_12 = moving_average(data, 12)
ma_12
Output>>
array([ 99.97075433, 97.03945458, 98.20526648, 99.53106381,
101.03189965, 100.58353316, 101.18898821, 101.59158114,
102.13919216, 103.51426971, 103.05640219, 103.48833188,
104.30217122])
La moyenne mobile est une simple analyse de séries chronologiques dans laquelle nous calculons la moyenne du nombre de sous-ensembles de la série. Dans l’exemple ci-dessus, nous utilisons la fenêtre 12 comme sous-ensemble. Cela signifie que nous prenons les 12 premiers de la série comme sous-ensemble et prenons leurs moyennes. Ensuite, le sous-ensemble se déplace de un et nous prenons le sous-ensemble moyen suivant.
Ainsi, le premier sous-ensemble est ce sous-ensemble où l’on prend la moyenne :
[128.85379394, 92.17272879, 81.73341807, 97.68879621,
116.26500413, 89.83992529, 93.74247891, 115.50965063,
88.05478692, 106.24013365, 92.84193254, 96.70640287]
Le sous-ensemble suivant est celui où nous faisons glisser la fenêtre d’un :
[92.17272879, 81.73341807, 97.68879621,
116.26500413, 89.83992529, 93.74247891, 115.50965063,
88.05478692, 106.24013365, 92.84193254, 96.70640287,
93.67819695]
C’est ce que np.convolve
fait comme la méthode déplacerait et additionnerait le sous-ensemble de la série autant que le np.ones
numéro de tableau. Nous utilisons l’option valide uniquement pour renvoyer le montant qui peut être calculé sans aucun remplissage.
Néanmoins, les moyennes mobiles sont souvent utilisées pour analyser les données de séries chronologiques afin d’identifier la tendance sous-jacente et comme signaux tels que l’achat/vente dans le domaine financier.
En parlant de modèles, nous pouvons simuler les données de tendance dans des séries chronologiques avec NumPy. La tendance est un mouvement directionnel persistant et à long terme dans les données. Fondamentalement, il s’agit de l’orientation générale de l’emplacement des données de séries chronologiques.
trend = np.polyfit(np.arange(len(data)), data, 1)
trend
Output>>
array([ 0.20421765, 99.78795983])
Ce qui se passe ci-dessus, c’est que nous ajustons une ligne droite linéaire à nos données ci-dessus. À partir du résultat, nous obtenons la pente de la droite (premier nombre) et l’origine (deuxième nombre). La pente représente la quantité de données modifiées par étape ou par valeurs temporelles en moyenne, tandis que l’ordonnée à l’origine est la direction des données (positive vers le haut et négative vers le bas).
Nous pouvons également avoir des données sans tendance, qui sont les composants après avoir supprimé la tendance de la série chronologique. Ce type de données est souvent utilisé pour détecter des modèles de fluctuation dans les données de tendance et les anomalies.
detrended = data - (trend[0] * np.arange(len(data)) + trend[1])
detrended
Output>>
array([ 29.06583411, -7.81944869, -18.46297706, -2.71181657,
15.66017371, -10.96912278, -7.2707868 , 14.29216727,
-13.36691409, 4.61421499, -8.98820376, -5.32795108,
-8.56037465, 3.71968235, -5.00402087, 12.84760174,
7.8291641 , -6.15427392, -4.89028352, 18.41288776,
0.6834048 , -3.33080706, -6.25565918, 1.98750918])
Les données sans leur tendance sont affichées dans le résultat ci-dessus. Dans une application réelle, nous les analyserions pour voir lequel s’écarte trop du modèle commun.
Nous pouvons également essayer d’analyser la saisonnalité à partir des données de séries chronologiques dont nous disposons. La saisonnalité correspond aux modèles réguliers et prévisibles qui se produisent à des intervalles temporels spécifiques, par exemple tous les 3 mois, tous les 6 mois, etc. La saisonnalité est généralement affectée par des facteurs externes tels que les vacances, la météo, les événements et bien d’autres.
seasonality = np.mean(data.reshape(-1, 12), axis=0)
seasonal_component = np.tile(seasonality, len(data)//12 + 1)[:len(data)]
Output>>
array([111.26599544, 99.16760019, 89.68820205, 106.69381124,
113.57480521, 93.4726556 , 96.15803643, 118.79531676,
96.30525224, 103.4929285 , 95.43351072, 101.58943888,
111.26599544, 99.16760019, 89.68820205, 106.69381124,
113.57480521, 93.4726556 , 96.15803643, 118.79531676,
96.30525224, 103.4929285 , 95.43351072, 101.58943888])
Dans le code ci-dessus, nous calculons la moyenne pour chaque mois, puis étendons les données pour qu’elles correspondent à leur longueur. En fin de compte, nous obtenons la moyenne pour chaque mois de l’intervalle de deux ans et nous pouvons essayer d’analyser les données pour voir s’il y a une saisonnalité qui mérite d’être mentionnée.
C’est toute la méthode de base que nous pouvons utiliser avec NumPy pour les données et l’analyse de séries chronologiques. Il existe de nombreuses méthodes avancées, mais celles