ImportError: Nenhum módulo chamado dateutil.parser

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

Estou recebendo o seguinte erro ao importar pandas em um programa Python

monas-mbp:book mona$ sudo pip install python-dateutil Requisito já satisfeito (use --upgrade para atualizar): python-dateutil em /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python Limpando... monas-mbp:book mona $ python t1.py Nenhum módulo chamado dateutil.parser Traceback (última chamada mais recente): Arquivo "t1.py", linha 4, em <module> import pandas as pd File "/Library/Python/2.7/site-packages/pandas/__init__.py", linha 6, em <module> a partir de . import hashtable, tslib, lib Arquivo "tslib.pyx", linha 31, init pandas.tslib (pandas/tslib.c:48782) ImportError: Nenhum módulo chamado dateutil.parser 

Também aqui está o programa:

import codecs from math import sqrt import numpy as np import pandas as pd users = {"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, "Slightly 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 classe: def __init__(self, data, k=1, metric= "pearson", n=5): """ inicializa o recomendador atualmente, se os dados forem dicionário, o recomendador será inicializado nele. Para todos os outros tipos de dados, nenhuma inicialização ocorre k é o valor k para k métrica do vizinho mais próximo é qual fórmula de distância usar n é o número máximo de recomendações a serem feitas""" self.k = k self.n = n self .username2id = {} self.userid2name = {} self.productid2name = {} # por algum motivo quero salvar o nome da métrica self.metric = metric if self.metric == "pearson": self.fn = self .pearson # # se os dados forem um dicionário, defina os dados de recomendação para eles # if type(data).__name__ == "dict": self.data = data def convertProductID2name(self, id): """Dado número de identificação do produto retorna nome do produto """ if id in self.productid2name: return self.productid2name[id] else: return id def userRatings(self, id, n): """Retorna n classificações principais para o usuário com id""" print ("Classificações para " + self.userid2name[id]) classificações = self.data[id] print(len(ratings)) classificações = list(ratings.items()) classificações = [(self.convertProductID2name(k), v) for (k) , v) in ratings] # finalmente classifica e retorna 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 =""): """carrega o conjunto de dados do livro BX. Path é onde os arquivos BX estão localizados""" self.data = {} i = 0 # # Primeiro carregue as classificações do livro em self.data # f = codecs.open(path + "BX-Book-Ratings.csv", " r", "utf8") para linha em f: i += 1 #separar linha em campos campos = line.split(";") usuário = campos[0].strip(""") livro = campos[1] .strip(""") rating = int(fields[2].strip().strip(""")) se usuário em self.data: currentRatings = self.data[user] else: currentRatings = {} currentRatings[ book] = rating self.data[user] = currentRatings f.close() # # Agora carregue livros em self.productid2name # Livros contém isbn, título e autor entre outros campos # f = codecs.open(path + "BX- Books.csv", "r", "utf8") for line in f: i += 1 #separate line into fields fields = line.split(";") isbn = fields[0].strip(""") title = fields[1].strip(""") autor = fields[2].strip().strip(""") title = title + " by " + autor self.productid2name[isbn] = title f.close () # # Agora carregue as informações do usuário em self.userid2name e # self.username2id # f = codecs.open(path + "BX-U sers.csv", "r", "utf8") for line in f: i += 1 #print(line) #separate line into fields fields = line.split(";") userid = fields[0].strip (""") local = campos[1].strip(""") if len(campos) > 3: idade = campos[2].strip().strip(""") else: idade = "NULL" if idade != "NULL": valor = localização + " (idade: " + idade + ")" else : valor = localização self.userid2name[userid] = valor self.username2id[location] = userid f.close() print(i) def pearson(self, rating1, rating2): sum_xy = 0 sum_x = 0 sum_y = 0 sum_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) sum_y2 += pow(y, 2) if n == 0: return 0 # agora calcula o 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): """cria uma lista ordenada de usuários com base na distância até o nome de usuário""" distances = [] por exemplo em self.data: if instance != username: distance = self.fn(self.data[username], self.data[instance]) distances.append(( instância, distância)) # ordena com base em d istance -- mais próximo primeiro distances.sort(key=lambda artistTuple: artistTuple[1], reverse=True) return distances def recomen(self, user): """Dar lista de recomendações""" recomendações = {} # first get lista de usuários ordenada por proximidade mais próxima = self.computeNearestNeighbor(user) # # agora obtenha as classificações para o usuário # userRatings = self.data[user] # # determine a distância total totalDistance = 0,0 para i in range(self.k) : totalDistance += near[i][1] # agora iterar pelos k vizinhos mais próximos # acumulando suas classificações para i in range(self.k): # calcula fatia do peso da torta = mais próximo[i][1] / totalDistance # obter o nome da pessoa name = mais próximo[i][0] # obter as classificações para esta pessoa neighborRatings = self.data[name] # obter o nome da pessoa # agora encontrar bandas que o vizinho avaliou esse usuário não para o artista em vizinhoRatings: se não for artista em userRatings: se artista não estiver em recomendações: recomendações[artista] = (neighborRatings[artista] * peso) else: recomendações[arti st] = (recommendations[artist] + neighborRatings[artist] * weight) # agora faz uma lista do dicionário recomendações = list(recommendations.items()) recomendações = [(self.convertProductID2name(k), v) for (k, v ) nas recomendações] # finalmente ordena e retorna recomendações.sort(key=lambda artistTuple: artistTuple[1], reverse = True) # Retorna os primeiros n itens return recomendações[:self.n] r = recomendador(usuários) # O autor implementação r.loadBookDB("/Users/mona/Downloads/BX-Dump/") classificações = pd.read_csv("/Users/danialt/BX-CSV-Dump/BX-Book-Ratings.csv", sep="; ", quotechar=""", escapechar="") livros = pd.read_csv("/Users/danialt/BX-CSV-Dump/BX-Books.csv", sep=";", quotechar=""" , escapechar="") users = pd.read_csv("/Users/danialt/BX-CSV-Dump/BX-Users.csv", sep=";", quotechar=""", escapechar="") pivot_rating = ratings.pivot(index="User-ID", columns="ISBN", values="Book-Rating")