2017-03-29 5 views
3

Ich habe eine rollende Summe, die auf einem gruppierten Datenrahmen berechnet wird, aber es summiert sich falsch, es ist eine Summe der Zukunft, wenn ich eine Summe der Vergangenheit brauche.Wie man die rollende Summe umkehrt?

Was mache ich hier falsch?

ich die Daten und sortieren nach Dimension und Datum importieren (Ich habe versucht, Art bereits das Datum zu entfernen)

df = pd.read_csv('Input.csv', parse_dates=True) 
df.sort_values(['Dimension','Date']) 
print(df) 

ich dann eine neue Spalte erstellen, das ein Multi-Index durch Walzen Fenster

gruppiert ist
new_column = df.groupby('Dimension').Value1.apply(lambda x: 
x.rolling(window=3).sum()) 

ich setzen Sie den Index dann das gleiche wie das Original

df['Sum_Value1'] = new_column.reset_index(level=0, drop=True) 
print(df) 

I h zu sein Ich habe auch versucht, den Index vor der Berechnung umzukehren, aber das ist auch fehlgeschlagen.

Eingang

Dimension,Date,Value1,Value2 
1,4/30/2002,10,20 
1,1/31/2002,10,20 
1,10/31/2001,10,20 
1,7/31/2001,10,20 
1,4/30/2001,10,20 
1,1/31/2001,10,20 
1,10/31/2000,10,20 
2,4/30/2002,10,20 
2,1/31/2002,10,20 
2,10/31/2001,10,20 
2,7/31/2001,10,20 
2,4/30/2001,10,20 
2,1/31/2001,10,20 
2,10/31/2000,10,20 
3,4/30/2002,10,20 
3,1/31/2002,10,20 
3,10/31/2001,10,20 
3,7/31/2001,10,20 
3,1/31/2001,10,20 
3,10/31/2000,10,20 

Ausgang:

Dimension  Date Value1 Value2 Sum_Value1 
0   1 4/30/2002  10  20   NaN 
1   1 1/31/2002  10  20   NaN 
2   1 10/31/2001  10  20  30.0 
3   1 7/31/2001  10  20  30.0 
4   1 4/30/2001  10  20  30.0 
5   1 1/31/2001  10  20  30.0 
6   1 10/31/2000  10  20  30.0 
7   2 4/30/2002  10  20   NaN 
8   2 1/31/2002  10  20   NaN 
9   2 10/31/2001  10  20  30.0 
10   2 7/31/2001  10  20  30.0 
11   2 4/30/2001  10  20  30.0 
12   2 1/31/2001  10  20  30.0 
13   2 10/31/2000  10  20  30.0 

Tor Ausgang:

Dimension  Date Value1 Value2 Sum_Value1 
0   1 4/30/2002  10  20  30.0 
1   1 1/31/2002  10  20  30.0 
2   1 10/31/2001  10  20  30.0 
3   1 7/31/2001  10  20  30.0 
4   1 4/30/2001  10  20  30.0 
5   1 1/31/2001  10  20   NaN 
6   1 10/31/2000  10  20   NaN 
7   2 4/30/2002  10  20  30.0 
8   2 1/31/2002  10  20  30.0 
9   2 10/31/2001  10  20  30.0 
10   2 7/31/2001  10  20  30.0 
11   2 4/30/2001  10  20  30.0 
12   2 1/31/2001  10  20   Nan 
13   2 10/31/2000  10  20   NaN 

Antwort

3

Sie benötigen einen Rückwärts Summe, also umkehren Ihre Serie vor Summe es rollen:

lambda x: x[::-1].rolling(window=3).sum() 
1

Sie das Ergebnis durch window-1 verschieben kann die linksbündig Ergebnisse zu erhalten:

enter image description here

+0

Ich denke, dass Sie durch konstante Werte in OP Beispiel irregeführt werden, aber die Notwendigkeit ist, eine umgekehrte Summe zu machen – Boud

+0

@Boud habe ich diesen Teil übersehen. Aber ich denke, das gibt immer noch das richtige Ergebnis :). Wie auch immer, die Vergangenheit oder Zukunft hier ist nur, wo Sie die Summe Ergebnisse, wenn die Daten nach Datum sortiert sind. Oder vielleicht OP muss nur den Datenrahmen nach Datum in aufsteigender Reihenfolge zunächst sortieren. – Psidom

+1

Sneaky @Boud betrogen und lesen Sie die "Worte" in OP Post/shakes_head – piRSquared

0

Zurückrollen die gleiche vorwärts wie Walzen und dann verschiebt das Ergebnis:

x.rolling(window=3).sum().shift(-2)