pandas:conditional 两列的滚动总和
pandas:conditional rolling sum of two columns
我想计算足球队势头的衡量标准,在本例中是某支球队在过去 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())
但问题在于没有考虑球队的客场比赛
你有什么解决办法吗?
将列重命名为多索引。堆栈和运行滚动总和
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
我想计算足球队势头的衡量标准,在本例中是某支球队在过去 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())
但问题在于没有考虑球队的客场比赛
你有什么解决办法吗?
将列重命名为多索引。堆栈和运行滚动总和
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