Im Gegensatz zu Numpy scheinen Pandas keine Speicherschritte zu mögen

8

Pandas scheint eine R-style Rollfunktion auf Matrizenebene ( rollapply(..., by.column = FALSE) ) zu verpassen, die nur die vektorbasierte Version liefert. Also habe ich versucht, dieser Frage zu folgen und es funktioniert wunderbar mit Das Beispiel, das repliziert werden kann, funktioniert aber nicht mit Pandas DataFrame s, selbst wenn das (scheinbar identische) zugrunde liegende Numpy-Array verwendet wird.

Künstliche Problemreplikation:

%Vor%

mm und pp sehen identisch aus:

Die direkt überzählige Matrix gibt mir das, was ich will:

%Vor%

Das heißt, es gibt mir 3 Schritte von je 3 Zeilen in einer 3D-Matrix, die es mir erlauben, Berechnungen an einer Submatrix durchzuführen, die sich jeweils um eine Zeile nach unten bewegt.

Aber die pandas-abgeleitete Version (identischer Aufruf mit mm ersetzt durch pp ):

%Vor%

ist alles komisch, als wäre es irgendwie transponiert. Hat das mit Spalten / Zeilen-Befehlen zu tun?

Ich muss matrixschiebbare Fenster in Pandas machen, und das scheint meine beste Einstellung zu sein, besonders weil es sehr schnell ist. Was ist denn hier los? Wie bekomme ich das zugrundeliegende Pandas-Array, um sich wie Numpy zu verhalten?

    
Thomas Browne 16.04.2015, 11:31
quelle

2 Antworten

12

Es scheint, dass die .values die zugrunde liegenden Daten in Fortran-Reihenfolge zurückgibt (wie Sie spekulierten):

%Vor%

Dies verwirrt as_strided , das erwartet, dass die Daten in C-Reihenfolge im Speicher angeordnet werden.

Um Dinge zu beheben, könnten Sie die Daten in C-Reihenfolge kopieren und die gleichen Schritte wie in Ihrer Frage verwenden:

%Vor%

Wenn Sie das Kopieren großer Datenmengen vermeiden möchten, passen Sie alternativ die Schritte so an, dass das Layout der Spaltenreihenfolge der Daten bestätigt wird:

%Vor%     
Alex Riley 16.04.2015, 12:11
quelle
4
  

Hat das etwas mit der Reihenfolge der Spalten / Zeilen zu tun?

Ja, siehe mm.strides und pp.strides .

  

Wie bekomme ich das zugrunde liegende Pandas-Array wie Numpy?

Das Numpy-Array mm ist "C-zusammenhängend" und deshalb funktioniert der Schritt-Trick. Wenn Sie den exakt gleichen Code für das dem Datenrahmen zugrunde liegende Array aufrufen möchten, können Sie np.ascontiguousarray zuerst verwenden. Oder es wäre besser, die Datenfensterung zu schreiben, während das Array strides und itemsize berücksichtigt wird.

    
user2379410 16.04.2015 12:09
quelle