【问题标题】:Is there a way to calculate yearly moving average in Python?有没有办法在 Python 中计算年度移动平均值?
【发布时间】:2022-01-06 15:58:02
【问题描述】:

我有一些足球数据正在修改以供分析。我基本上想每周计算几个统计数据的职业生涯和每年每场比赛的平均值。

示例

我有什么:

Player Year Week Rushing Yards Catches
Seth Johnson 2020 1 100 4
Seth Johnson 2020 2 80 2
Seth Johnson 2021 1 50 3
Seth Johnson 2021 2 50 2

我想要什么:

Player Year Week Rushing Yards Catches Career Rushing Yards per Game Career Catches per Game Yearly Rushing Yards per Game Yearly Catches per Game
Seth Johnson 2020 1 100 4 100 4 100 4
Seth Johnson 2020 2 80 2 90 3 90 3
Seth Johnson 2021 1 50 3 76.67 3 50 3
Seth Johnson 2021 2 40 2 67.5 2.75 45 2.5

我想我可以分别计算职业数据和年度数据,然后加入球员/年/周的所有数据,但我不确定如何计算移动平均线,因为窗口将取决于年份和周。

我已经尝试过诸如遍历所需类别并计算滚动平均值之类的方法:

new_df['Career ' + category + ' per Game'] = df.groupby('Player')[category].apply(lambda x: x.rolling(3, min_periods=0).mean())

但是我没有找到为rolling() 制作适当的自定义窗口所需的创造力。有人在这里有什么想法吗?

【问题讨论】:

  • 为什么最后一行“Career Rushing Yards per Game”是 67.5?如果是 3 个周期的滚动平均值,不应该是 (80+50+50)/3=60 吗?其他列似乎也不遵循您的 3 周期均值逻辑。
  • 对不起,例子不清楚。该表显示了正确的期望输出,其中职业滚动平均值为前一周的平均值。代码示例只是一个解决方案的尝试,与表格无关。
  • 您能否发布一个滚动窗口实际发生变化的更好示例?并且请使预期的输出与输入相匹配。

标签: python group-by moving-average rolling-average


【解决方案1】:

下面的代码有点复杂,但它可以完成工作。

df = pd.DataFrame(lst, columns=["Player","Year","Week","Rushing Yards","Catches"])
df[['Weekly Rushing Yards','Weekly Catches']] = (df[["Rushing Yards","Catches"]].cumsum()
                                                 .divide(df.index+1, axis=0))

df_lst = []
for year in df['Year'].unique():
    df0 = df.loc[df['Year']==year,["Rushing Yards","Catches"]].reset_index()
    df0[['Yearly Rushing Yards','Yearly Catches']] = (df0[["Rushing Yards","Catches"]].cumsum()
                                                      .divide(df0.index+1, axis=0))
    df_lst.append(df0[['Yearly Rushing Yards','Yearly Catches']])

df[['Yearly Rushing Yards','Yearly Catches']] = pd.concat(df_lst).reset_index().drop('index', axis=1)

基本上,不使用任何mean 方法,而是使用cumsum 方法并除以数据帧的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 2015-02-13
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2021-05-30
    • 2018-07-07
    • 2017-12-19
    相关资源
    最近更新 更多