Pandas groupby结合rolling均值+reset_index返回NaN问题求解
问题原因
- 分组键选择错误:你当前使用
Sessions作为分组字段,从样例数据可以看到该字段是全局自增的唯一值,每个分组下仅包含1条数据,完全无法满足rolling(20)所需的最少20条数据的计算要求,因此返回全空值。 - 业务逻辑不符合:滚动均值需要按不同标的(
Symbol字段)分别计算,同一个标的的历史数据归为一组才符合需求,按Sessions分组的逻辑本身就不匹配你的计算目标。 - 索引对齐问题:即使分组正确,你当前的写法也可能因为分组后的索引和原DataFrame索引不匹配导致赋值异常。
解决方法
将分组键替换为Symbol,同时确保分组内数据按时间排序,再进行滚动计算,参考代码如下:
# 先按标的分组,每组内部按时间排序后计算20日滚动DR均值 df_day['ADR'] = df_day.groupby('Symbol', group_keys=False).apply( lambda x: x.sort_values('Time')['DR'].rolling(20).mean() )
如果你已经能保证原数据里每个Symbol下的行已经按时间升序排列,可以简化为:
df_day['ADR'] = df_day.groupby('Symbol')['DR'].rolling(20).mean().reset_index(0, drop=True)
内容的提问来源于stack exchange,提问作者Trippy Dippy
相关产品推荐
相关产品推荐

