我在按日期分组时使用转换成功添加了一个新的求和音量列,如下所示:
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不占用一行每个日期。
答案 0 :(得分: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的详细信息。