【问题标题】:Generating User / Item interactions生成用户/项目交互
【发布时间】:2018-08-29 02:09:31
【问题描述】:

我有一个 pandas 数据框(交互数据框),其中包含用户、项目、评级等列。

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

假设我还有两个数据框,分别有 200 个用户和 1000 个 ietms。 问题是在交互数据框中,我需要对每个用户和每个项目组合进行评分。如果交互数据框中的用户和项目没有可用的交互,则用户/项目组合的评分为 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 秒才能完成。 有没有一种快速的方法来做到这一点? 感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    你对问题的解释有点草率,但我感觉你需要这个:

    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'ing 与其他两个表。

    【讨论】:

    • 感谢@DYZ 的帮助。这非常有用。它现在运行不到一秒钟。
    • 我一定会努力提高我的问题解释技巧。
    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2016-02-29
    • 2015-09-14
    相关资源
    最近更新 更多