2017-05-30 8 views
-2

Ich mache gerade das Movie Recommender System durch kollaboratives Filtern mit Movielens Dataset. Und ich folge this: http://blog.ethanrosenthal.com/2015/11/02/intro-to-collaborative-filtering/In Python, TypeError: nicht unterstützte Operandentyp (en) für -: 'str' und 'int'

aber nicht bei ln Arbeit [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)) 

und es gibt Fehler wie folgt aus:

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

Die 'Exception' klar - Sie' row's halten 'Str's. – AChampion

Antwort

0

Sie lesen Ihre Datenrahmen von CSV Standardmäßig werden diese Daten als Strings gelesen. Sie versuchen dann, Zeilen aus dem Datenframe zu verwenden, die erwarten, dass diese Werte Zahlen sind (von denen 1 subtrahiert wird), und das schlägt fehl.

Geben Sie entweder dtype an (für alle Spalten oder für eine Zuordnung pro Spalte), oder verwenden Sie pass in einer converters-Zuordnung (Zuordnung Spaltenindex oder Spaltenname zu einer Konvertierungsfunktion). Da die Daten aller ganzen Zahlen (id Nummern, Bewertungen und Zeitstempel in Sekunden seit der Epoche), wäre eine schnelle Lösung dtype=np.int32 sein, hier zu verwenden:

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