2017-05-30 20 views
-2

Movielensデータセットを使用した共同フィルタリングによってMovie Recommenderシステムを作成しています。 そして私はthis従ってください:http://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'です。 – AChampion

答えて

0

あなたはCSVからあなたのデータフレームを読んでデフォルトでは、そのデータをの文字列として読み込みます。これらの値が数値であることを期待しているデータフレームの行を使用しようとすると(そのうち1を引いて)、失敗します。

dtype(すべての列に適用するか、または列ごとにマッピングする)を指定するか、またはconvertersマッピングでパスを使用します(変換インデックスまたは列名を変換関数にマッピングする)。データは(エポックからの秒数でID番号、評価およびタイムスタンプ)すべての整数であることを考えると、簡単な修正はここdtype=np.int32を使用することです:

df = pd.read_csv('ratings.csv', sep=',', names=names, dtype=np.int32) 
関連する問題