[PYTHON] Comment gérer les données de séries chronologiques (mise en œuvre)

introduction

Je suis un M2 spécialisé en CS. Je me concentre généralement sur le traitement d'images, mais comme j'ai eu l'occasion de gérer les futures données de date et de série chronologique, je vais le laisser sous forme de mémorandum. J'espère qu'il servira de référence à ceux qui souhaitent traiter des données chronologiques. ** J'omets des formules, donc je pense que c'est pour ceux qui veulent en avoir une idée **. De plus, si vous avez des erreurs, veuillez nous en informer.

Que sont les données de séries chronologiques?

Les données chronologiques sont ** «un ensemble de résultats mesurés à intervalles réguliers» **. En plus des informations sur les changements de température, les précipitations et les ventes en magasin, il s'agit d'une image qui contient des informations sur le temps mesuré sous forme d'ensemble.

Modèles + termes pouvant être utilisés pour les données de séries chronologiques

Modèle AR (modèle à retour automatique)

Modèle MA (modèle de moyenne mobile)

Modèle ARMA (modèle de moyenne mobile à retour automatique)

Modèle ARIMA (modèle de moyenne mobile à somme à retour automatique)

Modèle SARIMA (modèle de moyenne mobile saisonnière à somme auto-retour)

――La différence avec ARIMA est de savoir s'il faut tenir compte de la saisonnalité? --En plus de ARIMA (p, d, q) dans le sens de la série chronologique, ARIMA (P, D, Q) dans le sens de la différence saisonnière, et la période s

Processus racine d'unité

--Les données sont créées en ajoutant les valeurs.

Test ADF

Fonction d'autocorrélation (ACF)

―― Dans quelle mesure la valeur passée affecte-t-elle les données actuelles?

Fonction d'autocorrélation partielle (PACF)

--Autocorrélation obtenue en supprimant l'influence du temps du coefficient d'autocorrélation

import numpy as np
import pandas as pd 
pd.date_range('2020-1-1', freq='D', periods=3)

'''
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03'], dtype='datetime64[ns]', freq='D')
'''

df = pd.Series(np.arange(3))
df.index = pd.date_range('2020-1-1', freq='D', periods=3)
df

'''
2020-01-01    0
2020-01-02    1
2020-01-03    2
Freq: D, dtype: int64
'''
idx = pd.date_range('2020-1-1',freq='D',periods=365)
df = pd.DataFrame({'- En utilisant l'autocorrélation partielle, vous pouvez examiner la relation entre aujourd'hui et il y a 2 jours, en excluant l'effet d'il y a 1 jour - Analyse de retard + autocorrélation Produit de traitement de date A' : np.random.randint(100, size=365),
                   'Produit B' : np.random.randint(100, size=365)},
                   index=idx)
df     

'''

Produit A Produit B
2020-01-01	99	23
2020-01-02	73	98
2020-01-03	86	85
2020-01-04	44	37
2020-01-05	67	63
...	...	...
2020-12-26	23	25
2020-12-27	91	35
2020-12-28	3	23
2020-12-29	92	47
2020-12-30	55	84
365 rows × 2 columns
'''      
#Acquisition de données pour une date précise
df.loc['2020-2-3']

'''
Produit A 51
Produit B 46
Name: 2020-02-03 00:00:00, dtype: int64
'''

#Acquisition de données par découpage
df.loc[:'2020-1-4']

'''
Produit A Produit B
2020-01-01	99	23
2020-01-02	73	98
2020-01-03	86	85
2020-01-04	44	37
'''

df.loc['2020-1-4':'2020-1-7']
'''
Produit A Produit B
2020-01-04	44	37
2020-01-05	67	63
2020-01-06	6	94
2020-01-07	47	11
'''

df.loc['2020-1']

'''
### ``Afficher toutes les données pour janvier(réduction)
'''

#Obtenez le mois
df.index.month

'''
Int64Index([ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
            ...
            12, 12, 12, 12, 12, 12, 12, 12, 12, 12],
           dtype='int64', length=365)
'''

Analyse simple des données

Cette fois, nous utiliserons l'ensemble de données des «passagers aériens», qui est célèbre pour ses séries chronologiques.

Chargement et affichage des données
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
data = pd.read_csv('AirPassengers.csv', index_col=0, parse_dates=[0])
plt.plot(data)

plot1.png

Décomposer en tendance, saisonnière, résiduelle à l'aide de statsmodels

import statsmodels.api as sm 
res = sm.tsa.seasonal_decompose(data)
fig = res.plot()

trend.png

Affichage de l'autocorrélation et de l'autocorrélation partielle

fig, axes = plt.subplots(1,2, figsize=(15,5))
sm.tsa.graphics.plot_acf(data, ax=axes[0])
sm.tsa.graphics.plot_pacf(data, ax=axes[1])

autocorrelation.png

Suppression des tendances

plt.figure(figsize=(15,5))
plt.plot(data.diff(1))

remove_trend.png

Test ADF

Puisque la valeur est retournée par le taple, le premier élément de celle-ci est la valeur P. L'hypothèse nulle peut être rejetée si la valeur P est inférieure ou égale à 0,05.


#données brutes
sm.tsa.adfuller(data)[1]
0.991880243437641

#Conversion de journal
ldata = np.log(data)
sm.tsa.adfuller(ldata)[1]
0.42236677477039125

#Conversion de journal+Différence de sol
sm.tsa.adfuller(ldata.diff().dropna())[1]
0.0711205481508595

Estimation du modèle SARIMA

Définissez les paramètres avec ʻorder et season_order. Apprenez le modèle avec fit ()`. Les prévisions en dehors de la plage d'apprentissage sont «prévisions ()» La prédiction des points contenant des données d'entraînement est «predict ()» Le réglage des paramètres doit être calculé à tour de rôle. (Vous ne trouvez pas le meilleur modèle pour une fonction sans statsmodels?)

model = sm.tsa.SARIMAX(ldata, order=(1,1,1),seasonal_order=(0,1,2,12))
res_model = model.fit()
pred = res_model.forecast(36)
plt.plot(ldata, label='Original')
plt.plot(pred, label='Pred')

pred.png

Création de fonctionnalités dans les données de séries chronologiques

Informations susceptibles d'être une quantité de caractéristiques dans les séries chronologiques

#Création de table facile
df = pd.DataFrame(np.arange(6).reshape(6, 1),columns=['values'])

#Différence
df['diff_1'] = df['values'].diff(1)
#Différence pour 2 fois
df['diff_2'] = df['values'].diff(2)
#Changez simplement la valeur
df['shift'] = df['values'].shift(1)
#Taux de changement
df['ch'] = df['values'].pct_change(1)
#Moyenne mobile avec fonction fenêtre
df['rolling_mean'] = df['values'].rolling(2).mean()
df['rolling_max'] = df['values'].rolling(2).max()

table.png

Autres notes

Les références

À la fin

C'est facile, mais j'ai résumé la série chronologique. Ce qui est inquiétant, c'est d'adopter un modèle d'apprentissage automatique ou un modèle statistique. Personnellement, j'estime que le modèle statistique est meilleur en conséquence (pas ces données, mais ...).

Recommended Posts

Comment gérer les données de séries chronologiques (mise en œuvre)
Comment lire les données de séries chronologiques dans PyTorch
Comment comparer des données de séries chronologiques - Dérivée DTW, DTW-
Comment extraire des fonctionnalités de données de séries chronologiques avec les bases de PySpark
[Introduction à Python] Comment gérer les données au format JSON
Nettoyage des données Comment gérer les valeurs manquantes et aberrantes
[Python] Tracer des données de séries chronologiques
Comment gérer une session dans SQLAlchemy
Comment lire les données de la sous-région e-Stat
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
[Python] Comment utiliser la série Pandas
Comment gérer les données déséquilibrées
Comment augmenter les données avec PyTorch
À propos des données de séries chronologiques et du surentraînement
Différenciation des données de séries chronologiques (discrètes)
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Comment gérer le japonais avec Python
Comment collecter des données d'apprentissage automatique
Comment calculer la somme ou la moyenne des données csv de séries chronologiques en un instant
Prédiction des données de séries chronologiques par projection simplex
Comment collecter des données Twitter sans programmation
Prédire les données de séries chronologiques avec un réseau neuronal
Comment régler l'heure du serveur sur l'heure japonaise
Détection d'anomalies de données chronologiques pour les débutants
Comment gérer des valeurs consécutives dans MySQL
matplotlib Ecrire du texte dans un graphique de séries chronologiques
Comment utiliser "deque" pour les données Python
Lecture des données de séries chronologiques OpenFOAM et des ensembles de données
Comment lire les données de problème avec Paiza
Obtenez des données de séries chronologiques de k-db.com avec Python
Comment créer des exemples de données CSV avec hypothèse
Comment utiliser MkDocs pour la première fois
Comment éviter d'écrire% matplotlib en ligne à chaque fois
Comment implémenter le traitement du temps d'attente avec wxpython
Comment utiliser la bibliothèque d'images Python dans la série python3
Résumé de la méthode Kaggle's Kernel [Table time series data]
Décomposition des séries temporelles
Acquisition de données chronologiques (quotidiennes) des cours des actions
[Django] Comment obtenir des données en spécifiant SQL.
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
Comment récupérer des données de courses de chevaux avec Beautiful Soup
Comment utiliser les outils d'analyse de données pour les débutants
Comment obtenir des données d'article à l'aide de l'API Qiita
Lissage des séries temporelles et des données de forme d'onde 3 méthodes (lissage)
Comment mesurer le temps d'exécution avec Python Partie 1
Voir les détails des données de séries chronologiques dans Remotte
Comment rechercher des données HTML à l'aide de Beautiful Soup
Comment gérer le type datetime dans sqlite3 de python
[wxpython] Comment utiliser l'axe de base et du temps de wx.lib.plot
Comment mesurer le temps d'exécution avec Python, partie 2
Implémentation de la méthode de clustering k-shape pour les données de séries chronologiques [Apprentissage non supervisé avec python Chapitre 13]
Comment utiliser xgboost: classification multi-classes avec des données d'iris
Comment appliquer des marqueurs uniquement à des données spécifiques avec matplotlib
Quantité d'entités pouvant être extraite des données de séries chronologiques
[Pour les débutants] Comment étudier le test d'analyse de données Python3
Comment récupérer des données d'image de Flickr avec Python
Comment mesurer le temps de traitement avec Python ou Java
Comment récupérer des données de courses de chevaux à l'aide de pandas read_html
Comment créer rapidement des exemples de données pour un tableau pendant le codage