我有一个time_stamp
和user_id
的数据。
数据按user_id
和time_stamp
排序。
我想在7天的滚动间隔中为每个user_id
获取该7天的滚动间隔中的访问次数。如果访问次数> 3,则将该用户ID的新列设置为1,否则设置为0。
我的数据
time_stamp,user_id,visited
2014-04-22 03:53:30,1,1
2013-11-15 03:45:04,2,1
2013-11-29 03:45:04,2,1
2013-12-09 03:45:04,2,1
2013-12-25 03:45:04,2,1
2013-12-31 03:45:04,2,1
2014-01-08 03:45:04,2,1
2014-02-03 03:45:04,2,1 <- in a 7 day interval (till 2014-02-10)
2014-02-08 03:45:04,2,1 <- there is 3 visits
2014-02-09 03:45:04,2,1 <-
预期输出
user_id outcome
1 0
2 1
我尝试过的事情:
我不知道执行此操作的最佳方法。我的第一个想法是为每个user_id
获得连续的时差。
df['timediff'] = df.groupby(['user_id','time_stamp'])['time_stamp'].diff() / np.timedelta64(1, 'D')
但是此输出显示了所有Nan。
2014-04-22 03:53:30 1 1 NaN
1 2013-11-15 03:45:04 2 1 NaN
2 2013-11-29 03:45:04 2 1 NaN
3 2013-12-09 03:45:04 2 1 NaN
4 2013-12-25 03:45:04 2 1 NaN
我应该如何更改算法?
答案 0 :(得分:3)
如果每个user_id都有一个序列号,我将使用df.rolling
,其偏移量为7天。然后,您可以检查序列中是否有任何地方的滚动总和为greater than or equal to3。要获得每个用户的序列,请使用set_index()
和unstack
:
(df.set_index(['time_stamp', 'user_id'])
.unstack()
.rolling('7D')
.sum()
.ge(3)
.any())
# user_id
#visited 1 False
# 2 True