Filtern von Pandas oder numpy Arrays für kontinuierliche Serien mit minimaler Fensterlänge

8

Ich möchte ein numpy array (oder pandas DataFrame ) so filtern, dass nur fortlaufende Serien desselben Werts mit mindestens window_size length beibehalten und alles andere auf 0 gesetzt wird .

Zum Beispiel:

%Vor%

sollte bei Verwendung einer Fenstergröße von 4

werden %Vor%

Ich habe versucht, rolling_apply und scipy.ndimage.filtes.gerneric_filter zu verwenden, aber aufgrund der Art der Rolling Kernel-Funktionen denke ich nicht, dass es der richtige Ansatz hier ist (und ich bin im Moment dran).

>

Ich setze meinen Versuch trotzdem hier ein:

%Vor%     
pho 05.01.2016, 16:24
quelle

5 Antworten

6

Das ist im Grunde ein image closing operation in image-processing für einen 1D-Fall. Solche Operationen könnten mit Faltungsverfahren implementiert werden. Nun, NumPy does support 1D convolution , also haben wir Glück! Also, um unseren Fall zu lösen, wäre es so etwas -

%Vor%

Beispiellauf -

%Vor%

Laufzeittests -

In diesem Abschnitt werden einige andere Ansätze aufgeführt, um die gestellte Frage zu lösen. Ihre Definitionen sind unten aufgeführt -

%Vor%

Zeiten -

%Vor%     
Divakar 05.01.2016, 20:45
quelle
2

Sie könnten itertools.groupby wie folgt verwenden:

%Vor%

Ausgabe

%Vor%     
gtlambert 05.01.2016 17:18
quelle
2

Hier ist ein Ansatz mit pd.rolling_min und Schritttricks:

%Vor%

Dann haben wir:

%Vor%

Bei großen Arrays ist dieser Ansatz ziemlich schnell (auf meiner Systemgruppe ist er etwa 20 mal langsamer):

%Vor%     
Alex Riley 05.01.2016 18:16
quelle
1

Es könnte sehr wohl eine bessere Lösung geben, aber ich denke, das sollte funktionieren:

%Vor%

Ich habe einige andere Zahlen darin eingefügt, nur für den Fall, dass Sie Code dafür benötigen;

%Vor%

Die erste Zeile teilt das ursprüngliche Array in aufeinanderfolgende Zeichen auf, die zweite Zeile ersetzt jedes Element, das weniger als 4 aufeinanderfolgende Zeichen enthält, mit 0 und die letzte Zeile flacht die Aufteilungsliste ab.

%Vor%

Die erste Zeile der Lösung verwendet auch eine frühere SO-Antwort

    
johnchase 05.01.2016 17:21
quelle
1

Eine kompaktere Variante der itertools.groupby Lösung:

%Vor%     
Stefan 05.01.2016 18:22
quelle