2014-10-20 81 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