繁体   English   中英

具有 inf 值的 Python 中的滚动平均值

[英]Rolling Average in Python with inf values

我正在尝试匹配这个最终的 output,计算 Count 的移动平均值 (3),

预计 Output

     Classification     Name     Count     MA3
0    Fruits             Apple    inf       NaN
1    Fruits             Apple    inf       NaN
2    Fruits             Apple    inf       NaN
3    Fruits             Apple    inf       NaN
4    Fruits             Apple    5.0       5.0
5    Fruits             Apple    6.0       6.5
6    Fruits             Apple    7.0       6.0
7    Fruits             Apple    8.0       7.0
8    Veg                Broc     10.0      NaN
9    Veg                Broc     11.0      NaN
10   Veg                Broc     12.0      11.0

但是 python.rolling 代码没有考虑到 inf 值,有什么解决方法吗?

df['MA3'] = df.groupby(['Classification', 'Name'])['Count'].transform(lambda x: x.rolling(3,3).mean())

当前Output

     Classification     Name     Count     MA3
0    Fruits             Apple    inf       NaN
1    Fruits             Apple    inf       NaN
2    Fruits             Apple    inf       NaN
3    Fruits             Apple    inf       NaN
4    Fruits             Apple    5.0       NaN
5    Fruits             Apple    6.0       NaN
6    Fruits             Apple    7.0       6.0
7    Fruits             Apple    8.0       7.0
8    Veg                Broc     10.0      NaN
9    Veg                Broc     11.0      NaN
10   Veg                Broc     12.0      11.0

创建一个序列 S,其中包含将inf替换为nan的计算,并设置 min_periods=1。 然后,为需要修改的行创建一个掩码,即在inf之后的一两个位置的行

df['MA3'] = df.groupby(['Classification', 'Name'])['Count'].transform(lambda x: x.replace(np.inf, np.nan).rolling(3, min_periods=3).mean())
S = df.groupby(['Classification', 'Name'])['Count'].transform(lambda x: x.replace(np.inf, np.nan).rolling(3, min_periods=1).mean())
mask = df['Count'].lt(np.inf) & df['MA3'].isnull() & (df['Count'].shift(1).eq(np.inf) | df['Count'].shift(2).eq(np.inf))
df.loc[mask, 'MA3'] = S.loc[mask]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM