1

我想计算一个衡量足球队势头的指标,在​​这种情况下是某支球队在最近 3 场比赛中获得的分数。我的数据如下所示:

    HomeTeam    AwayTeam    H_Pts   A_Pts
    Barcelona   Getafe      3       0
    Levante     Barcelona   1       1
    Barcelona   Las Palmas  3       0
    Las Palmas  Barcelona   3       0
    Barcelona   Madrid      1       1

这只是一些巴塞罗那比赛的示例。所以基本上我想要结束的是两个额外的列(比如 Home_Momentum、Away_Momentum),它们将这支特定球队在最近 3 场比赛中获得的分数相加(不包括当前一场)。所以它应该看起来像这样:

    HomeTeam    AwayTeam    H_Pts   A_Pts    Home_Momentum    Away_Momentum
    Barcelona   Getafe      3       0        NaN              NaN
    Levante     Barcelona   1       1        NaN              NaN
    Barcelona   Las Palmas  3       0        NaN              NaN
    Las Palmas  Barcelona   3       0        x                7    
    Barcelona   Madrid      1       1        4                y

其中 x (y) 是拉斯帕尔马斯 (马德里) 在过去 3 场比赛中获得的积分总和。

到目前为止,我想出的是:

data["Home_Momentum"] = data.groupby("HomeTeam")["H_Pts"].apply(lambda x: x.rolling(3).sum().shift())

但这样做的问题是它没有考虑球队的客场比赛。

你有什么想法如何解决这个问题吗?

4

1 回答 1

2

将列重命名为多索引。堆栈并运行滚动总和

df.columns = [
    ['Team', 'Team', 'Points', 'Points'],
    ['Home', 'Away', 'Home', 'Away']
]

d1 = df.stack()

mom = d1.groupby('Team').Points.apply(lambda x: x.shift().rolling(3).sum())

d1.assign(Momentum=mom).unstack()

  Points             Team             Momentum     
    Away Home        Away        Home     Away Home
0      0    3      Getafe   Barcelona      NaN  NaN
1      1    1   Barcelona     Levante      NaN  NaN
2      0    3  Las Palmas   Barcelona      NaN  NaN
3      0    3   Barcelona  Las Palmas      7.0  NaN
4      1    1      Madrid   Barcelona      NaN  4.0

我们也可以包括几场比赛而不是 3 场比赛的总和。

df.columns = [
    ['Team', 'Team', 'Points', 'Points'],
    ['Home', 'Away', 'Home', 'Away']
]

d1 = df.stack()

mom = d1.groupby('Team').Points.apply(lambda x: x.shift().rolling(3, 1).sum())

d1.assign(Momentum=mom).unstack()

  Points             Team             Momentum     
    Away Home        Away        Home     Away Home
0      0    3      Getafe   Barcelona      NaN  NaN
1      1    1   Barcelona     Levante      3.0  NaN
2      0    3  Las Palmas   Barcelona      NaN  4.0
3      0    3   Barcelona  Las Palmas      7.0  0.0
4      1    1      Madrid   Barcelona      NaN  4.0
于 2017-10-09T20:32:18.650 回答