2017-05-30 1 views
-2

Je suis en train de créer un système Movie Recommender par filtrage collaboratif en utilisant le jeu de données Movielens. Je suis this: http://blog.ethanrosenthal.com/2015/11/02/intro-to-collaborative-filtering/En Python, TypeError: type (s) d'opérande non supporté (s) pour -: 'str' et 'int'

mais il ne fonctionne pas Dans [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)) 

et il y a erreur comme ceci:

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

Le 'Exception' est clair - vous' row's attente 'str's. – AChampion

Répondre

0

Vous lisez votre dataframe de CSV , la valeur par défaut est de lire ces données comme chaînes. Vous essayez ensuite d'utiliser les lignes de l'image attendez que ces valeurs soient des nombres (en en soustrayant 1) et cela échoue. Vous pouvez spécifier un dtype (pour appliquer à toutes les colonnes ou utiliser un mappage par colonne) ou utiliser un mappage converters (mappage de l'index de colonne ou du nom de colonne à une fonction de conversion). Étant donné que les données sont tous les entiers (numéros d'identification, notes et horodatages en quelques secondes depuis une époque), une solution rapide serait d'utiliser dtype=np.int32 ici:

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