Grpahlab SFrames:将SFrame与数据集一起使用时出错

时间:2016-03-29 05:33:32

标签: python graphlab

在Graphlab中, 我正在处理一小组健身数据,以使用可提供建议的推荐功能。数据集具有用户ID列而不是项目ID,而是以列排列的不同项目以及它们各自的对应于每个用户ID的行的评级。为了使用任何graphlab推荐方法,我需要有用户ID和项目ID。这是我做的:

v = graphlab.SFrame.read_csv('Data.csv')   
userId = v["user_id"]
itemId = v["x","y","z","x1","y1","z1"] //x,y,z,x1,y1,z1 are activities that are actually the columns in Data and contains corresponding ratings given by user

sf= graphlab.SFrame({'UserId':userId,'ItemId':itemId})
print sf.head(5)

基本上,我从Data中提取了user_id col,并尝试使用从相同数据中提取的x,y,z等列为ItemId创建一列,以便生成仅包含这两列的另一个sframe。此代码生成一个表格格式的sframe,其中包含2列预期,但没有按照我在SFrame中传递参数的顺序排列。因此,输出将ItemId作为第一列,然后是UserId。即使我试图改变在sframe中传递这两个的顺序,它仍然提供相同的输出。有谁知道原因? 这在使用任何推荐方法时会进一步产生问题,因为它会给出错误:列名user_id不存在。

1 个答案:

答案 0 :(得分:0)

列排序的原因是因为您将Python字典传递给SFrame构造函数。 Python中的字典不会按照指定的顺序保存密钥;他们有自己的订单。如果您希望首先使用“UserId”,则可以拨打sf.swap_columns('UserId','ItemId')

但是列的顺序不会影响推荐方法。如果您没有名为Column name 'user_id' does not exist的列,并且未指定user_id列的名称,则会出现user_id错误。在您的情况下,您可以这样做:graphlab.recommender.create(sf, user_id='UserId', item_id='ItemId')

此外,您可能需要查看stack方法,该方法可以帮助您将数据输入到推荐方法所期望的格式中。我认为您当前的SFrame sf会有一列词典,其中项ID是关键,而评级是值。我相信这会适用于这种情况:

sf.stack('ItemId', new_column_name=['ItemId','Rating'])