首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python :使用滚动回溯窗口计算累积和

Python :使用滚动回溯窗口计算累积和
EN

Stack Overflow用户
提问于 2017-11-09 22:36:45
回答 1查看 2.3K关注 0票数 0

我正在计算(下表)中的“总计获胜(2天)”列的值--也参见下面逗号分隔的值。

总胜利(2天)是对运动员在某一天赢得的比赛次数的累计计数。第5天或前一天(如。第4天)--因此,它是对2天后向窗口内获胜次数的统计。(我可能想将“回望”窗口更改为任意数字)。

例如,在第七天:简因为她在第七天赢了,而在第六天输了;比尔因为在第七天输了而在第六天赢了,而史蒂夫在哪一天都没有赢。

在第六天,比尔得到了1的点数,因为他在第5天赢了,但在第5天输了。史蒂夫得到了1的计数,因为他在第6天输了,但在第5天赢了。简两天都没赢。

在Python中计算“总赢(2天)”的最佳方法是什么?

后续问题

另外,作为后续问题:关于“.rolling(2)”(即.在这种情况下,如何将param设置为从表中的其他列派生的值?

我想要做的是将Race Day更改为datetime对象(见下面更新的表),并计算出在过去一周、月、年等时间内赢得比赛的总数(X天)。(我使用的数据库比上面的例子要大)。

我宁愿把年份定义为日历年。比赛在2014-01-01和2015-01-01之间获胜),而不仅仅是265天。

代码语言:javascript
复制
Race Day,Athlete,Position,Total Wins,Total Wins (2 Days)
1,Steve,1,1,1
1,Jane,2,0,0
1,Bill,3,0,0
2,Bill,1,1,1
2,Steve,2,1,1
2,Jane,3,0,0
3,Jane,1,1,1
3,Bill,2,1,1
3,Steve,3,1,0
4,Steve,1,2,1
4,Jane,2,1,1
4,Bill,3,1,0
5,Steve,1,3,2
5,Jane,2,1,0
5,Bill,3,1,0
6,Bill,1,2,1
6,Steve,2,3,1
6,Jane,3,1,0
7,Jane,1,2,1
7,Bill,2,2,1
7,Steve,3,3,0

Race Day,Athlete,Position,Total Wins,Total Wins (2 Months)
2000-01-01,Steve,1,1,?
2000-01-01,Jane,2,0,?
2000-01-01,Bill,3,0,?
2000-01-02,Bill,1,1,?
2000-01-02,Steve,2,1,?
2000-01-02,Jane,3,0,?
2000-01-03,Jane,1,1,?
2000-01-03,Bill,2,1,?
2000-01-03,Steve,3,1,?
2000-01-04,Steve,1,2,?
2000-01-04,Jane,2,1,?
2000-01-04,Bill,3,1,?
2000-01-05,Steve,1,3,?
2000-01-05,Jane,2,1,?
2000-01-05,Bill,3,1,?
2000-01-06,Bill,1,2,?
2000-01-06,Steve,2,3,?
2000-01-06,Jane,3,1,?
2000-01-07,Jane,1,2,?
2000-01-07,Bill,2,2,?
2000-01-07,Steve,3,3,?
EN

回答 1

Stack Overflow用户

发布于 2017-11-09 23:31:19

创建一个Won列,该列捕获每一行的位置1,然后应用滚动和

代码语言:javascript
复制
df['Won'] = (df['Position'] == 1).astype(int)

df['Total Wins (2 Days)'] = df.groupby('Athlete')['Won'].apply(lambda x: x.rolling(2).sum()).combine_first(df['Won'])

    Race Day    Athlete Position    Total Wins  Total Wins (2 Days) Won
0   1           Steve   1           1           1.0                 1
1   1           Jane    2           0           0.0                 0
2   1           Bill    3           0           0.0                 0
3   2           Bill    1           1           1.0                 1
4   2           Steve   2           1           1.0                 0
5   2           Jane    3           0           0.0                 0
6   3           Jane    1           1           1.0                 1
7   3           Bill    2           1           1.0                 0
8   3           Steve   3           1           0.0                 0
9   4           Steve   1           2           1.0                 1
10  4           Jane    2           1           1.0                 0
11  4           Bill    3           1           0.0                 0
12  5           Steve   1           3           2.0                 1
13  5           Jane    2           1           0.0                 0
14  5           Bill    3           1           0.0                 0
15  6           Bill    1           2           1.0                 1
16  6           Steve   2           3           1.0                 0
17  6           Jane    3           1           0.0                 0
18  7           Jane    1           2           1.0                 1
19  7           Bill    2           2           1.0                 0
20  7           Steve   3           3           0.0                 0

可以使用以下方法删除获胜的列

代码语言:javascript
复制
df.drop('Won', axis = 1, inplace = True)

备选案文2:

代码语言:javascript
复制
df['Won'] = (df['Position'] == 1).astype(int)

df['Total Wins (2 Days)'] = df.groupby('Athlete')['Won'].apply(lambda x: x.add(x.shift())).combine_first(df['Won'])

编辑:关于比赛日日期的后续问题,您可以通过汇总日、周、月等方面的数据(根据您的要求)添加一列,然后找到当前和前一期间的总和。

代码语言:javascript
复制
df['Race Day'] = pd.to_datetime(df['Race Day'])

df['Won'] = (df['Position'] == 1).astype(int)


df['Total Wins Day']=df.groupby(['Athlete', df['Race Day'].dt.day])['Won'].transform('sum')
df['Total Wins week']=df.groupby(['Athlete', df['Race Day'].dt.week])['Won'].transform('sum')
df['Total Wins Month']=df.groupby(['Athlete', df['Race Day'].dt.month])['Won'].transform('sum')

现在,如果您想要在最后两个月中获得全部胜利,您可以使用“总计胜利月份”列,并将其与前一列相加。

代码语言:javascript
复制
df['Total Wins (2 Months)'] = df.groupby('Athlete')['Total Wins Month'].apply(lambda x: x.add(x.shift())).combine_first(df['Won'])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47212791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档