[PYTHON] Ein Hinweis bei der Suche nach einer Alternative zu Pandas, die für ein bewegliches Fenster rollen

Bei der technischen Analyse von Zeitreihendaten ist es üblich, das Fenster auf Mittelwert zu verschieben und die Maximal- und Minimalwerte zu ermitteln. Mit Pandas können Sie einfach schreiben, indem Sie das Verschiebefenster mit Rollen angeben und die Methoden mean, max, min verwenden. Dieser Artikel ist eine Notiz, als ich nach einem schnelleren Weg als Pandas suchte.

Verwenden Sie Pandas rollen

Erstellen Sie zunächst eine Zeitreihe von Zufallszahlen mit numpy array und pandas Series, wie unten gezeigt.

import numpy as np
import pandas as pd
a = np.random.randint(100, size=100000)
s = pd.Series(a)

Der Durchschnitt im gleitenden Fenster (sogenannter einfacher gleitender Durchschnitt) kann unter Verwendung der mittleren Methode zum Rollen wie folgt geschrieben werden.

period=10 #Zeitraum
%timeit smean = s.rolling(period).mean()

Ausführungszeit

100 loops, best of 3: 5.47 ms per loop

war. Als nächstes werden die Maximal- und Minimalwerte im Verschiebefenster angezeigt.

%timeit smax = s.rolling(period).max()
%timeit smin = s.rolling(period).min()
100 loops, best of 3: 5.51 ms per loop
100 loops, best of 3: 5.53 ms per loop

Die Ausführungszeit entspricht fast dem gleitenden Durchschnitt.

Verwenden Sie die Filterfunktion von scipy

Da der gleitende Durchschnitt ein sogenannter FIR-Filter ist, können Sie die Filterfunktion von scipy verwenden.

from scipy.signal import lfilter
%timeit amean = lfilter(np.ones(period)/period, 1, a)

Berechnen Sie als FIR-Filter, wobei alle Gewichte auf 1 / Periode eingestellt sind. Ausführungszeit

1000 loops, best of 3: 980 µs per loop

ist geworden. Es ist mehr als fünfmal schneller als Pandas. Wie erwartet ist es scipy.

Jetzt möchte ich die Maximal- und Minimalwerte finden, aber dafür gibt es keine perfekte Funktion, und die, die als verwendbar erscheint, ist order_filter. Es war eine scipy.signal.order_filter.html) Funktion. Diese Funktion gibt nacheinander den Wert des angegebenen Ranges im angegebenen Fenster zurück. Geben Sie das Maskenarray des Fensters in der Argumentdomäne und den Rang im Argumentrang an. Da das Zielfenster jedoch auf Zeitreihenabtastungen zentriert ist, setzen Sie 1 nur in die erste Hälfte des Arrays. Für den Minimalwert ist Rang = 0 und für den Maximalwert Rang = Periode-1.

from scipy.signal import order_filter
domain = np.concatenate((np.ones(period), np.zeros(period-1)))
%timeit amax = order_filter(a, domain, period-1)
%timeit amin = order_filter(a, domain, 0)

Das Ausführungsergebnis ist wie folgt.

10 loops, best of 3: 102 ms per loop
10 loops, best of 3: 102 ms per loop

Diesmal ist es fast 20 Mal langsamer als Pandas. Sogar die Scipy-Funktion funktionierte nicht. Schließlich liegt es wahrscheinlich daran, dass es jedes Mal so sortiert wird, dass es willkürlich eingestuft werden kann. Wenn Sie die Maximal- und Minimalwerte ermitteln möchten, sollten Sie eine spezielle Funktion verwenden.

Recommended Posts

Ein Hinweis bei der Suche nach einer Alternative zu Pandas, die für ein bewegliches Fenster rollen
Python Hinweis: Wenn Sie einer Zeichenfolge einen Wert zuweisen
Beachten Sie beim Initialisieren einer Liste in Python
Wenn Sie in der for-Anweisung plt.save möchten
Erstellt eine Methode zur automatischen Auswahl und Visualisierung eines geeigneten Diagramms für Pandas DataFrame
Suchen Sie nach einer Datenfestplatte, die an Azure VM 3000 ri angeschlossen ist?
[Python] Hinweise beim Versuch, Numpy mit Cython zu verwenden
Wie erstelle ich ein Python-Paket (geschrieben für Praktikanten)
So ersetzen Sie eine Teilübereinstimmung durch einen numerischen Wert (Anmerkung 1)
[Python] So geben Sie eine Pandas-Tabelle in eine Excel-Datei aus
Ein Hinweis, wenn ich das Jupyter-Notizbuch unter Windows nicht öffnen kann
So fügen Sie eine CSV-Datei mit Pandas in eine Excel-Datei ein
Zu beachtende Punkte, wenn Pandas CSV der Excel-Ausgabe lesen
Eine Geschichte über den Versuch, einen Chot zu automatisieren, wenn Sie selbst kochen
Ein Hinweis, von dem ich süchtig war, als ich unter Linux einen Piepton machte
Atom: Hinweis zum Einrückungsfehler beim Kopieren des Python-Skripts in die Shell
[Hinweis] Zu überprüfende Punkte, wenn in pyenv eine Endlosschleife auftritt
Ein Hinweis, dem ich beim Erstellen einer Tabelle mit SQL Alchemy verfallen war
Hinweise zur Verwendung der Tab-Vervollständigung beim interaktiven Ausführen von Python unter Windows