2017-04-16 1 views
8

Ich habe einen Datenrahmen wie dieser, der aus einer CSV importiert wird.Rolling Mean auf Pandas auf einer bestimmten Spalte

   stock pop 
Date 
2016-01-04 325.316 82 
2016-01-11 320.036 83 
2016-01-18 299.169 79 
2016-01-25 296.579 84 
2016-02-01 295.334 82 
2016-02-08 309.777 81 
2016-02-15 317.397 75 
2016-02-22 328.005 80 
2016-02-29 315.504 81 
2016-03-07 328.802 81 
2016-03-14 339.559 86 
2016-03-21 352.160 82 
2016-03-28 348.773 84 
2016-04-04 346.482 83 
2016-04-11 346.980 80 
2016-04-18 357.140 75 
2016-04-25 357.439 77 
2016-05-02 356.443 78 
2016-05-09 365.158 78 
2016-05-16 352.160 72 
2016-05-23 344.540 74 
2016-05-30 354.998 81 
2016-06-06 347.428 77 
2016-06-13 341.053 78 
2016-06-20 363.515 80 
2016-06-27 349.669 80 
2016-07-04 371.583 82 
2016-07-11 358.335 81 
2016-07-18 362.021 79 
2016-07-25 368.844 77 
...    ... ... 

Ich wollte eine neue Spalte MA hinzufügen, die Rolling Mean für die Spalte Pop berechnet. Ich habe versucht, die folgenden

df['MA']=data.rolling(5,on='pop').mean() 

ich einen Fehler

ValueError: Wrong number of items passed 2, placement implies 1 

Also dachte ich bekommen lassen Sie mich versuchen, ob es funktioniert nur ohne Hinzufügen einer Spalte. Ich benutzte

data.rolling(5,on='pop').mean() 

Ich habe die Ausgabe

   stock pop 
Date 
2016-01-04  NaN 82 
2016-01-11  NaN 83 
2016-01-18  NaN 79 
2016-01-25  NaN 84 
2016-02-01 307.2868 82 
2016-02-08 304.1790 81 
2016-02-15 303.6512 75 
2016-02-22 309.4184 80 
2016-02-29 313.2034 81 
2016-03-07 319.8970 81 
2016-03-14 325.8534 86 
2016-03-21 332.8060 82 
2016-03-28 336.9596 84 
2016-04-04 343.1552 83 
2016-04-11 346.7908 80 
2016-04-18 350.3070 75 
2016-04-25 351.3628 77 
2016-05-02 352.8968 78 
2016-05-09 356.6320 78 
2016-05-16 357.6680 72 
2016-05-23 355.1480 74 
2016-05-30 354.6598 81 
2016-06-06 352.8568 77 
2016-06-13 348.0358 78 
2016-06-20 350.3068 80 
2016-06-27 351.3326 80 
2016-07-04 354.6496 82 
2016-07-11 356.8310 81 
2016-07-18 361.0246 79 
2016-07-25 362.0904 77 
...    ... ... 

ich nicht anwenden bedeuten Rollen auf der Säule Pop scheinen kann. Was mache ich falsch?

+0

Gibt dieses nur >>> data.rolling (5, on = 'pop') Rollen [Fenster = 5, Mitte = False, Achse = 0, on = pop] – Anti21

+0

Sie einen Zeilenumbruch zwischen den Titel haben "date" und "pop" und "stock". Was sind die Ergebnisse von 'list (df)'? – Chuck

+0

Verwenden Sie diese- 'Daten ['Pop']. Rolling (5) .mean()' ... –

Antwort

12

eine Spalte zuordnen, können Sie ein Roll Objekt auf der Grundlage Ihrer Series erstellen:

df['new_col'] = data['column'].rolling(5).mean() 

Die Antwort gepostet von ac2001 ist nicht der performanteste Weg, dies zu tun. Er berechnet einen rollenden Mittelwert für jede Spalte im Datenrahmen und weist dann die Spalte "ma" mit der Spalte "pop" an. Die erste Methode der folgenden ist viel effizienter:

%timeit df['ma'] = data['pop'].rolling(5).mean() 
%timeit df['ma_2'] = data.rolling(5).mean()['pop'] 

1000 loops, best of 3: 497 µs per loop 
100 loops, best of 3: 2.6 ms per loop 

Ich würde nicht empfehlen, die zweite Methode verwenden, wenn Sie auf allen anderen Spalten Rollmittel berechnet speichern müssen.

2

Diese Lösung funktionierte für mich.

Ich denke, das Problem kann sein, dass die on = 'pop' nur die Spalte ändert, um das Rolling-Fenster aus dem Index zu führen.

Vom doc string:

+0

Vielen Dank! Das funktioniert! – Anti21

+2

Anit21, es lohnt sich, Andrews Antwort unten zu überprüfen, da es viel effizienter ist.Es ist besser, eine Serie zu erstellen, wie er es getan hat und dann berechnen Sie die rollende Mittelwert auf nur diese Serie. – ac2001

2

Edit „Für einen Datenrahmen, Säule, auf der das Rollfenster, anstatt den Index berechnen“: pd.rolling_mean wird in Pandas veraltet und wird in Zukunft entfernt werden. Stattdessen: pd.rolling Verwendung können Sie tun:

df['MA'] = df['pop'].rolling(window=5,center=False).mean() 

für einen Datenrahmen df:

  Date stock pop 
0 2016-01-04 325.316 82 
1 2016-01-11 320.036 83 
2 2016-01-18 299.169 79 
3 2016-01-25 296.579 84 
4 2016-02-01 295.334 82 
5 2016-02-08 309.777 81 
6 2016-02-15 317.397 75 
7 2016-02-22 328.005 80 
8 2016-02-29 315.504 81 
9 2016-03-07 328.802 81 

Um:

  Date stock pop MA 
0 2016-01-04 325.316 82 NaN 
1 2016-01-11 320.036 83 NaN 
2 2016-01-18 299.169 79 NaN 
3 2016-01-25 296.579 84 NaN 
4 2016-02-01 295.334 82 82.0 
5 2016-02-08 309.777 81 81.8 
6 2016-02-15 317.397 75 80.2 
7 2016-02-22 328.005 80 80.4 
8 2016-02-29 315.504 81 79.8 
9 2016-03-07 328.802 81 79.6 

Dokumentation: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html

Alt: Obwohl es ist veraltet Sie können verwenden:

df['MA']=pd.rolling_mean(df['pop'], window=5) 

erhalten:

  Date stock pop MA 
0 2016-01-04 325.316 82 NaN 
1 2016-01-11 320.036 83 NaN 
2 2016-01-18 299.169 79 NaN 
3 2016-01-25 296.579 84 NaN 
4 2016-02-01 295.334 82 82.0 
5 2016-02-08 309.777 81 81.8 
6 2016-02-15 317.397 75 80.2 
7 2016-02-22 328.005 80 80.4 
8 2016-02-29 315.504 81 79.8 
9 2016-03-07 328.802 81 79.6 

Dokumentation: http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.rolling_mean.html

+0

Dies funktioniert auch super! Vielen Dank! – Anti21

+0

@ Anti21 Vergessen Sie nicht, diese Antwort zu verbessern, wenn es Ihnen geholfen hat! (Sie können noch Antworten aufwerten, auch wenn Sie sie nicht akzeptieren) :) – Chuck

Verwandte Themen