如何使用Pandas滚动平均值而没有保证的观测数量

时间:2017-01-28 18:02:56

标签: python pandas group-by statistics

我正在研究年度化的棒球统计数据,并希望计算一个滚动平均值,回顾过去3年内有关命中数量的表现。但是,我想说明这样一个事实,即当我的数据集回溯超过3年时,一个单一的玩家可能只在联盟中待了1 - 2年,并且不会有3年的观察值,我可以计算滚动平均值。例如:

In[6]: df = pd.DataFrame({'PLAYER_ID': ['A', 'A', 'A', 'B', 'B'], 
                          'HITS': [45, 55, 50, 20, 24]})
In[9]: df
Out[9]: 
  PLAYER_ID  HITS
0         A    45
1         A    55
2         A    50
3         B    20
4         B    24

我如何使用groupby和聚合/转换(或其他一些过程)来计算每个玩家的滚动均值,最大3年历史总数然后只使用最大可用历史观察对于有不到3年历史性能数据的玩家?

非常确定我的答案在于Pandas软件包,但对任何解决方案都感兴趣。

谢谢!

1 个答案:

答案 0 :(得分:1)

pd.DataFrame.rolling会自动为您处理此问题。使用您的示例数据,df.groupby('PLAYER_ID').rolling(1).mean()将为您提供:

             HITS PLAYER_ID
PLAYER_ID
A         0  45.0         A
          1  55.0         A
          2  50.0         A
B         3  20.0         B
          4  24.0         B

对于您的示例案例,我使用的窗口大小仅为1,这意味着我们将每个单独的观察视为自己的意思。这不是特别有趣。使用更多数据,您可以使用更大的窗口大小:例如,如果您的数据是每周一次,rolling(5)会为您提供大约每月的窗口大小(如果您的数据是每天,则为rolling(31),依此类推)

使用此方法时需要注意两个问题:

  1. 如果您的数据未定期抽样(例如,如果您的数据一次只跳过一周或一个月),则您的滚动平均值不会及时调整。因此,如果您的数据尚未定期采样,则通常需要对其进行重新取样。
  2. 如果您的数据包含NaN值,则会传播这些值:包含NaN的每个窗口也将为NaN。你必须impute those values以某种方式阻止它发生。