2017-10-09 22 views
1

サッカーチームの勢い、この場合、特定のチームが最後の3試合で得たポイントの尺度を計算したいと思います。私のデータは次のようになります:パンダ:2列の条件付きローリング合計

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 

これはバルセロナのいくつかのゲームの単なるサンプルです。だから、基本的に私は最後の3つのマッチ(現在のマッチを除く)で得たポイントを合計する2つの追加の列(Home_Momentum、Away_Momentum)を追加します。だから、次のようになります。

のx(y)がラス・パルマス(マドリード)がその最後の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 

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

しかし、これに伴う問題は、それがチームの離れたゲームを考えるdoesntのことです:

私がこれまでに作ってみたことはあります。

これを解決する方法はありますか?

答えて

1

名前を変更すると、マルチインデックスになります。我々は同様に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).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 

ローリング合計をスタックして実行します。

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 
+0

これは素晴らしい、感謝しました! – Konninger