【发布时间】:2020-01-27 23:46:40
【问题描述】:
您好,我正在尝试在这里制作一个 3D 矩阵。这是 MovieLens 数据 (https://grouplens.org/datasets/movielens/100k/),我将 u1.base 和 u1.test 对作为训练集和测试集(分别)。下面是您将在代码中发现的变量training_set 的数据格式的图像。
我尝试创建的 3D 矩阵的格式为 (User, Movie, Timestamp),每个单元格中的数据是用户 1 在时间 1 对电影 1 给出的评分。
如果有帮助,下面是创建二维矩阵的代码,行中的用户和列中的所有电影。
import numpy as np
import pandas as pd
training_set = pd.read_csv('ml-100k/u1.base', delimiter = '\t')
training_set = np.array(training_set, dtype='int')
test_set = pd.read_csv('ml-100k/u1.test', delimiter = '\t')
test_set = np.array(test_set, dtype = 'int64')
nb_users = int(max(max(training_set[:, 0]), max(test_set[:, 0])))
nb_movies = int(max(max(training_set[:, 1]), max(test_set[:, 1])))
def convert(data):
new_data = [] #final list that we will return
for id_users in range(1, nb_users+1):
id_movies = data[:, 1][data[:, 0] == id_users] #contains the IDs of the movies rated by the id_user
id_ratings = data[:, 2][data[:, 0] == id_users] #all movie ratings given by specific user
ratings = np.zeros(nb_movies)
ratings[id_movies-1] = id_ratings #these two lines are just so that the movies that are not rated by user have null (0) values
new_data.append(list(ratings))
return (new_data)
training_set = convert(training_set)
test_set = convert(test_set)
以下是我尝试过的代码,它给出了许多错误,以至于我无法滚动到它抛出的第一个错误。
import numpy as np
import pandas as pd
training_set = pd.read_csv('ml-100k/u1.base', delimiter = '\t')
training_set = np.array(training_set, dtype='int')
test_set = pd.read_csv('ml-100k/u1.test', delimiter = '\t')
test_set = np.array(test_set, dtype = 'int64')
nb_users = int(max(max(training_set[:, 0]), max(test_set[:, 0])))
nb_movies = int(max(max(training_set[:, 1]), max(test_set[:, 1])))
#The changes I made start here --
nb_timestamps = int(max(len(training_set[:, 3]), len(test_set[:, 3])))
ts_min = int(min(min(training_set[:, 3]), min(test_set[:, 3])))
ts_max = int(max(max(training_set[:, 3]), max(test_set[:, 3])))
def convert(data):
new_data = [] #final list that we will return
for timestamp in range(ts_min, ts_max+1):
for id_users in range(1, nb_users+1):
id_movies = data[:, 1][data[:, 0] == id_users][data[:, 3] == timestamp]
#contains the IDs of the movies rated by the id_user
id_ratings = data[:, 2][data[:, 0] == id_users][data[:, 3] == timestamp]
ratings = np.zeros(nb_movies)
ratings[id_movies-1] = id_ratings
new_data.append(list(ratings))
return (new_data)
training_set = convert(training_set)
test_set = convert(test_set)
【问题讨论】:
-
你介意举个例子来说明你想要得到的输出吗?我最终会拆分问题。而且我不明白你为什么要在 pandas 中使用循环。
-
@rpanai 想象一个 2D 评分网格(行和列作为用户和电影;因此每个用户由一行表示,他们评分的所有电影都是列),在该层上,我们'正在添加连接到每个评级的所有时间戳的另一层,从而制作一个 3D 矩阵。为什么我使用循环是因为我在一般数据处理方面仍然是初学者并且不了解许多 Pandas 函数。
-
我在答案中添加了一些代码(您不应该将其作为答案)。我仍然不清楚你想如何创建带有时间戳的 3D 矩阵。
-
我正在删除不必要的标签。