1
resposta

Problemas com a def novo_usuario(dados)

Então, estou tendo problemas para conseguir as recomendações para o novo usuário. Eu criei as funções direitinho e até antes disso estava funcionando. Quando eu passo sugere_para(611) ele me retorna os mesmos resultados de notas, só que em outra ordem. Ou seja, ele não sugeriu filmes novos, ele simplesmente sugeriu todos da mesma lista. Não sei o que fiz de errado, vou colocar os códigos aqui, começando do fim do módulo passando, onde o professor escrever o kmn. O único ponto diferente é que os dados do professor é diferente do sugerido no início, então eu tenho menos dados que ele, por isso na hora de passar o "sugere_para" o número é diferente do dele.

def knm(voce_id, k_mais_proximos = 10, numero_de_usuarios_a_analisar = None):
    distancias = distancia_de_todos(voce_id, numero_de_usuarios_a_analisar = numero_de_usuarios_a_analisar)
    distancias = distancias.sort_values('distancia')
    distancias = distancias.set_index('outra_pessoa').drop(voce_id)
    return distancias.head(k_mais_proximos)
def sugere_para(voce, k_mais_proximos = 10, numero_de_usuarios_a_analisar = None):
    notas_de_voce = notas_do_usuario(voce)
    filmes_que_voce_ja_viu = notas_de_voce.index

    similares = knm(voce, k_mais_proximos = k_mais_proximos, numero_de_usuarios_a_analisar = numero_de_usuarios_a_analisar)
    usuarios_similares = similares.index
    notas_dos_similares = notas.set_index('usuarioId').loc[usuarios_similares]
    recomendacoes = notas_dos_similares.groupby('filmeId').mean()[['nota']]
    recomendacoes = recomendacoes.sort_values('nota', ascending = False)
    return recomendacoes.join(filmes)
def novo_usuario(dados):
    novo_usuario = notas['usuarioId'].max()+1
    notas_do_usuario_novo = pd.DataFrame(dados, columns = ['filmeId', 'nota'])
    notas_do_usuario_novo['usuarioId'] = novo_usuario
    return pd.concat([notas, notas_do_usuario_novo])
notas = novo_usuario([[122904,2],
                      [1246, 5],
                      [2529, 2],
                      [2329, 5],
                      [2324, 5],
                      [1, 2],
                      [7, 0.5],
                      [2, 2],
                      [1196, 1],
                      [260, 1]
])
notas['usuarioId'].max()

Resultado: 611

sugere_para(611)

A ordem dos filmes que saiu foi: 1246, 2324, 2329, 1, 2, 2529, 122904, 260, 1196, 7. Inclusive tentei mudar o k_mais_proximo para outros valores, mas não mudou o resultado. Se eu mudar essa função sugere_para pra outros valores ele retona o resultado certo, porém, para o novo usuário que criei ele dá errado.

Foi mal a mensagem grande e valeu quem puder ajudar!!

1 resposta

Olá, Caio! Tudo bom com você?

Primeiro, peço desculpas pela demora em te responder.

Segundo, não tem problema você mandar uma mensagem grande! Estamos dispostos a te ajudar, e quanto mais detalhado você nos explicar sua dúvida, melhor a solução vai ser dada ;-)

Agora quanto ao erro, eu fiz o teste com o código do professor usando um banco de dados menor do que ele usou nas aulas, não sei se é o mesmo que o seu, mas o novo usuário também ficou como 611. Ao executar sugere_para(611) eu obtive um resultado esperado para a aplicação, ou seja, sem o seu erro mostrado na pergunta. Verifiquei todas as funções que você enviou e estão iguais as que eu utilizei no teste. Então, para ter uma melhor ideia do que pode ter acontecido, eu gostaria de pedir para você compartilhar seu código completo comigo, incluindo o banco de dados. Você pode me enviar através de um link do github, ou qualquer outro que você se sinta mais confortável.

Eu fico no aguardo do seu retorno!