我正在研究年度化的棒球统计数据,并希望计算一个滚动平均值,回顾过去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软件包,但对任何解决方案都感兴趣。
谢谢!
答案 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)
,依此类推)
使用此方法时需要注意两个问题:
NaN
值,则会传播这些值:包含NaN
的每个窗口也将为NaN
。你必须impute those values以某种方式阻止它发生。