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.
Denken Sie, ich habe es endlich geknackt!
Hier ist eine vektorisierte Version von Weitere Steigerung Wir können es mit etwas Code-Wiederverwendung weiter verstärken, so wie - Laufzeittest Lassen Sie uns diese beiden gegen die gleiche loopy-Funktion für einen großen Datensatz Zeit. Um numpy_ewma
function, von der behauptet wird, dass sie die korrekten Ergebnisse von @RaduS's post
- 17x
Beschleunigung dort!
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% Gegeben alpha
und windowSize
, hier ist ein Ansatz, um das entsprechende Verhalten auf NumPy zu simulieren -
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 -
Zeiten -
%Vor%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%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
Tags und Links python performance numpy pandas vectorization