根据时间 window 在用户项目矩阵列表上创建一个累加函数

Make an accumulative function on an User Item Matrix list based on a time window

我有一个 DataFrame 将用户-项目矩阵表示为包含以下列的列表:

user_id  item_id  rating  timestamp

因为我想做一个有时间意识的推荐系统,所以我想添加一个列,其中包含最后一个评分为 1(例如)的项目的有序列表(因为我有时间戳)用户,所以我得到一个 DataFrame 像:

user_id  item_id  rating  timestamp  prev_items_rated_by_usr_with_1

我无法并行处理它,我需要它,因为数据集很大。

这行得通,但我不确定它是否 returns 按时间戳排序的项目并且执行时间非常长:

df['new'] = df.apply(lambda row:list(df.loc[df.user_id==row['user_id']].loc[df.timestamp<row['timestamp']].loc[df.rating==1].item_id.unique()), axis = 1)

我们可以使用 numpy shift 方法获取前几行数据。我们需要同时导入 pandas 和 numpy:

import pandas as pd
import numpy as np

我们可以设置索引,这样我们可以根据每个用户和时间戳更快地排序:

df = df.set_index(['user_id', 'timestamp'], drop=False).sort_index()

然后我们可以通过检查之前的用户是否相同以及之前的分数是否为 1 来计算新列:

df['prev_items_rated_by_usr_with_1'] = np.where(df['user_id'] == df['user_id'].shift() &
                                                df['rating'].shift() == 1, True, False)