拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何计算一列的滚动平均值直到一定数量的行?

如何计算一列的滚动平均值直到一定数量的行?

白鹭 - 2022-02-17 1964 0 0

我有以下资料框:

马匹编号 光栅
25620 112
25620 108
25620 111
25620 98
25620 103
25620 96

我想FGrating根据这些规则计算的滚动平均值

  1. 如果我有 4 场或更多场比赛HorseId,那么我计算最后 4 场比赛的滚动平均值;
  2. 如果我的比赛少于 4 场,那么我会计算到目前为止我参加的比赛的滚动平均值。

平均值应显示在用于计算上述指标的行的下一行。例如:前 4 场比赛的滚动平均值应显示在第 5 行。所以,第一行的正确值为 0

我要找的是这样的表:

马匹编号 光栅 滚动平均
25620 112 0
25620 108 112 (112/1)
25620 111 110 (112 108)/2
25620 98 110.33 (112 108 111)/3
25620 103 107.25 (112 108 111 98)/4
25620 96 105 (108 111 98 103)/4

到目前为止,我得到了过去 4 场比赛的滚动平均值,如下所示:

df.groupby('HorseId')['FGrating'].apply(lambda x: x.shift().expanding(min_periods=no_starts).mean())

但我被其他人困住了。你能帮助我吗?

uj5u.com热心网友回复:

也许尝试使用滚动移位

df['Rolling_Average'] = df.groupby('HorseID')['FGrating']/
    .shift(1).transform(lambda x: x.rolling(4, 1).mean())

滚动创建一个视窗,可用于计算移动平均值,并移位移动行(因此它不会占用实际行)

    HorseID FGrating    Rolling_Average
0   25620   112         NaN
1   25620   108         112.000
2   25620   111         110.000
3   25620   98          110.333
4   25620   103         107.250
5   25620   96          105.000

uj5u.com热心网友回复:

使用rolling_mean

df['Rolling_Average'] = df.groupby('HorseId')['FGrating'].rolling(4, min_periods=1) \
                          .mean().shift(fill_value=0).droplevel(0)
print(df)

# Output:
   HorseId  FGrating            Rolling average  Rolling_Average
0    25620       112                          0              NaN
1    25620       108                112 (112/1)       112.000000
2    25620       111            110 (112 108)/2       110.000000
3    25620        98     110.33 (112 108 111)/3       110.333333
4    25620       103  107.25 (112 108 111 98)/4       107.250000
5    25620        96     105 (108 111 98 103)/4       105.000000
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *