[PYTHON] Umgang mit Zeitreihendaten (Implementierung)

Einführung

Ich bin eine M2-Person mit Schwerpunkt CS. Normalerweise konzentriere ich mich auf die Bildverarbeitung, aber da ich die Möglichkeit hatte, zukünftige Datums- und Zeitreihendaten zu verarbeiten, werde ich sie als Memorandum belassen. Ich hoffe, es wird als Referenz für diejenigen dienen, die Zeitreihendaten verarbeiten möchten. ** Ich lasse Formeln weg, also denke ich, es ist für diejenigen, die ein Gefühl dafür bekommen wollen **. Wenn Sie Fehler haben, teilen Sie uns dies bitte mit.

Was sind Zeitreihendaten?

Zeitreihendaten sind ** "eine Sammlung von Ergebnissen, die in regelmäßigen Abständen gemessen werden" **. Neben Informationen zu Temperaturänderungen, Niederschlag und Filialverkäufen enthält dieses Bild Informationen zur gemessenen Zeit als Satz.

Modelle + Begriffe, die für Zeitreihendaten verwendet werden können

AR-Modell (Self-Return-Modell)

MA-Modell (gleitendes Durchschnittsmodell)

ARMA-Modell (selbstkehrendes Modell mit gleitendem Durchschnitt)

--AR + MA-Prozess, entsprechend der stärkeren Eigenschaft ――Daher nehmen sowohl die Autokorrelation als auch die partielle Autokorrelation mit der Größe der Verzögerung ab.

ARIMA-Modell (Modell mit gleitendem Durchschnitt der Selbstrückgabesumme)

SARIMA-Modell (Modell der gleitenden Durchschnittssumme der saisonalen Selbstrückgabe)

――Der Unterschied zu ARIMA besteht darin, ob die Saisonalität berücksichtigt werden soll.

Unit-Root-Prozess

ADF-Test

Autokorrelationsfunktion (ACF)

――Wie stark beeinflusst der vergangene Wert die aktuellen Daten?

Partielle Autokorrelationsfunktion (PACF)

--Autokorrelation durch Entfernen des Einflusses der Zeit vom Autokorrelationskoeffizienten

Collerogram

Analyse

import numpy as np
import pandas as pd 
Umgang mit Daten
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({'Produkt A.' : np.random.randint(100, size=365),
                   'Produkt B.' : np.random.randint(100, size=365)},
                   index=idx)
df     

'''

Produkt A Produkt 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
'''      
#Datenerfassung für ein bestimmtes Datum
df.loc['2020-2-3']

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

#Datenerfassung durch Slicing
df.loc[:'2020-1-4']

'''
Produkt A Produkt 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']
'''
Produkt A Produkt 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']

'''
### ``Alle Daten für Januar anzeigen(Kürzung)
'''

#Holen Sie sich den Monat
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)
'''

Einfache Datenanalyse

Dieses Mal werden wir den Datensatz "Air Passengers" verwenden, der für Zeitreihendaten bekannt ist.

Laden und Anzeigen von Daten
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

Zerlegen Sie sich mithilfe von Statistikmodellen in trendige, saisonale Rückstände

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

trend.png

Anzeige der Autokorrelation und partiellen Autokorrelation

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

Entfernung von Trends

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

remove_trend.png

ADF-Test

Da der Wert vom Taple zurückgegeben wird, ist das erste Element der P-Wert. Die Nullhypothese kann verworfen werden, wenn der P-Wert 0,05 oder weniger beträgt.


#Originale Daten
sm.tsa.adfuller(data)[1]
0.991880243437641

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

#Protokollkonvertierung+Bodenunterschied
sm.tsa.adfuller(ldata.diff().dropna())[1]
0.0711205481508595

SARIMA-Modellschätzung

Stellen Sie die Parameter mit order und saisonal_order ein. Lernen Sie das Modell mit fit (). Prognosen außerhalb des Lernbereichs sind "prognostiziert ()" Die Vorhersage von Punkten, die Trainingsdaten enthalten, ist "pred ()" Die Parametereinstellung sollte im Round-Robin-Verfahren berechnet werden. (Sie können das beste Modell für eine Funktion ohne Statistikmodelle nicht finden?)

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

Feature-Erstellung in Zeitreihendaten

Informationen, bei denen es sich wahrscheinlich um eine Merkmalsmenge in Zeitreihen handelt

#Einfache Tabellenerstellung
df = pd.DataFrame(np.arange(6).reshape(6, 1),columns=['values'])

#Unterschied
df['diff_1'] = df['values'].diff(1)
#Unterschied für 2 mal
df['diff_2'] = df['values'].diff(2)
#Verschieben Sie einfach den Wert
df['shift'] = df['values'].shift(1)
#Änderungsrate
df['ch'] = df['values'].pct_change(1)
#Gleitender Durchschnitt mit Fensterfunktion
df['rolling_mean'] = df['values'].rolling(2).mean()
df['rolling_max'] = df['values'].rolling(2).max()

table.png

Weitere Hinweise

--Features können mit einer Bibliothek namens "tsfresh" erstellt werden --Sie können mit sklearns "TimeSeries Split" einen Lebenslauf erstellen ――Da das Modell des maschinellen Lernsystems ein stetiger Prozess ist, ist es nicht besser, ein statistisches Modell zu verwenden?

Verweise

Am Ende

Es ist einfach, aber ich habe die Zeitreihen zusammengefasst. Besorgniserregend ist, ob ein maschinelles Lernmodell oder ein statistisches Modell angewendet werden soll. Persönlich bin ich der Meinung, dass das statistische Modell dadurch besser ist (nicht diese Daten, aber ...).

Recommended Posts

Umgang mit Zeitreihendaten (Implementierung)
Lesen von Zeitreihendaten in PyTorch
So vergleichen Sie Zeitreihendaten-Derivative DTW, DTW-
So extrahieren Sie Funktionen von Zeitreihendaten mit PySpark Basics
[Einführung in Python] Umgang mit Daten im JSON-Format
Datenbereinigung Umgang mit fehlenden und Ausreißern
[Python] Zeichnen Sie Zeitreihendaten
Umgang mit Sitzungen in SQLAlchemy
Lesen von e-Stat-Subregionsdaten
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
[Python] Verwendung der Pandas-Serie
Umgang mit unausgeglichenen Daten
Aufblasen von Daten (Datenerweiterung) mit PyTorch
Über Zeitreihendaten und Übertraining
Differenzierung von Zeitreihendaten (diskret)
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
Umgang mit Japanisch mit Python
Sammeln von Daten zum maschinellen Lernen
So berechnen Sie die Summe oder den Durchschnitt von Zeitreihen-CSV-Daten in einem Augenblick
Vorhersage von Zeitreihendaten durch Simplex-Projektion
So sammeln Sie Twitter-Daten ohne Programmierung
Vorhersage von Zeitreihendaten mit einem neuronalen Netzwerk
So stellen Sie die Serverzeit auf japanische Zeit ein
Erkennung von Zeitreihendatenanomalien für Anfänger
Umgang mit aufeinanderfolgenden Werten in MySQL
matplotlib Schreiben Sie Text in ein Zeitreihendiagramm
Verwendung von "deque" für Python-Daten
OpenFOAM-Zeitreihendaten lesen und Daten einstellen
Wie man Problemdaten mit Paiza liest
Holen Sie sich mit Python Zeitreihendaten von k-db.com
Erstellen von CSV-Beispieldaten mit Hypothese
So verwenden Sie MkDocs zum ersten Mal
So vermeiden Sie, dass Sie jedes Mal% matplotlib inline schreiben
So implementieren Sie die Time-Wait-Verarbeitung mit wxpython
Verwendung der Python-Bildbibliothek in der Python3-Serie
Zusammenfassung der Kaggle-Kernel-Methode [Tabelle Zeitreihendaten]
Zeitreihenzerlegung
Erfassung von Zeitreihendaten (täglich) von Aktienkursen
[Django] So erhalten Sie Daten durch Angabe von SQL.
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
So kratzen Sie Pferderenndaten mit Beautiful Soup
Verwendung von Datenanalysetools für Anfänger
So erhalten Sie Artikeldaten mithilfe der Qiita-API
Glättung von Zeitreihen und Wellenformdaten 3 Methoden (Glättung)
So messen Sie die Ausführungszeit mit Python Teil 1
Zeigen Sie Details zu Zeitreihendaten mit Remotte an
So suchen Sie HTML-Daten mit Beautiful Soup
Wie man mit dem Datum / Uhrzeit-Typ in Pythons SQLite3 umgeht
[wxpython] Verwendung der Basis- und Zeitachse von wx.lib.plot
So messen Sie die Ausführungszeit mit Python Part 2
Implementierung der Clustering-K-Form-Methode für Zeitreihendaten [Unüberwachtes Lernen mit Python Kapitel 13]
Verwendung von xgboost: Mehrklassenklassifizierung mit Irisdaten
So wenden Sie mit matplotlib Marker nur auf bestimmte Daten an
Merkmalsmenge, die aus Zeitreihendaten extrahiert werden kann
[Für Anfänger] So studieren Sie den Python3-Datenanalysetest
So kratzen Sie Bilddaten von Flickr mit Python
So messen Sie die Verarbeitungszeit mit Python oder Java
Wie man Pferderenndaten mit pandas read_html kratzt
So erstellen Sie während des Codierens schnell Beispieldaten für ein Array