10 Python-Einzeiler zum Generieren von Zeitreihenfunktionen
Einführung
Zeitreihendaten Normalerweise ist ein tiefgreifendes Verständnis erforderlich, um effektive und aufschlussreiche Prognosemodelle zu erstellen. Zwei Schlüsseleigenschaften sind bei der Zeitreihenvorhersage von entscheidender Bedeutung: Darstellung und Granularität.
- Bei der Darstellung geht es darum, zeitliche Rohdaten – z. B. tägliche oder stündliche Messungen – mithilfe sinnvoller Ansätze in aussagekräftige Muster umzuwandeln
- Bei der Granularität geht es darum, zu analysieren, wie genau solche Muster Variationen im Zeitverlauf erfassen.
Als zwei Seiten derselben Medaille sind ihre Unterschiede subtil, aber eines ist sicher: Beide werden durch erreicht Function-Engineering.
In diesem Artikel werden 10 einfache Python-Einzeiler zum Generieren von Zeitreihenfunktionen basierend auf verschiedenen Merkmalen und Eigenschaften vorgestellt, die den Rohzeitreihendaten zugrunde liegen. Diese Einzeiler können einzeln oder in Kombination verwendet werden, um Ihnen bei der Erstellung informativerer Datensätze zu helfen, die viel über das zeitliche Verhalten Ihrer Daten verraten – wie sie sich entwickeln, wie sie schwanken und welche Traits sie im Laufe der Zeit aufweisen.
Beachten Sie, dass unsere Beispiele verwenden Pandas Und NumPy.
1. Verzögerungsfunktion (autoregressive Darstellung)
Die Idee hinter der Verwendung autoregressiver Darstellungs- oder Verzögerungsmerkmale ist einfacher als es klingt: Sie besteht darin, die vorherige Beobachtung als neues Prädiktormerkmal in die aktuelle Beobachtung einzufügen. Im Wesentlichen ist dies wohl die einfachste Methode, zeitliche Abhängigkeiten darzustellen, z. B. zwischen dem aktuellen Zeitpunkt und früheren Zeitpunkten.
Schauen wir uns diesen als ersten einzeiligen Beispielcode in dieser Liste von 10 genauer an.
In diesem einzeiligen Beispiel wird davon ausgegangen, dass Sie einen Rohzeitreihendatensatz in einem gespeichert haben DataFrame angerufen dfeines der vorhandenen Attribute ist benannt 'worth'. Beachten Sie, dass das Argument in der shift() Die Funktion kann angepasst werden, um den registrierten Wert abzurufen N Zeitpunkte oder Beobachtungen vor dem aktuellen:
df(‚lag_1‘) = df(‚worth‘).shift(1)
|
df(‚lag_1‘) = df(‚Wert‘).Schicht(1) |
Bei täglichen Zeitreihendaten ist die Verwendung sinnvoll, wenn Sie frühere Werte für einen bestimmten Wochentag, z. B. Montag, erfassen möchten shift(7).
2. Rollmittel (kurzfristige Glättung)
Um lokale Traits zu erfassen oder kurzfristige Schwankungen in den Daten zu glätten, ist es in der Regel praktisch, gleitende Mittelwerte über die Daten hinweg zu verwenden N frühere Beobachtungen, die zur aktuellen Beobachtung führen: Dies ist eine einfache, aber sehr nützliche Methode, um manchmal chaotische Rohzeitreihenwerte über ein bestimmtes Merkmal zu glätten.
In diesem Beispiel wird ein neues Function erstellt, das für jede Beobachtung den gleitenden Mittelwert der drei vorherigen Werte dieses Options in aktuellen Beobachtungen enthält:
df(‚rolling_mean_3‘) = df(‚worth‘).rolling(3).imply()
|
df(‚rolling_mean_3‘) = df(‚Wert‘).rollt(3).bedeuten() |
Geglättete Zeitreihenfunktion mit gleitendem Mittelwert
3. Rollierende Standardabweichung (lokale Volatilität)
Ähnlich wie bei gleitenden Mittelwerten besteht auch die Möglichkeit, neue Merkmale auf der Grundlage der gleitenden Standardabweichung zu erstellen, was für die Modellierung der Volatilität aufeinanderfolgender Beobachtungen effektiv ist.
In diesem Beispiel wird eine Funktion zum Modellieren der Variabilität der neuesten Werte über ein gleitendes Fenster einer Woche unter der Annahme täglicher Beobachtungen vorgestellt.
df(‚rolling_std_7‘) = df(‚worth‘).rolling(7).std()
|
df(‚rolling_std_7‘) = df(‚Wert‘).rollt(7).std() |
4. Erweiterungsmittel (kumulativer Speicher)
Der expandierende Mittelwert berechnet den Mittelwert aller Datenpunkte bis (einschließlich) der aktuellen Beobachtung in der zeitlichen Abfolge. Es handelt sich additionally um einen gleitenden Mittelwert mit ständig wachsender Fenstergröße. Es ist nützlich zu analysieren, wie sich der Mittelwert der Werte in einem Zeitreihenattribut im Laufe der Zeit entwickelt, um so Aufwärts- oder Abwärtstrends langfristig zuverlässiger zu erfassen.
df(‚expanding_mean‘) = df(‚worth‘).increasing().imply()
|
df(‚expanding_mean‘) = df(‚Wert‘).expandieren().bedeuten() |
5. Differenzierung (Trendentfernung)
Diese Technik wird verwendet, um langfristige Traits zu entfernen und Änderungsraten hervorzuheben – was in instationären Zeitreihen wichtig ist, um sie zu stabilisieren. Es berechnet die Differenz zwischen aufeinanderfolgenden Beobachtungen (aktuelle und vorherige) eines Zielattributs:
df(‚diff_1‘) = df(‚worth‘).diff()
|
df(‚diff_1‘) = df(‚Wert‘).diff() |
6. Zeitbasierte Funktionen (Zeitkomponentenextraktion)
Einfach, aber in realen Anwendungen sehr nützlich, kann dieser Einzeiler verwendet werden, um relevante Informationen aus der vollständigen Datums-/Uhrzeitfunktion zu zerlegen und zu extrahieren oder Ihre Zeitreihe zu indizieren, um die es geht:
df(‚month‘), df(‚dayofweek‘) = df(‚Date‘).dt.month, df(‚Date‘).dt.dayofweek
|
df(‚Monat‘), df(‚Wochentag‘) = df(‚Datum‘).dt.Monat, df(‚Datum‘).dt.Wochentag |
Wichtig: Seien Sie vorsichtig und prüfen Sie, ob in Ihrer Zeitreihe die Datum-Uhrzeit-Informationen in einem regulären Attribut oder als Index der Datenstruktur enthalten sind. Wenn es der Index wäre, müssen Sie möglicherweise stattdessen Folgendes verwenden:
df(‚hour‘), df(‚dayofweek‘) = df.index.hour, df.index.dayofweek
|
df(‚Stunde‘), df(‚Wochentag‘) = df.Index.Stunde, df.Index.Wochentag |
7. Rollende Korrelation (zeitliche Beziehung)
Dieser Ansatz geht einen Schritt über das Rollieren von Statistiken über ein Zeitfenster hinaus, um zu messen, wie aktuelle Werte mit ihren verzögerten Gegenstücken korrelieren, und trägt so dazu bei, sich entwickelnde Autokorrelationen zu entdecken. Dies ist beispielsweise nützlich bei der Erkennung von Regimewechseln, additionally abrupten und anhaltenden Verhaltensänderungen in den Daten im Laufe der Zeit, die auftreten, wenn rollierende Korrelationen irgendwann schwächer werden oder sich umkehren.
df(‚rolling_corr‘) = df(‚worth‘).rolling(30).corr(df(‚worth‘).shift(1))
|
df(‚rolling_corr‘) = df(‚Wert‘).rollt(30).korr(df(‚Wert‘).Schicht(1)) |
8. Fourier-Merkmale (Saisonalität)
Sinusförmige Fourier-Transformationen können in Rohzeitreihenattributen verwendet werden, um zyklische oder saisonale Muster zu erfassen. Durch die Anwendung der Sinus- (oder Kosinus-)Funktion werden beispielsweise zyklische Tagesinformationen, die den Datums-/Uhrzeitmerkmalen zugrunde liegen, in kontinuierliche Merkmale umgewandelt, die zum Erlernen und Modellieren jährlicher Muster nützlich sind.
df(‚fourier_sin‘) = np.sin(2 * np.pi * df(‚Date‘).dt.dayofyear / 365) df(‚fourier_cos‘) = np.cos(2 * np.pi * df(‚Date‘).dt.dayofyear / 365)
|
df(‚fourier_sin‘) = np.Sünde(2 * np.pi * df(‚Datum‘).dt.Tag des Jahres / 365) df(‚fourier_cos‘) = np.cos(2 * np.pi * df(‚Datum‘).dt.Tag des Jahres / 365) |
Erlauben Sie mir, in diesem Beispiel aus gutem Grund einen Zweizeiler anstelle eines Einzeilers zu verwenden: Sinus und Kosinus zusammen erfassen das Gesamtbild möglicher zyklischer Saisonalitätsmuster besser.
9. Exponentiell gewichteter Mittelwert (adaptive Glättung)
Der exponentiell gewichtete Mittelwert – oder kurz EWM – wird angewendet, um exponentiell abfallende Gewichte zu erhalten, die aktuellen Datenbeobachtungen eine höhere Bedeutung verleihen und gleichzeitig das Langzeitgedächtnis bewahren. Es handelt sich um einen adaptiveren und etwas „intelligenteren“ Ansatz, bei dem aktuelle Beobachtungen Vorrang vor der fernen Vergangenheit haben.
df(‚ewm_mean‘) = df(‚worth‘).ewm(span=5).imply()
|
df(‚ewm_mean‘) = df(‚Wert‘).ewm(Spanne=5).bedeuten() |
10. Rollende Entropie (Informationskomplexität)
Zum Schluss noch ein bisschen Mathe! Die rollierende Entropie eines bestimmten Merkmals über ein Zeitfenster berechnet, wie zufällig oder verteilt die Werte über dieses Zeitfenster sind, und offenbart so die Menge und Komplexität der darin enthaltenen Informationen. Niedrigere Werte der resultierenden rollierenden Entropie weisen auf ein Gefühl von Ordnung und Vorhersagbarkeit hin. Je höher diese Werte sind, desto größer ist das „Chaos und die Unsicherheit“.
df(‚rolling_entropy‘) = df(‚worth‘).rolling(10).apply(lambda x: -np.sum((p:=np.histogram(x, bins=5)(0)/len(x))*np.log(p+1e-9)))
|
df(‚rolling_entropy‘) = df(‚Wert‘).rollt(10).anwenden(Lambda X: –np.Summe((P:=np.Histogramm(X, Mülleimer=5)(0)/len(X))*np.Protokoll(P+1e–9))) |
Zusammenfassung
In diesem Artikel haben wir 10 Strategien untersucht und veranschaulicht – jeweils über eine einzige Codezeile –, um eine Vielzahl von Mustern und Informationen aus rohen Zeitreihendaten zu extrahieren, von einfacheren Traits bis hin zu anspruchsvolleren Traits wie Saisonalität und Informationskomplexität.
