Pour analyser les données de séries chronologiques, un certain traitement doit être effectué sur les données données.
Vous apprendrez à gérer les données de séries chronologiques fournies au format CSV.
Tout d'abord, lisons les données avec les pandas et affichons-les. Pour charger les pandas
pd.read_csv()Comme argument
filepath_or_buffer="Spécifiez le chemin et l'URL du fichier à lire"Est utilisé.
#Lorsque vous souhaitez vérifier le début des données lues
df.head(Le nombre de données)
#Quand tu veux vérifier la queue
df.tail(Le nombre de données)
# head,tail était une fonction pour extraire 5 données du début et de la fin, respectivement.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime
#Chargement et organisation des données
sales_sparkling = pd.read_csv("./5060_tsa_data/monthly-australian-wine-sales-th-sparkling.csv")
#Afficher les 5 premières données
print(sales_sparkling.head(5))
#Afficher 5 données à la queue
print(sales_sparkling.tail(5))
Lors de l'analyse des données de séries chronologiques, utilisez les informations de temps (données du mois dans l'exemple précédent) En en faisant l'index des pandas (la partie de 0, 1, 2 ...... à l'extrême gauche dans l'exemple précédent) Rend les données plus faciles à gérer.
Ce traitement
1.informations d'index pd.date_range("Au début", "Une fois terminé", freq="intervalle")Résumer dans
2.Remplacez ces informations par l'index des données d'origine
3.Des données originales"Month"Supprimer
Suivez la procédure dans.
Par exemple, 2017/1/1~2018/1/Si vous souhaitez collecter la période de 1 par intervalle de jour
pd.date_range("2017-01-01", "2018-01-01", freq = "D")Passons l'argument comme ça.
Donnez à freq un acronyme pour l'intervalle que vous souhaitez collecter. (Second➡S, Minute➡min, Hour➡H, Day➡D, Month➡M)
Vérifiez et déterminez "au début", "à la fin" et "intervalle" avec df.head () et df.tail ().
Aussi, dans le cas de données mensuelles comme ce vin mousseux C'est plus facile à gérer si vous définissez vous-même la date de fin de mois.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime
#Chargement et organisation des données
sales_sparkling = pd.read_csv("./5060_tsa_data/monthly-australian-wine-sales-th-sparkling.csv")
#Création de données d'index
index = pd.date_range("1980-01-31", "1995-07-31", freq = "M")
#Affectation des données d'index
sales_sparkling.index = index
# "Month"Supprimer la colonne
del sales_sparkling["Month"]
#Affichage des données
print(sales_sparkling.head())
Affichons-le une fois sous forme de graphique en ligne brisée.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime
#Chargement et organisation des données
sales_sparkling = pd.read_csv("./5060_tsa_data/monthly-australian-wine-sales-th-sparkling.csv")
#Création de données d'index
index = pd.date_range("1980-01-31", "1995-07-31", freq = "M")
#Affectation des données d'index
sales_sparkling.index = index
# "Month"Supprimer la colonne
del sales_sparkling["Month"]
#Représenter les données sous forme de graphique linéaire
#Définir le titre du graphique
plt.title("monthly-australian-wine-sales-th-sparkling")
#Nommer l'axe des x et l'axe des y du graphique
plt.xlabel("date")
plt.ylabel("sales")
#Graphique de données
plt.plot(sales_sparkling)
plt.show()
Ces deux facteurs peuvent être considérés comme la raison de ne pas avoir de constance.
Rappelant la condition de constance des tendances, la condition que la valeur attendue soit constante. Si les données ont une tendance positive, leur valeur attendue est également à la hausse, donc on ne peut pas dire qu'elle est stationnaire.
Pour les fluctuations saisonnières, le coefficient d'autocorrélation (c'est-à-dire le degré de dispersion des valeurs de données), qui est une condition de stabilité, Quand je me souviens de la condition d'être constant Les données chronologiques telles que Oden, dont les ventes augmentent rapidement à un certain moment, ne remplissent pas cette condition.
Pour convertir des données de série chronologique non stationnaires en données de série chronologique stationnaire Éliminez les tendances et les fluctuations saisonnières.
1,Supprimer les tendances et les fluctuations saisonnières
2,Effectuer une analyse après avoir rendu les données de la série chronologique stationnaires
3,Construisez un modèle de données stables.
4,Puis, en synthétisant à nouveau les tendances et les fluctuations saisonnières, un modèle de la série originale est construit.
Le modèle ARIMA modélise les données de séries chronologiques de cette manière. (Pour être précis, s'il y a des fluctuations saisonnières, nous traiterons un modèle appelé le modèle SARIMA)
Comment faire de la série chronologique un processus stationnaire
1,Par transformation logarithmique, la dispersion des fluctuations peut être uniformisée.
2,Après avoir estimé la tendance en prenant une moyenne mobile, supprimez la composante de tendance
3,Éliminez les tendances et les fluctuations saisonnières en convertissant en une série de différences
4,Utiliser la désaisonnalisation
Etc.
En effectuant une conversion logarithmique, les fluctuations des données peuvent être modérées. En prenant un logarithme, plus le nombre est grand, plus le nombre sera petit.
En d'autres termes, l'auto-covariance peut être uniformisée pour une série chronologique volatile. Convertissons en fait la série chronologique en logarithmique.
Si la tendance ne peut pas être supprimée par conversion logarithmique, la tendance doit être supprimée davantage.
Np pour la conversion logarithmique.log()Est utilisé.
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime
import numpy as np
#Lire les données
sunspots = sm.datasets.sunspots.load_pandas().data
sunspots.index = pd.Index(sm.tsa.datetools.dates_from_range("1700", "2008"))
del sunspots["YEAR"]
#Conversion de journal
sunspots_log = np.log(sunspots)#Veuillez écrire ici
#Graphique après conversion logarithmique
plt.title("Sunspots")
plt.xlabel("date")
plt.ylabel("sunspots_log")
plt.plot(sunspots_log)
plt.show()
Pour prendre une moyenne mobile, prenez la moyenne de k valeurs consécutives. Qu'est-ce qu'une moyenne mobile? Prenez une «moyenne» dans une certaine section de données chronologiques. C'est à répéter en "déplaçant" la section.
Cela permettra aux données d'être lissées tout en conservant les caractéristiques des données d'origine.
Par exemple, si les données mensuelles présentent des fluctuations saisonnières, vous pouvez trouver la moyenne mobile de 12 valeurs consécutives. Les fluctuations saisonnières peuvent être supprimées et les composantes de tendance peuvent être extraites.
Soustrayez ensuite la moyenne mobile calculée de la série d'origine. Ce faisant, la composante de tendance de la série peut être supprimée.
Prenons une moyenne mobile toutes les 51 semaines (juste un an) pour les données de concentration de CO2 à l'observatoire du Mauna Loa et vérifions la tendance. Vérifiez également que les données obtenues en soustrayant la moyenne mobile de la série originale se rapprochent du processus stable.
La moyenne mobile est
DATA.rolling(window=Combien de moyennes mobiles prendre).mean()Par
Peut être demandé
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime
import numpy as np
co2_tsdata = sm.datasets.co2.load_pandas().data
#Gestion des valeurs manquantes
co2_tsdata2 = co2_tsdata.fillna(method="ffill")
#Graphique de la série originale
plt.subplot(6, 1, 1)
plt.xlabel("date")
plt.ylabel("co2")
plt.plot(co2_tsdata2)
#Trouvez la moyenne mobile
co2_moving_avg = co2_tsdata2.rolling(window=51).mean()
#Graphique de moyenne mobile
plt.subplot(6, 1, 3)
plt.xlabel("date")
plt.ylabel("co2")
plt.plot(co2_moving_avg)
#Série originale-Graphique de moyenne mobile
plt.subplot(6, 1, 5)
plt.xlabel("date")
plt.ylabel("co2")
mov_diff_co2_tsdata = co2_tsdata2-co2_moving_avg
plt.plot(mov_diff_co2_tsdata)
plt.show()
La conversion en série de différences est la méthode la plus couramment utilisée pour assurer la constance. Les tendances et les fluctuations saisonnières peuvent être éliminées en prenant la différence.
La série de différences était une série obtenue en soustrayant des données adjacentes dans les données de séries chronologiques. Par exemple, la série de différences de données de séries chronologiques [1, 5, 3, 5, 3, 2, 2, 9] est [4, -2, 2, -2, -1, 0, 7].
La principale différence est DATA.diff()Est requis par.
Si vous prenez la série de différences de la série de différences générée, ce sera la série de différences de deuxième ordre.
Conversion des données de concentration de dioxyde de carbone de l'observatoire du Mauna Loa en une série de différences de premier ordre Vérifions que la série originale se rapproche d'un processus régulier.
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime
import numpy as np
co2_tsdata = sm.datasets.co2.load_pandas().data
#Gestion des valeurs manquantes
co2_tsdata2 = co2_tsdata.fillna(method="ffill")
#Tracé de la série originale
plt.subplot(2, 1, 1)
plt.xlabel("date")
plt.ylabel("co2")
plt.plot(co2_tsdata2)
#Faites la différence
plt.subplot(2, 1, 2)
plt.xlabel("date")
plt.ylabel("co2_diff")
co2_data_diff = co2_tsdata2.diff()#Veuillez écrire ici
#Graphique des séries de différences
plt.plot(co2_data_diff)
plt.show()
J'ai appris la série des différences. À cette époque, la série originale était divisée en tendances, fluctuations saisonnières et résidus.
Cette conversion est
(Série originale=tendance+Fluctuation saisonnière+Erreur résiduelle)
Puisqu'il est exprimé comme
Série originale-tendance-Fluctuation saisonnière=Erreur résiduelle
Ce sera.
En d'autres termes, les résidus sont des données de séries chronologiques stationnaires sans tendances et fluctuations saisonnières. Vérifions que le résidu est un processus régulier.
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pandas import datetime
import numpy as np
#Lire les données
co2_tsdata = sm.datasets.co2.load_pandas().data
#Gestion des valeurs manquantes
co2_tsdata2 = co2_tsdata.dropna()
#Ajustement saisonnier et tracé graphique
res = sm.tsa.seasonal_decompose(co2_tsdata2,freq=51)
fig = res.plot()
plt.show()
Recommended Posts