Schneller Weg, um Ausreißer nach Gruppe in großen Pandas DataFrame zu entfernen

9

Ich habe ein relativ großes DataFrame-Objekt (ungefähr eine Million Zeilen, Hunderte von Spalten), und ich möchte Ausreißer in jeder Spalte nach Gruppe ausschneiden. Mit "Clip-Ausreißer für jede Spalte nach Gruppe" meine ich - berechne die 5% - und 95% -Quantile für jede Spalte in einer Gruppe und trenne Werte außerhalb dieses Quantilbereichs.

Hier ist das Setup, das ich gerade verwende:

%Vor%

und dann, mit meinem DataFrame namens features und indiziert von DATE , kann ich

machen %Vor%

Dies funktioniert, außer dass es sehr langsam ist, vermutlich aufgrund der verschachtelten Aufrufe von apply : eins für jede Gruppe und dann eins für jede Spalte in jeder Gruppe. Ich versuchte, die zweite apply loszuwerden, indem ich Quantile für alle Spalten gleichzeitig berechnete, aber ich blieb stecken und versuchte, jede Spalte mit einem anderen Wert zu schwellen. Gibt es einen schnelleren Weg, um dieses Verfahren durchzuführen?

    
Y T 11.12.2014, 13:37
quelle

3 Antworten

7

In scipy.stats gibt es eine Winsorize-Funktion .mstats , die Sie möglicherweise verwenden möchten. Beachten Sie jedoch, dass es geringfügig andere Werte als winsorize_series zurückgibt:

%Vor%

Die Verwendung von mstats.winsorize anstelle von winsorize_series ist vielleicht (abhängig von N, M, P) ~ 1.5x schneller:

%Vor% %Vor%     
unutbu 11.12.2014 15:13
quelle
1

Ich habe einen ziemlich einfachen Weg gefunden, dies zu erreichen, indem ich die Transformationsmethode in Pandas benutze.

%Vor%     
mwolverine 06.09.2017 17:05
quelle
0

Eine gute Möglichkeit, dies zu erreichen, ist die Vektorisierung. Und dafür liebe ich np.where .

%Vor%

Zum Vergleich habe ich die Funktion von scipy in eine Funktion eingepackt:

%Vor%

Aber wie Sie sehen können, obwohl meine Funktion ziemlich schnell ist, ist sie immer noch weit von der Scipy-Implementierung entfernt:

%Vor%

Wenn Sie mehr über die Beschleunigung von Pandas-Code lesen möchten, würde ich vorschlagen, Optimierung Pandas für die Geschwindigkeit und Von Python zu Numpy .

    
HonzaB 19.12.2017 18:20
quelle

Tags und Links