ImportError: ningún módulo llamado dateutil.parser

| | | | | | | | | | | | | | | | | | | | | | | | | | | |

Recibo el siguiente error al importar pandas en un programa Python

monas-mbp:book mona$ sudo pip install python-dateutil Requisito ya satisfecho (use --upgrade para actualizar): python-dateutil en /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python Limpiando... monas-mbp:book mona $ python t1.py Ningún módulo llamado dateutil.parser Rastreo (última llamada más reciente): archivo "t1.py", línea 4, en <módulo> importar pandas como archivo pd "/Library/Python/2.7/site-packages/pandas/__init__.py", línea 6, en <module> desde . import hashtable, tslib, lib Archivo "tslib.pyx", línea 31, en init pandas.tslib (pandas/tslib.c:48782) ImportError: Ningún módulo llamado dateutil.parser 

También aquí está el programa:

importar códecs de matemáticas importar sqrt importar numpy como np importar pandas como pd usuarios = {"Angelica": {"Blues Traveler": 3.5, "Broken Bells": 2.0, "Norah Jones": 4.5, "Phoenix": 5.0, "Slightly Stoopid": 1.5, "The Strokes": 2.5, "Vampire Weekend": 2.0}, "Bill":{"Blues Traveler": 2.0, " Broken Bells": 3.5, "Deadmau5": 4.0, "Phoenix": 2.0, "Slightly Stoopid": 3.5, "Vampire Weekend": 3.0}, "Chan": {"Blues Traveler": 5.0, "Broken Bells": 1.0, "Deadmau5": 1.0, "Norah Jones": 3.0, "Phoenix": 5, "Ligeramente Stoopid": 1.0}, "Dan": {"Blues Traveler": 3.0, "Broken Bells": 4.0, "Deadmau5 ": 4.5, "Phoenix": 3.0, "Slightly Stoopid": 4.5, "The Strokes": 4.0, "Vampire Weekend": 2.0}, "Hailey": {"Broken Bells": 4.0, "Deadmau5": 1.0, "Norah Jones": 4.0, "The Strokes": 4.0, "Vampire Weekend": 1.0}, "Jordyn": {"Broke n Bells": 4.5, "Deadmau5": 4.0, "Norah Jones": 5.0, "Phoenix": 5.0, "Slightly Stoopid": 4.5, "The Strokes": 4.0, "Vampire Weekend": 4.0}, "Sam" : {"Blues Traveler": 5.0, "Broken Bells": 2.0, "Norah Jones": 3.0, "Phoenix": 5.0, "Slightly Stoopid": 4.0, "The Strokes": 5.0}, "Veronica": {" Blues Traveler": 3.0, "Norah Jones": 5.0, "Phoenix": 4.0, "Slightly Stoopid": 2.5, "The Strokes": 3.0} } recomendador de clase: def __init__(self, data, k=1, metric= "pearson", n=5): """ inicializa el recomendador actualmente, si los datos son un diccionario, el recomendador se inicializa en él. Para todos los demás tipos de datos, no se produce inicialización k es el valor k para k la métrica del vecino más cercano es qué fórmula de distancia usar n es el número máximo de recomendaciones para hacer """ self.k = k self.n = n self .username2id = {} self.userid2name = {} self.productid2name = {} # por alguna razón quiero guardar el nombre de la métrica self.metric = metric if self.metric == "pearson": self.fn = self .pearson # # si los datos son datos de recomendación establecidos por diccionario # if type(data).__name__ == "dict": self.data = data def convertProductID2name(self, id): """Dado el número de identificación del producto devolver el nombre del producto """ if id in self.productid2name: return self.productid2name[id] else: return id def userRatings(self, id, n): """Return n top ratings for user with id""" print ("Calificaciones para " + self.userid2name[id]) ratings = self.data[id] print(len(ratings)) ratings = list(ratings.items()) ratings = [(self.convertProductID2name(k), v) for (k , v) in ratings] # finalmente ordenar y devolver ratings.sort(key=lambda ar tistTuple: artistTuple[1], reverse = True) ratings = ratings[:n] for rating in ratings: print("%s %i" % (rating[0], rating[1])) def loadBookDB(self, path =""): """carga el conjunto de datos del libro BX. La ruta es donde se encuentran los archivos BX""" self.data = {} i = 0 # # Primero cargue las clasificaciones de libros en self.data # f = codecs.open(ruta + "BX-Book-Ratings.csv", " r", "utf8") para línea en f: i += 1 #separar línea en campos campos = línea.dividir(";") usuario = campos[0].strip(""") libro = campos[1] .strip(""") rating = int(fields[2].strip().strip(""")) if user in self.data: currentRatings = self.data[user] else: currentRatings = {} currentRatings[ book] = rating self.data[user] = currentRatings f.close() # # Ahora cargue libros en self.productid2name # Books contiene isbn, título y autor entre otros campos # f = codecs.open(ruta + "BX- Books.csv", "r", "utf8") para línea en f: i += 1 #separar línea en campos campos = línea.split(";") isbn = campos[0].strip(""") título = campos[1].strip(""") autor = campos[2].strip().strip(""") título = título + " por " + autor self.productid2name[isbn] = título f.close () # # Ahora carga la información del usuario tanto en self.userid2name como en # self.username2id # f = codecs.open(path + "BX-U sers.csv", "r", "utf8") para línea en f: i += 1 #imprimir(línea) #separar línea en campos campos = línea.split(";") ID de usuario = campos[0].strip (""") ubicación = campos[1].strip(""") if len(campos) > 3: edad = campos[2].strip().strip(""") else: edad = "NULL" if edad != "NULL": valor = ubicación + " (edad: " + edad + ")" else : valor = ubicación self.userid2name[userid] = valor self.username2id[ubicación] = userid f.close() print(i) def pearson(self, rating1, rating2): suma_xy = 0 suma_x = 0 suma_y = 0 suma_x2 = 0 sum_y2 = 0 n = 0 for key in rating1: if key in rating2: n += 1 x = rating1[key] y = rating2[key] sum_xy += x * y sum_x += x sum_y += y sum_x2 += pow(x, 2) suma_y2 += pow(y, 2) si n == 0: devuelve 0 # ahora calcula el denominador denominador = (sqrt(sum_x2 - pow(sum_x, 2) / n) * sqrt(sum_y2 - pow( sum_y, 2) / n)) if denominador == 0: return 0 else: return (sum_xy - (sum_x * sum_y) / n) / denominador def computeNearestNeighbor(self, username): """crea una lista ordenada de usuarios basada en en su distancia al nombre de usuario""" distancias = [] por ejemplo en self.data: if instancia != nombre de usuario: distancia = self.fn(self.data[username], self.data[instancia]) distancias.append(( instancia, distancia)) # ordenar basado en d istance -- distancias más cercanas primero.sort(key=lambda artistTuple: artistTuple[1], reverse=True) devolver distancias def recomendar(self, user): """Dar lista de recomendaciones""" recomendaciones = {} # primero obtener lista de usuarios ordenados por cercanía más cercano = self.computeNearestNeighbor(user) # # ahora obtenga las calificaciones para el usuario # userRatings = self.data[user] # # determine la distancia total totalDistance = 0.0 para i in range(self.k) : distancia total += más cercano [i] [1] # ahora iterar a través de los k vecinos más cercanos # acumulando sus calificaciones para i en el rango (self.k): # calcular el peso de la porción del pastel = más cercano [i] [1] / totalDistance # obtener el nombre de la persona nombre = más cercano [i] [0] # obtener las calificaciones de esta persona vecinos Calificaciones = self.data [nombre] # obtener el nombre de la persona # ahora encontrar bandas vecinos calificados que el usuario no calificó como artista in NeighborRatings: si no es artista in UserRatings: si no es artista en recomendaciones: recomendaciones[artista] = (neighborRatings[artista] * peso) else: recomendaciones[arti st] = (recomendaciones[artista] + vecinosCalificaciones[artista] * peso) # ahora hacer una lista a partir del diccionario recomendaciones = lista(recomendaciones.elementos()) recomendaciones = [(self.convertProductID2name(k), v) for (k, v ) en recomendaciones] # finalmente ordene y devuelva recomendaciones.sort(key=lambda artistTuple: artistTuple[1], reverse = True) # Devuelva los primeros n elementos devuelva recomendaciones[:self.n] r = recomendador(usuarios) # El autor implementación r.loadBookDB("/Users/mona/Downloads/BX-Dump/") ratings = pd.read_csv("/Users/daniat/BX-CSV-Dump/BX-Book-Ratings.csv", sep="; ", quotechar=""", escapechar="") libros = pd.read_csv("/Users/danialt/BX-CSV-Dump/BX-Books.csv", sep=";", quotechar=""" , escapechar="") usuarios = pd.read_csv("/Usuarios/danialt/BX-CSV-Dump/BX-Users.csv", sep=";", quotechar=""", escapechar="") pivot_rating = ratings.pivot(index="User-ID", column="ISBN", valores="Book-Rating")