我有一个用户行为数据。用户查看项目。
user_id, item_id, timestamp
1, a, 1000
2, b, 1001
1, c, 1002
1, d, 1004
1, e, 1005
1, a, 1006
2, f, 1007
从概念上讲,我将此观看操作视为在会话中发生,并且希望构建会话。
(如果可以,我会查看时间戳,我可以用它来定义会话,但为了简单起见,我只是用固定的窗口大小进行分区)
对于窗口大小= 3和stride = 1(在示例中将清楚),我想将数据转换为以下格式
user_id, items
1, [a,c,d]
2, [b,f]
1, [d, e, a]
因此,对于user_id 1,他/她的第一个会话包括查看[a,c,d]
,第二个会话[d,e,a]
。 d
重复,因为步幅= 1,如果步幅是2,第二次会议将是[c,d,e]
(按窗口大小对数据进行分区时,我希望窗口彼此重叠,大小等于stride)
如果stride
实施太麻烦,我会放弃它。 (它就在那里,因为我是arbiltrarilly分区会话而不想丢失顺序信息)
这是一个应该有效的功能。 (我不保证它的表现与你在stride > gsize
时的预期一样)。我对stride
的定义略有不同。我把它作为自第一次开始新分组以来的观察次数:
import pandas as pd
def rolling_list(x, stride=1, gsize=3):
if len(x) <= gsize:
l = [list(x.to_list())]
else:
l = [x.iloc[i*stride:(i*stride)+gsize].to_list()
for i in range(len(x)//gsize+(gsize-stride))]
return pd.Series(l)
df.groupby('user_id').item_id.apply(rolling_list, stride=1)
#user_id
#1 0 [a, c, d]
# 1 [c, d, e]
# 2 [d, e, a]
# 3 [e, a, z]
#2 0 [b, f]
df.groupby('user_id').item_id.apply(rolling_list, stride=2)
#user_id
#1 0 [a, c, d]
# 1 [d, e, a]
# 2 [a, z]
#2 0 [b, f]
#Name: item_id, dtype: object
user_id,item_id,timestamp
1,a,1000
2,b,1001
1,c,1002
1,d,1004
1,e,1005
1,a,1006
2,f,1007
1,z,1008