2017-05-30 115 views
-2

我正在通過使用Movielens數據集進行協作過濾製作Movie Recommender系統。 於是我跟着thishttp://blog.ethanrosenthal.com/2015/11/02/intro-to-collaborative-filtering/在Python中,TypeError:不支持的操作數類型爲 - :'str'和'int'

,但它並不在LN工作[8]:

import numpy as np 
import pandas as pd 

data = open('ratings.csv') 

names = ['user_id','item_id','rating','timestamp'] 
df = pd.read_csv('ratings.csv', sep=',', names=names) 
df.head() 

n_users = df.user_id.unique().shape[0] 
n_items = df.item_id.unique().shape[0] 
print (str(n_users) + ' users') 
print (str(n_items) + ' items') 

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

sparsity = float(len(ratings.nonzero()[0])) 
sparsity /= (ratings.shape[0] * ratings.shape[1]) 
sparsity *= 100 
print ('Sparsity: {:4.2f}%'.format(sparsity)) 

並沒有錯誤這樣的:

line 17, in <module> 
    ratings[row[1]-1, row[2]-1] = row[3] 
TypeError: unsupported operand type(s) for -: 'str' and 'int' 
+1

的'Exception'是明確的 - 你'row's舉行'str's。 – AChampion

回答

0

您閱讀CSV數據幀的,默認是將該數據讀取爲字符串。然後嘗試使用數據幀中的行,期望這些值是數字(從中減去1),並且失敗。

要麼指定dtype(適用於所有的列或使用每列的映射),或使用通行證在converters映射(映射列索引或列名轉換函數)。由於該數據是所有整數(ID號,因爲一個劃時代的評級和時間戳單位:秒),速戰速決將在這裏使用dtype=np.int32

df = pd.read_csv('ratings.csv', sep=',', names=names, dtype=np.int32) 
相關問題