我正在看年度棒球统计数字,并想要计算一个滚动的平均数,回顾过去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我如何使用组和聚合/转换(或其他一些进程)来计算每个球员的滚动平均值,其最大3年历史值为,然后仅对可用的历史数据不足3年的玩家使用可用的最大历史观测值?
很肯定,我的答案是在潘达斯的一揽子方案,但会感兴趣的任何解决方案。
谢谢!
发布于 2017-01-28 20:07:13
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。为了防止这种情况发生,你将不得不以某种方式算出那些值。https://stackoverflow.com/questions/41913023
复制相似问题