2017-04-16 81 views
8

我有一個像這樣從CSV導入的數據框。特定列上的熊貓滾動平均值

   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 
...    ... ... 

我想添加一個新列MA來計算列彈出的滾動平均值。我嘗試以下

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

我得到一個錯誤

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

所以我想,讓我試試,如果它只是工作沒有添加一列。我用

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

我得到的輸出

   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 
...    ... ... 

我似乎無法申請滾落在立柱彈出意思。我究竟做錯了什麼?

+0

僅給出這個 >>> data.rolling(5,on ='pop') Rolling [window = 5,center = False,axis = 0,on = pop] – Anti21

+0

您在標題之間有一個換行符'日期'和'流行'和'股票'。 'list(df)'的結果是什麼? – Chuck

+0

使用此數據['pop']。rolling(5).mean()'... –

回答

12

要指定一列,你可以創建一個滾動對象根據您的Series

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

答案張貼ac2001不是執行此操作的最高性能方式。他正在計算數據框中每列的滾動平均值,然後使用「彈出」列分配「ma」列。下面的第一種方法是更有效:

%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 

,除非你需要計算的滾動裝置存儲系統中所有其他列我不會建議使用第二種方法。

2

此解決方案適用於我。

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

我認爲問題可能是on ='pop'只是改變列從索引執行滾動窗口。

從DOC字符串:「對於一個數據幀,在其列來計算滾動窗口,而不是指數」

+0

非常感謝!This Works! – Anti21

+2

Anit21,值得回顧一下安德魯的答案,因爲它的效率要高很多,最好是創建一個系列,因爲他已經完成了然後計算出該系列的滾動平均值 – ac2001

2

編輯:pd.rolling_mean已被棄用在熊貓和將在以後被移除。相反:使用pd.rolling你可以這樣做:

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

的數據幀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 

要獲取:

  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 

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

老:雖然它已被棄用你可以使用:

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

獲得:

  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 

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

+0

這也很好用!非常感謝! – Anti21

+0

@ Anti21如果它對您有幫助,請不要忘記加入這個答案!(即使您不接受它,您仍然可以提高答案):) – Chuck