Python 非索引datetime列的基于时间的滚动groupby()平均值

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

我需要知道一名球员是否在过去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”,以获得比平均水平更好的结果,如下所示:

#                           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,是的,我只看过去的游戏。从本质上说,在当前游戏开始之前,你的表现是否优于平均水平。