Генерация взаимодействий пользователь / элемент - PullRequest
0 голосов
/ 29 августа 2018

У меня есть пандасный фрейм данных (фрейм данных взаимодействий) со столбцами как Пользователь, Элемент, Рейтинг.

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 секунд. Есть ли быстрый способ сделать это? Спасибо за помощь.

1 Ответ

0 голосов
/ 29 августа 2018

Ваше объяснение проблемы немного неаккуратно, но у меня такое ощущение, что вам нужно это:

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 с двумя другими таблицами.

...