【问题标题】:Pandas add column based on grouped by rolling average熊猫根据滚动平均值添加列
【发布时间】:2018-01-09 12:41:23
【问题描述】:

按日期分组时,我已经成功地使用转换添加了一个新的总体积列,如下所示:

 df

 Name   Date        Volume
 --------------------------
 APL    12-01-2017   1102
 BSC    12-01-2017   4500
 CDF    12-02-2017   5455

 df['vol_all_daily'] = df['Volume'].groupby([df['Date']]).transform('sum')

 Name   Date        Volume   vol_all_daily
 ------------------------------------------
 APL    12-01-2017   1102     5602
 BSC    12-01-2017   4500     5602
 CDF    12-02-2017   5455     5455

但是,当我想取滚动平均值时,它不起作用!

df['vol_all_ma_2']=df['vol_all_daily'].
groupby([df['Date']]).rolling(window=2).mean()

返回一个 DataGroupBy ,它给出错误 * 并且变得太难放回 df 列。

 df['vol_all_ma_2'] = 
 df['vol_all_daily'].groupby([df['Date']]).transform('mean').
 rolling(window=2).mean()

这只会产生与 vol_all_daily 列几乎相同的结果

更新:

我没有在每个日期只取一列..上面的代码仍然需要多个日期...相反,我将 .first() 添加到 groupby..不确定为什么 groupby 没有每个日期取一行.

【问题讨论】:

  • 请注意上面代码中的错误,其中您引用了未定义的res(也未定义df)。请参阅minimal example
  • 已修复...谢谢

标签: pandas dataframe group-by


【解决方案1】:

您所写内容的行为似乎是正确的(下面的第 1 部分),但也许您想称呼不同的东西(下面的第 2 部分)。

第 1 部分:为什么您所写的内容表现正确

d = {'Name':['APL', 'BSC', 'CDF'],'Date':pd.DatetimeIndex(['2017-12-01', '2017-12-01', '2017-12-02']),'Volume':[1102,4500,5455]}
df = pd.DataFrame(d)
df['vol_all_daily'] = df['Volume'].groupby([df['Date']]).transform('sum')
print(df)
rolling_vol = df['vol_all_daily'].groupby([df['Date']]).rolling(window=2).mean()
print('')
print(rolling_vol)

我得到输出:

          Date Name  Volume  vol_all_daily
0 2017-12-01  APL    1102           5602
1 2017-12-01  BSC    4500           5602
2 2017-12-02  CDF    5455           5455

Date         
2017-12-01  0       NaN
            1    5602.0
2017-12-02  2       NaN
Name: vol_all_daily, dtype: float64

要了解为什么这个结果rolling_vol 是正确的,请注意您首先调用了groupby,并且仅在调用rolling 之后之后。那不应该产生符合df的东西。

第 2 部分:我认为您想要调用的内容(只是一个滚动平均值)

如果你改为运行:

# same as above but without groupby
rolling_vol2 = df['vol_all_daily'].rolling(window=2).mean()
print('')
print(rolling_vol2)

你应该得到:

0       NaN
1    5602.0
2    5528.5
Name: vol_all_daily, dtype: float64

这看起来更像您想要的滚动平均值。为了解释这一点,我建议阅读pandas resampling vs rolling 的详细信息。

【讨论】:

  • 这部分我遇到了麻烦。您制作的测试数据有效,但我的实际 df 没有......我的 rolling_vol 产生与“vol_all_daily”相同的结果。我不知道这是某种索引问题还是我忽略了某些东西..当我输入 df.index 我只是得到 Int64Index([1,2....)..总和结果是完美的。
  • 好吧,我已经更正了..我不想要两种解决方案(1 和 2)..我确实想要按日期分组的滚动平均值...我将重写我的问题以扩展您的测试数据。
猜你喜欢
  • 2018-04-26
  • 2019-07-27
  • 2019-02-13
  • 2017-09-12
  • 2017-08-03
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多