1
resposta

distanciaTodos() got an unexpected keyword argument 'n'

Nos outros códigos minha variável n (nº de usuários para analisar) rodou normalmente, mas não estou conseguindo entender o porquê do 'n' estar dando problema.

def maisProximosde(voceID, n_maisProximos = 10, n = None):
    distancias = distanciaTodos(voceID, n = n)
    distancias = distancias.sort_values("distancias")
    distancias = distancias.set_index("outro_usuario").drop(voceID)
    return distancias.head(n_maisProximos)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Oii Tiago, como você está?

Sinto muito pela demora em obter um retorno.

Esse erro ocorre quando chamamos a função passando o argumento de forma nomeada e o nome que passamos não condiz com o nome original do parâmetro.

Para exemplificar, veja a função soma que possui dois parâmetros: a e b:

def soma(a, b):
 return a + b

Ao chamarmos a função passando os argumentos de forma posicional, ou seja, primeiro o valor de a e depois o valor de b teremos o seguinte resultado:

soma(3, 4)

# Resultado: 7

Agora, passando os argumentos de forma nomeada, ou seja, dizendo qual valor é o ae qual valor é o b:

soma(b=3, a=4)
# Resultado 7

Nada mudou, certo?! Porém, se passamos os argumentos de forma nomeada e o parâmetro não existir, por exemplo o x, obteremos o mesmo erro que foi obtido em seu código:

soma(a=3, x=4)
# Resultado: TypeError: soma() got an unexpected keyword argument 'x'

E isso porque a função não possui o parâmetro x, mas sim o parâmetro a e b.

Tendo como base isso, e o log de erro apresentado, a sua função distanciaTodos não possui o parâmetro n, provavelmente está escrito com outro nome, e ao fazer distanciaTodos(voceID, n = n) a função desconhece o parâmetro n, por isso o erro é apresentado.

No código da aula o parâmetro n é chamado de numero_de_usuarios_a_analisar, como mostro abaixo:

def distancia_de_todos(voce_id, numero_de_usuarios_a_analisar = None):
  todos_os_usuarios = notas['usuarioId'].unique()
  if numero_de_usuarios_a_analisar:
    todos_os_usuarios = todos_os_usuarios[:numero_de_usuarios_a_analisar]
  distancias = [distancia_de_usuarios(voce_id, usuario_id) for usuario_id in todos_os_usuarios]
  distancias = list(filter(None, distancias))
  distancias = pd.DataFrame(distancias, columns = ["voce", "outra_pessoa", "distancia"])
  return distancias

E a chamada é feita da seguinte forma:

mais_proximos_de(1, n_mais_proximos = 2, numero_de_usuarios_a_analisar=300)

Faça a análise desses trechos e tente efetuar a correção. Caso não obtenha êxito, compartilhe seu notebook completo para que eu possa te ajudar melhor.

A título de curiosidade, se quiser entender sobre a diferença entre argumento e parâmetro, neste tópico explico a diferença dessas duas palavrinhas.

Qualquer dúvida fico à disposição.

Abraço e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software