Python 非索引datetime列的基于时间的滚动groupby()平均值
我需要知道一名球员是否在过去4.5小时内赢得了超过一半的前一场比赛(不包括当前比赛)。滚动'4.5h'的变化。。。不工作,因为时间列不是索引,并且不能转换为带有set_index'game_t'的索引 游戏由gid游戏ID列表示,在wl列中,“w”和“l”分别表示赢和输。每个游戏id的游戏时间都存储在Game\u t中 我有一个数据帧,下面是一个很好的最小近似值: df=pd.DataFrame{'game_t':[pd.datetime.now-dt.timedeltahours=n表示范围10中的n], “玩家”:[*'abacabacb'], 'wl':['w','l']*5, 'gid':[1,1,2,2,3,3,4,4,5,5]} df.game\u t=df.groupby'gid'。game\u t.transform'first' df 游戏玩家wl gid 2019-07-05 15:00:23.840588西北1 2019-07-05 15:00:23.840588BL1 2019-07-05 13:00:23.840605a w 2 2019-07-05 13:00:23.840605 c l 2 2019-07-05 11:00:23.840611a w 3 5 2019-07-05 11:00:23.840611BL3 2019-07-05 09:00:23.840618a w 4 2019-07-05 09:00:23.840618 c l 4 8 2019-07-05 07:00:23.840623 c w 5 2019-07-05 07:00:23.840623BL5 鉴于上述情况,我需要一个列,称之为“bta”,以获得比平均水平更好的结果,如下所示:Python 非索引datetime列的基于时间的滚动groupby()平均值,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我需要知道一名球员是否在过去4.5小时内赢得了超过一半的前一场比赛(不包括当前比赛)。滚动'4.5h'的变化。。。不工作,因为时间列不是索引,并且不能转换为带有set_index'game_t'的索引 游戏由gid游戏ID列表示,在wl列中,“w”和“l”分别表示赢和输。每个游戏id的游戏时间都存储在Game\u t中 我有一个数据帧,下面是一个很好的最小近似值: df=pd.DataFrame{'game_t':[pd.datetime.now-dt.timedeltahours=n表示范围1
# gt player wl gid bta
# 0 2019-07-05 15:00:23.840588 a w 1 True
# 1 2019-07-05 15:00:23.840588 b l 1 False
# 2 2019-07-05 13:00:23.840605 a w 2 True
# 3 2019-07-05 13:00:23.840605 c l 2 False
# 4 2019-07-05 11:00:23.840611 a w 3 True
# 5 2019-07-05 11:00:23.840611 b l 3 False
# 6 2019-07-05 09:00:23.840618 a w 4 False
# 7 2019-07-05 09:00:23.840618 c l 4 True
# 8 2019-07-05 07:00:23.840623 c w 5 False
# 9 2019-07-05 07:00:23.840623 b l 5 False
无论我在哪里尝试设置索引“游戏”,熊猫坚持索引必须是单调的。我知道博弈列在总是递增或总是递减的意义上不是单调的,因为它有重复项,分组索引应该是单调的,因为没有玩家在给定的时间玩超过一次*
例如,以下各项:
df['bta']=df.groupby'player'.applylambda g:g.set_索引'game_t'.wl.eq'w'.rolling'4.5h',min_periods=0.mean
结果:
回溯最近一次呼叫最后:……回溯快乐。。。
…ValueError:索引必须是单调的
无论如何,我以前的尝试都没有任何价值,因为它们要么给出了错误的答案,要么触发了从这里无法到达的典型问题的变化,而你甚至都有点愚蠢,你是否尝试过使用apply,尽管你可能意味着转换?显示错误消息
*旁白:开发人员不知道单调意味着什么,因为它实际上意味着不变、不减损或不递增;单调性既不意味着增加也不意味着减少。它们似乎意味着严格增加或严格减少。我认为您的任何问题都不是问题: 游戏不是索引:将其设置为索引 游戏不是单调的:对它进行排序 这是我的解决办法
# sort values and set index
df = df.sort_values('game_t').set_index('game_t')
# if the player wins -> for rolling
df['is_win'] = df.wl.eq('w')
# closed='left' option skip the current game
win_mean = (df.groupby('player')
.is_win.rolling('4.5H', closed='left')
.mean().reset_index()
)
df = df.reset_index().merge(win_mean, on = ['game_t', 'player'])
df['bta'] = df.is_win_y.gt(0.5)
df.sort_values(['gid', 'wl'], ascending=[True, False])
给出:
game_t player wl gid is_win_x is_win_y bta
8 2019-07-05 15:00:23.840588 a w 1 True 1.0 True
9 2019-07-05 15:00:23.840588 b l 1 False 0.0 False
6 2019-07-05 13:00:23.840605 a w 2 True 1.0 True
7 2019-07-05 13:00:23.840605 c l 2 False 0.0 False
4 2019-07-05 11:00:23.840611 a w 3 True 1.0 True
5 2019-07-05 11:00:23.840611 b l 3 False 0.0 False
2 2019-07-05 09:00:23.840618 a w 4 True NaN False
3 2019-07-05 09:00:23.840618 c l 4 False 1.0 True
0 2019-07-05 07:00:23.840623 c w 5 True NaN False
1 2019-07-05 07:00:23.840623 b l 5 False NaN False
如果愿意,你可以删除这两列。@ALollz你能回答我提出的问题吗?为什么6的bta正好等于False?是因为这是第一个a的游戏吗?我不是滚动方面的专家,不计算并发行的复杂性使事情变得复杂。我可以说,问题是你的指数是单调的,不是单调的。例如,查看df2.groupby'player.applylambda g:g.set_index'game_t.index.is_单调递减和df2.groupby'player.applylambda g:g.set_index'game_t.index.is_单调。@quanghaang,是的,我只看过去的游戏。从本质上说,在当前游戏开始之前,你的表现是否优于平均水平。