Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

erro código pronto

ola, ao rodar o codigo pronto abaixo na versao 1.0.4 do pandas

# código pronto: teste

interesse = enem_eda[["nota_total", "NU_NOTA_LC", "NU_NOTA_MT", "NU_NOTA_COMP3"]]

interesse['top_p'] = top_p(interesse['nota_total'])

interesse = interesse[["top_p", "NU_NOTA_LC", "NU_NOTA_MT", "NU_NOTA_COMP3"]]

acontecia o seguinte Warning:

`<ipython-input-154-a4d6e5204bd7>:4: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  interesse['top_p'] = top_p(interesse['nota_total'])`

abri uma célula de código par que conseguisse verificar teste o código e o mesmo Warning aparecia e também ao verificar o que ela retornava, a coluna retornava nan.

então decidi testar e ver se o problema estava na minha função, então decidi fazer o seguinte teste

top_p(enem_eda["nota_total"])

ele retornou um series com o resultado esperado, e o enem_eda["nota_total"] teoricamente tem os mesmos dados do interesse['nota_total']. Apos fazer esse teste imagino que o problema não esteja em minha função, mas sim no código pronto

como posso resolver o problema no código pronto ?

2 respostas
solução!

Olá Edu.

Dois pontos:

  • Primeiro, o Warning está sendo sim gerado pelo código pronto, mas ele apenas é uma recomendação que o Pandas faz, que diz que você utilize o método .loc invés do operador [ ] nessa situação, você pode encontrar detalhes dessa discussão na documentação.

    interesse = enem_eda.loc[:,["nota_total", "NU_NOTA_LC", "NU_NOTA_MT", "NU_NOTA_COMP3"]]

    Basta substituir essa essa linha para o Warning não aparecer mais, reforço que isso não muda o funcionamento da operação é apenas uma recomendação do Pandas.

  • Segundo, o fato da sua coluna top_p estar com valores nan está sendo causado porque a Series que está retornando da função top_p não estar indexada com os mesmo índices que o DataFrame interesse, dessa maneira quando você atribui essa serie a uma nova coluna do interesse ele não consegue colocar os valores nas linhas corretas.

    interesse['top_p'] = top_p(interesse['nota_total'])

    Para resolver isso você deve na função top_p, atribuir os mesmo índices da serie que você recebe como parâmetro, para a série que você retorna na função.

    y = pd.Series(## sua implementação para criar a série, index=serie.index)

    Sua implementação pode estar diferente do proposto por mim, mas o importante é o segundo parâmetro onde forçamos que o índice da nossa nova Series seja o mesmo da serie recebida por parâmetro (index=serie.index). Podemos encontrar mais detalhes na documentação, mas o importante é que se você não passa o parâmetro index, ela vai utilizar o padrão e então não será compatível com o nosso DataFrame.

Espero ter ajudado, qualquer duvida não hesite em perguntar.

Bons Estudos.

ok, muito obrigado pela resposta !!