2014-10-20 79 views
0

我想要計算一個時間序列的滾動匯率。熊貓來計算滾動匯率

思考數據的方式是它是針對不同團隊的一系列多人遊戲系列的結果。直到最後一場比賽我們都不知道誰會贏得這個系列賽。我試圖計算贏得比率,因爲它會對每個對手球隊發展。

series_id  date  opposing_team won_series 
1   1/1/2000   a   0 
1   1/3/2000   a   0 
1   1/5/2000   a   1 
2   1/4/2000   a   0 
2   1/7/2000   a   0 
2   1/9/2000   a   0 
3   1/6/2000   b   0 

變爲:

series_id  date  opposing_team won_series percent_win_against_team 
1   1/1/2000   a   0     NA 
1   1/3/2000   a   0     NA 
1   1/5/2000   a   1     100 
2   1/4/2000   a   0     NA 
2   1/7/2000   a   0     100 
2   1/9/2000   a   0     50 
3   1/6/2000   b   0     0 
+1

我被混淆定義percent_win_against_team。系列賽獲勝的百分比是多少?如果是這樣,不應該是0,100,100,100,50或更好,但NA,NA,100,100,100,50嗎? – BKay 2014-10-20 19:19:07

+0

添加了NAs;好點子。沒有第三個100的原因是它在第一次系列賽勝出前的1/4/2000發生。 – Luke 2014-10-20 21:53:54

+0

系列總是正好3場比賽嗎?或者他們是以數據最後一次出現結束的? – BKay 2014-10-21 14:20:55

回答

1

我仍然不覺得我理解你如何決定什麼時候一個系列是在規則。 3結束了嗎?爲什麼它不適用,我會想到1/3。不過,這是一種跟蹤完成系列數量和(a)贏率的方法。

定義26472215table.csv:

series_id,date,opposing_team,won_series 
1,1/1/2000,a,0 
1,1/3/2000,a,0 
1,1/5/2000,a,1 
2,1/4/2000,a,0 
2,1/7/2000,a,0 
2,1/9/2000,a,0 
3,1/6/2000,b,0 

代碼:

import pandas as pd 
import numpy as np 

df = pd.read_csv('26472215table.csv') 
grp2 = df.groupby(['series_id']) 
sr = grp2['date'].max() 
sr.name = 'LastGame' 
df2 = df.join(sr, on=['series_id'], how='left') 
df2.sort('date') 



df2['series_comp'] = df2['date'] == df2['LastGame'] 
df2['running_sr_cnt'] = df2.groupby(['opposing_team'])['series_comp'].cumsum() 
df2['running_win_cnt'] = df2.groupby(['opposing_team'])['won_series'].cumsum() 

winrate = lambda x: x[1]/ x[0] if (x[0] > 0) else None 
df2['winrate'] = df2[['running_sr_cnt','running_win_cnt']].apply(winrate, axis = 1) 

結果DF2 [[ '日期', '勝率']]:

 date winrate 
0 1/1/2000  NaN 
1 1/3/2000  NaN 
2 1/5/2000  1.0 
3 1/4/2000  1.0 
4 1/7/2000  1.0 
5 1/9/2000  0.5 
6 1/6/2000  0.0 
+0

很好的捕獲。三個應該是零。這是針對不同的團隊,所以從零開始。所以也許應用這一組groupby會訣竅 – Luke 2014-10-22 21:14:54

+0

我認爲它應該做你想要的現在 – BKay 2014-10-22 23:03:22

+0

幾乎,除了數字3需要是NaN,因爲沒有任何東西已經贏了。 – Luke 2014-10-22 23:10:09