Создайте накопительную функцию в списке матрицы элементов пользователя на основе временного окна. - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть DataFrame, представляющий матрицу элементов пользователя в виде списка со столбцами:

user_id  item_id  rating  timestamp

Поскольку я хочу сделать рекомендацию с учетом времени, я хочу добавить столбецс упорядоченным списком (так как у меня есть временная метка) последних элементов, оцененных 1 (например) пользователя, поэтому я получаю DataFrame вроде:

user_id  item_id  rating  timestamp  prev_items_rated_by_usr_with_1

Яне в состоянии сделать это параллельно, и мне это нужно, так как набор данных огромен.

Это работает, но я не уверен, что он возвращает элементы, упорядоченные по метке времени, и невероятно долго для выполнения:

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)

1 Ответ

0 голосов
/ 19 февраля 2019

Мы можем получить данные предыдущих строк, используя метод numpy shift.Нам нужно импортировать как панд, так и 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)
...