2017-12-19 15 views
3

Ich versuche zu verstehen, wie pandas.rolling_cor tatsächlich Rolling Korrelationen berechnet. Bis jetzt habe ich es immer mit einer Nummer gemacht. Ich bevorzuge Pandas wegen der Geschwindigkeit und der Benutzerfreundlichkeit, aber ich kann nicht die rollende Korrelation wie früher bekommen.Verständnis Rollkorrelation in Pandas

I beginnen mit zwei numy Arrays:

c = np.array([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]) 
d = np.array([8,9,8]) 

ich jetzt der Kreuzkorrelation für die Länge-3-Fenster meiner Array c berechnet werden soll. I definieren eine Rollfensterfunktion:

def rolling_window(a, window): 
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window) 
    strides = a.strides + (a.strides[-1],) 
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides) 

und die Korrelation zwischen jedem meiner erzeugten Fenster und dem zweiten Originaldatensatzes berechnen. Dieser Ansatz funktioniert gut:

for win in rolling_window(c, len(d)): 
    print(np.correlate(win, d)) 

Ausgänge:

[50] 
[75] 
[100] 
[125] 
[150] 
[175] 
[200] 
[209] 
[200] 
[175] 
[150] 
[125] 
[100] 
[75] 
[50] 

Wenn ich es mit Pandas zu lösen versuchen:

a = pd.DataFrame([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]) 
b = pd.DataFrame([8,9,8]) 

egal ob ich Dataframe rolling_corr:

a.rolling(window=3, center=True).corr(b) 

oder Pandas r olling_corr:

pd.rolling_corr(a, b, window=1, center=True) 

bekomme ich nur ein paar NaNs:

 0 
0 NaN 
1 0.0 
2 NaN 
3 NaN 
4 NaN 
5 NaN 
6 NaN 
7 NaN 
8 NaN 
9 NaN 
10 NaN 
11 NaN 
12 NaN 
13 NaN 
14 NaN 
15 NaN 
16 NaN 

Kann mir jemand eine Hand geben? Ich bin in der Lage, das Problem mit numpy zu lösen, indem die numpy Array aus Umwandeln der Pandas Dataframe

a.values.ravel() 

jedoch erhalten Abflachung, würde Ich mag die Berechnung vollständig mit Pandas lösen. Ich habe die Dokumentation durchsucht, habe aber nicht die Antwort gefunden, nach der ich suche. Was vermisse ich oder nicht?

Vielen Dank im Voraus.

D.

Antwort

2

Die Berechnung Sie versuchen können als Betriebs auf den folgenden Datenrahmen gedacht zu tun werden:

pd.concat([a, b], axis=1) 
0 0 
0 1 8 
1 2 9 
2 3 8 
3 4 NaN 
4 5 NaN 
5 6 NaN 
6 7 NaN 
7 8 NaN 
8 9 NaN 
9 8 NaN 
10 7 NaN 
11 6 NaN 
12 5 NaN 
13 4 NaN 
14 3 NaN 
15 2 NaN 
16 1 NaN 

Wenn Sie Fenster = 3 verwendet sind, es korreliert die ersten drei Werte in b mit den ersten 3 Werten in a, den Rest mit NaN belassen und den Wert in der Mitte des Fensters platzieren (Mitte = True).

können Sie versuchen:

pd.rolling_apply(a, window=3, func=lambda x: np.correlate(x, b[0])) 

Ausgang:

 0 
0 NaN 
1 NaN 
2 50 
3 75 
4 100 
5 125 
6 150 
7 175 
8 200 
9 209 
10 200 
11 175 
12 150 
13 125 
14 100 
15 75 
16 50 

Sie können Zentrum = True auch hier hinzufügen, wenn Sie möchten.

(Ich benutze Pandas 0.17.0)

+0

Vielen Dank, mein Herr – mosegui