问题描述
我正在为一个大学项目设计我想使用关联分析(Apriori算法)的项目。作为数据基础,我有两个数据框。
其中之一是具有列条款articleNumber和时间戳记:
Clickstream
term articleNumber timestamp
queryC 2547 2018-09-27 18:26:58
queryU 2157 2018-09-28 14:30:01
另外一个术语和时间戳:
Queries
term timestamp
queryA 2018-09-27 18:26:47
queryB 2018-09-27 18:26:52
queryC 2018-09-27 18:26:58
queryX 2018-09-28 14:29:49
queryP 2018-09-28 14:30:00
queryU 2018-09-28 14:30:01
我想做的是比较两个数据帧,因此我使用术语和时间戳。如果clickstream.timestamp -query.timestamp之间的差异小于10秒,并且期限相等,那么我想用clickstream的articleNumber代替查询期限。这样查询数据框看起来像这样:
Queries
term timestamp
queryA 2018-09-27 18:26:47
queryB 2018-09-27 18:26:52
2547 2018-09-27 18:26:58
queryX 2018-09-28 14:29:49
queryP 2018-09-28 14:30:00
2157 2018-09-28 14:30:01
此后,我想从下到上遍历Queries数据框,并且如果当前项之前的项不是数字,并且当前时间戳和数据集之前的时间戳之间的差小于5分钟,我希望将这些术语放到新数据框的一栏中,以便最终结果如下所示:
journey
id terms
1 2547,queryB,queryA
2 2157,queryP,queryX,queryC,queryA
任何有关如何实现这一目标的技巧都将受到赞赏。
解决方法
df_q=pd.DataFrame({
'term':['queryC','queryU'],'articleNumber':[2547,2157],'timestamp':['2018-09-27 18:26:58','2018-09-28 14:30:01']
})
任务1
df_q.timestamp=pd.to_datetime(df_q.timestamp)
df_c=pd.DataFrame({
'term':['queryA','queryB','queryC','queryX','queryP','timestamp':['2018-09-27 18:26:47','2018-09-27 18:26:52','2018-09-27 18:26:58','2018-09-28 14:29:49','2018-09-28 14:30:00','2018-09-28 14:30:01']
})
df_c.timestamp=pd.to_datetime(df_c.timestamp)
df_cq=pd.merge_asof(df_c,df_q,tolerance=pd.Timedelta("10s"),on='timestamp')
df_cq.loc[df_cq.term_y.notna(),'term_x']=df_cq.loc[df_cq.term_y.notna(),'articleNumber']
task1_df =df_cq[['term_x','timestamp']]
print(task1_df)
term_x timestamp
0 queryA 2018-09-27 18:26:47
1 queryB 2018-09-27 18:26:52
2 2547 2018-09-27 18:26:58
3 queryX 2018-09-28 14:29:49
4 queryP 2018-09-28 14:30:00
5 2157 2018-09-28 14:30:01
任务2
df_test = df_cq.dropna()
df_all=pd.DataFrame()
for index,row in df_test.iterrows():
row=pd.DataFrame(row).transpose()
rows = pd.merge_asof(df_cq,row,tolerance=pd.Timedelta('5m'),on='timestamp')
rows.articleNumber_y = rows.articleNumber_y.bfill()
rows=rows.dropna(subset=['articleNumber_y'])
df_all = df_all.append(rows)
df_all.term_x_x=df_all.term_x_x.astype(str)
df_all = df_all[
df_all.term_x_x.str.isalpha()
][['term_x_x','timestamp','articleNumber_y']]
df_all=df_all.groupby('articleNumber_y').agg({'term_x_x':lambda x: ','.join(x)})
print(df_all)
term_x_x
articleNumber_y
2157.0 queryA,queryB,queryX,queryP
2547.0 queryA,queryB
对于2157,没有queryC
,因为您已经根据需要将其替换为articleNumber