Numpy-Version des exponentiellen gewichteten gleitenden Durchschnitts, äquivalent zu pandas.ewm (). mean ()

8

Wie man den exponentiellen gewichteten gleitenden Durchschnitt in numpy erhält, genau wie in pandas :

%Vor%

hat Folgendes mit numpy

versucht %Vor%

aber die Ergebnisse sind nicht ähnlich wie die in Pandas.

Gibt es vielleicht einen besseren Ansatz, um den exponentiell gewichteten gleitenden Durchschnitt direkt in numpy zu berechnen und das exakt gleiche Ergebnis zu erhalten wie das pandas.ewm().mean() ?

Bei 60.000 Anfragen auf Pandas-Lösung bekomme ich ungefähr 230 Sekunden. Ich bin mir sicher, dass dies bei einer reinen Anzahl deutlich reduziert werden kann.

    
RaduS 18.03.2017, 01:36
quelle

6 Antworten

12

Denken Sie, ich habe es endlich geknackt!

Hier ist eine vektorisierte Version von numpy_ewma function, von der behauptet wird, dass sie die korrekten Ergebnisse von @RaduS's post - %Vor%

Weitere Steigerung

Wir können es mit etwas Code-Wiederverwendung weiter verstärken, so wie -

%Vor%

Laufzeittest

Lassen Sie uns diese beiden gegen die gleiche loopy-Funktion für einen großen Datensatz Zeit.

%Vor%

Um 17x Beschleunigung dort!

    
Divakar 21.03.2017, 11:48
quelle
7

Hier ist eine Implementierung mit numpy, die der Verwendung von df.ewm(alpha=alpha).mean() entspricht. Nach dem Lesen der Dokumentation sind es nur ein paar Matrixoperationen. Der Trick besteht darin, die richtigen Matrizen zu konstruieren.

Es ist erwähnenswert, dass Sie, weil wir Float-Matrizen erstellen, schnell durch Ihren Speicher fressen können, wenn das Eingabe-Array zu groß ist.

%Vor%

Lass es uns testen:

%Vor%     
James 20.03.2017 13:44
quelle
4

Gegeben alpha und windowSize , hier ist ein Ansatz, um das entsprechende Verhalten auf NumPy zu simulieren -

%Vor%

Beispiel läuft zur Verifizierung -

%Vor%

Laufzeittest auf größerem Dataset -

%Vor%

Weitere Steigerung

Für eine weitere Leistungssteigerung könnten wir die Initialisierung mit NaNs vermeiden und stattdessen das von np.convolve ausgegebene Array verwenden, so wie -

%Vor%

Zeiten -

%Vor%     
Divakar 20.03.2017 20:02
quelle
3

@ Divakars Antwort scheint einen Überlauf zu verursachen, wenn es um

geht %Vor%

Was ich benutzt habe ist:

%Vor%

Dies ist jedoch viel langsamer als die Panda-Lösung:

%Vor%     
Danny 26.07.2017 09:13
quelle
2

Diese Antwort scheint irrelevant zu sein. Aber für diejenigen, die auch die exponentiell gewichtete Varianz (und auch die Standardabweichung) mit numpy berechnen müssen, ist die folgende Lösung nützlich:

%Vor%     
Samuel Utomo 18.03.2018 03:14
quelle
2

Hier ist eine andere Lösung, die ich in der Zwischenzeit gefunden habe, sie ist etwa 4 mal schneller als die Pandas-Lösung.

%Vor%

Ich habe diese Formel als Ausgangspunkt verwendet. Ich bin mir sicher, dass dies noch mehr verbessert werden kann, aber es ist zumindest ein Ausgangspunkt

    
RaduS 20.03.2017 22:43
quelle