特定列上熊猫的滚动平均值

Posted

技术标签:

【中文标题】特定列上熊猫的滚动平均值【英文标题】:Rolling Mean on pandas on a specific column 【发布时间】:2017-09-12 06:07:39 【问题描述】:

我有一个这样的数据框,它是从 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,它计算列 pop 的滚动平均值。我尝试了以下

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

我似乎无法在弹出列上应用滚动平均值。我做错了什么?

【问题讨论】:

只给出这个 >>> data.rolling(5,on='pop') 滚动 [window=5,center=False,axis=0,on=pop] 标题datepopstock 之间有一个换行符。 list(df) 的结果是什么? 使用这个-data['pop'].rolling(5).mean() ... @CMorris >>> list(data) ['stock', 'pop'] @Anti21 好的,所以Date 是您的索引。看起来你已经成功了 - 不要忘记投票并接受你认为有帮助的任何答案。 【参考方案1】:

这个解决方案对我有用。

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

我认为问题可能在于 on='pop' 只是更改列以从索引执行滚动窗口。

来自文档字符串:“对于 DataFrame,计算滚动窗口的列,而不是索引”

【讨论】:

Anit21,值得在下面查看 Andrew 的答案,因为它的效率要高得多。最好像他一样创建一个系列,然后计算该系列的滚动平均值。【参考方案2】:

编辑:pd.rolling_mean 在 pandas 中已弃用,将来将被删除。相反:使用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

【讨论】:

【参考方案3】:

要分配列,您可以根据您的Series 创建滚动对象:

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

ac2001 发布的答案并不是执行此操作的最高效方式。他正在计算数据框中每一列的滚动平均值,然后他使用“pop”列分配“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

除非您需要在所有其他列上存储计算出的滚动平均值,否则我不建议使用第二种方法。

【讨论】:

如果我想根据其他列的值分别应用滚动平均值怎么办?例如,如果我有一个“类型”列,我想分别计算每种不同类型的运行平均值,即每种类型重置为 0。我实际上有多个列需要注意。

以上是关于特定列上熊猫的滚动平均值的主要内容,如果未能解决你的问题,请参考以下文章

熊猫移动平均线[重复]

熊猫滚动加权平均值

如何在熊猫中获得连续滚动平均值?

熊猫滚动平均值不适用于我的时间数据系列

具有时间偏移熊猫的滚动平均值

如何用滚动平均窗口总结多个熊猫数据框?