生成用户/项目交互

时间:2018-08-29 02:09:31

标签: python pandas numpy machine-learning recommendation-engine

我有一个pandas数据框(“交互”数据框),其列为“用户”,“项目”,“评分”。

Ratings ItemID   UserID
1      1172952     A74
1      1178735     176
4      341785     70C
3      136771     67E
2      1178883     383

比方说,我还有两个数据框,分别具有200个用户和1000个Ietm。 问题是在交互数据框中,我需要为每个用户和每个项目组合评分。如果在互动数据框中没有该用户和商品的互动,则该用户/商品组合的等级为0。

我尝试过使用这样的循环:

item_ids = np.repeat(item_data.id.values, len(user_data.id.values))
user_ids = np.tile(user_data.id.values, len(item_data.id.values))
ratings = np.empty([len(item_ids)])

for i in range(len(ratings)):
    inter = interactions.loc[(interactions['UserID'] == user_ids[i]) & (interactions["ItemID"] == item_ids[i]), "Ratings"]
    if not inter.empty:
        ratings[i] = inter.values[0]
    else:
        ratings[i] = 0

interactions = np.stack((ratings, item_ids, user_ids), axis=-1)

但是,只需要30,000行的评级数组就需要40秒才能完成。 有快速的方法吗? 感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您对问题的解释有些草率,但是我觉得您需要这样做:

interactions.set_index(['ItemID','UserID'])\
            .unstack().fillna(0).astype(int).stack()\
            .reset_index()

此代码创建一个由用户和物品组成的矩形表,用零填充空白,然后将表转换回“高”矢量。输出:

     ItemID UserID  Ratings
0    136771    176        0
1    136771    383        0
2    136771    67E        3
3    136771    70C        0
4    136771    A74        0
5    341785    176        0
6    341785    383        0
7    341785    67E        0
8    341785    70C        4
9    341785    A74        0
10  1172952    176        0
....

我假设interaction表中至少一次引用了每个项目和每个用户(但没有组合!)。如果不是,则需要与其他两个表进行一些merge关联。