Ich wurde motiviert, Pandas rolling
Feature zu verwenden, um eine rollende Multifaktor-Regression (Diese Frage ist NICHT über rollende Multi-Faktor-Regression). Ich erwartete, dass ich apply
nach einem df.rolling(2)
verwenden und das resultierende pd.DataFrame
das NDarray mit .values
extrahieren und die erforderliche Matrixmultiplikation durchführen kann. So hat es nicht geklappt. Hierwarum pandas rolling single-dimension verwenden ndarray
ist das, was ich gefunden habe:
import pandas as pd
import numpy as np
np.random.seed([3,1415])
df = pd.DataFrame(np.random.rand(5, 2).round(2), columns=['A', 'B'])
X = np.random.rand(2, 1).round(2)
Was Objekte tun wie folgt aussehen:
print "\ndf = \n", df
print "\nX = \n", X
print "\ndf.shape =", df.shape, ", X.shape =", X.shape
df =
A B
0 0.44 0.41
1 0.46 0.47
2 0.46 0.02
3 0.85 0.82
4 0.78 0.76
X =
[[ 0.93]
[ 0.83]]
df.shape = (5, 2) , X.shape = (2L, 1L)
Matrixmultiplikation normalerweise verhält:
df.values.dot(X)
array([[ 0.7495],
[ 0.8179],
[ 0.4444],
[ 1.4711],
[ 1.3562]])
Verwendung gelten Zeile für Zeile Punkt auszuführen Produkt verhält sich wie erwartet:
df.apply(lambda x: x.values.dot(X)[0], axis=1)
0 0.7495
1 0.8179
2 0.4444
3 1.4711
4 1.3562
dtype: float64
GROUPBY -> benimmt sich bewerben, wie ich erwarten würde:
df.groupby(level=0).apply(lambda x: x.values.dot(X)[0, 0])
0 0.7495
1 0.8179
2 0.4444
3 1.4711
4 1.3562
dtype: float64
Aber wenn ich laufen:
df.rolling(1).apply(lambda x: x.values.dot(X))
ich:
AttributeError: 'numpy.ndarray' object has no attribute 'values'
Ok, so Pandas ist Verwendung von gerade ndarray
innerhalb seiner rolling
Implementierung. Ich komme damit klar. Statt .values
der Verwendung der ndarray
zu bekommen, lassen Sie uns versuchen:
df.rolling(1).apply(lambda x: x.dot(X))
shapes (1,) and (2,1) not aligned: 1 (dim 0) != 2 (dim 0)
Warten Sie! Was?!
Also habe ich eine benutzerdefinierte Funktion erstellt, um zu sehen, was Rolling tut.
def print_type_sum(x):
print type(x), x.shape
return x.sum()
Dann lief:
print df.rolling(1).apply(print_type_sum)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
A B
0 0.44 0.41
1 0.46 0.47
2 0.46 0.02
3 0.85 0.82
4 0.78 0.76
Mein resultierende pd.DataFrame
das gleiche ist, das ist gut. Aber es hat 10 eindimensionale ndarray
Objekte ausgedruckt. Was ist rolling(2)
print df.rolling(2).apply(print_type_sum)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
A B
0 NaN NaN
1 0.90 0.88
2 0.92 0.49
3 1.31 0.84
4 1.63 1.58
Das Gleiche gilt, erwarten Ausgang aber es gedruckt 8 ndarray
Objekte. rolling
produziert eine einzelne Dimension ndarray
der Länge window
für jede Spalte im Gegensatz zu dem, was ich erwartet, die eine ndarray
der Form (window, len(df.columns))
war.
Frage ist warum?
Ich habe jetzt keine Möglichkeit, eine rollende Multi-Faktor-Regression leicht zu führen.
Dies ist ein [bekanntes Problem] (http: // stackoverflow.com/a/21026837/5276797). Ich habe Jeff kürzlich gefragt, du kannst seine Antwort in den Kommentaren lesen! – IanS
Was ist die aktuelle Lösung von Pandas 0.20? Scheint wie viele Verbesserungen gemacht worden sind. Ist das Ziel in OP erreichbar mit rolling(). Apply() direkt? – Zhang18