Индекс вне границ с помощью itertuples - PullRequest
0 голосов
/ 02 июля 2018

У меня есть такой фрейм данных:

user_id anime_id    user_rating
0   1   20  7.808497
1   3   20  8.000000
2   5   20  6.000000
3   6   20  7.808497
4   10  20  7.808497

это похоже на базовый фрейм данных для игры с системой рекомендаций.

у меня было ~ 7 миллионов строк, я немного уменьшил кадр данных так:

df = df[df["user_id"] < 2000]

давайте напишем n_users, n_items, у меня было 1999 пользователей, конечно, и ~ 6000items

У меня 2 проблемы. если я хочу построить свой тренировочный набор данных так:

ratings = np.zeros((n_users, n_items))
for row in df.itertuples():
    ratings[row[1]-1, row[2]-1] = row[3]

У меня есть ошибка IndexE:

index 950 is out of bounds for axis 0 with size 949`

Я пробовал новые вещи со строкой [0] после комментария, это не работает:

X = urm[["user_id", "anime_id"]].as_matrix()
y = urm["user_rating"].values
n_u = len(urm["user_id"].unique())
n_m = len(urm["anime_id"].unique())

R = np.zeros((n_u, n_m))
for idx, row in enumerate(X):
    R[row[0]-1, row[1]-1] = y[idx]

все та же ошибка IndexError.

если я передаю строку с строкой if в R.index: код возвращает только матрицу np.zeros

1 Ответ

0 голосов
/ 02 июля 2018

row[1] представляет user_id, а не ваш индекс данных. Как только вы достигнете строки с user_id больше, чем первое измерение ratings, вы увидите IndexError. Вместо этого используйте row[0] или row.Index для извлечения индекса строки, который затем можно использовать для индексации массива ratings.

Кроме того, обратите внимание, что df[df["user_id"] < 2000] сам по себе не гарантирует, что у вас 1999 пользователей. Например, некоторые user_id целочисленные идентификаторы могут отсутствовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...