Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

ValueError: Could not interpret input 'original_language'

Executei o comando conforme descrito em aula/transcrição:

linguas_dos_filmes_sem_en = tmdb.query("original_language != 'en'").original_language.value_counts()
sns.catplot(x = "original_language", data= linguas_dos_filmes_sem_en, kind="count")

porém o mesmo apresenta erro:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-44-5fe6a91587d2> in <module>()
      1 linguas_dos_filmes_sem_en = tmdb.query("original_language != 'en'").original_language.value_counts()
----> 2 sns.catplot(x = "original_language", data= linguas_dos_filmes_sem_en, kind="count")

2 frames
/usr/local/lib/python3.7/dist-packages/seaborn/categorical.py in establish_variables(self, x, y, hue, data, orient, order, hue_order, units)
    151                 if isinstance(var, str):
    152                     err = "Could not interpret input '{}'".format(var)
--> 153                     raise ValueError(err)
    154 
    155             # Figure out the plotting orientation

Ao fazer a modificação abaixo, ele roda como deveria:

linguas_dos_filmes_sem_en = tmdb.query("original_language != 'en'")#.original_language.value_counts()
sns.catplot(x = "original_language", data= linguas_dos_filmes_sem_en, kind="count")

Por que um roda e o outro não?

1 resposta
solução!

Olá, tudo bem? O problema no código de cima é que o seaborn normalmente recebe um DataFrame pelo atributo data, e depois um parâmetro x, com a coluna do DataFrame que vai ser colocada no eixo x. Dependendo do tipo de gráfico, também podemos passar um parâmetro y, com a coluna que ficará no eixo do y. No caso de cima, o que está sendo passado não é um DataFrame, mas sim uma Series, que corresponde a coluna original_language do DataFrame:

linguas_dos_filmes_sem_en = tmdb.query("original_language != 'en'").original_language.value_counts()
sns.catplot(x = "original_language", data= linguas_dos_filmes_sem_en, kind="count")

# Passando somente a coluna original_language e não o DataFrame inteiro
# Cada coluna de um DataFrame é uma Series

Se fizermos o print da variável linguas_dos_filmes_sem_en, veremos que ela é uma Series com o index sendo a língua do filme, e os valores sendo o número de vezes que cada língua aparece, ou seja, não existe uma coluna chamada original_language, até porque uma Series não tem colunas. Essa abordagem não está errada, ela somente não segue o padrão do seaborn. Se usarmos outra biblioteca, como o matplotlib, esse código funcionaria. Agora o código de baixo, que está funcionando:

# A variável que está sendo passada para o seaborn dessa vez é um DataFrame e não uma Series

linguas_dos_filmes_sem_en = tmdb.query("original_language != 'en'")
sns.catplot(x = "original_language", data= linguas_dos_filmes_sem_en, kind="count")

Repare que nesse código, não foi preciso chamar a função value_counts() do pandas, isso acontece porque a função catplot do seaborn está recebendo o parâmetro kind="count", então o próprio seaborn faz esse trabalho para nós. No geral, o matplotlib é uma biblioteca de mais baixo nível, que por um lado permite uma customização bem maior, porém mais trabalhosa, enquanto o seaborn, facilita muito a parte de criar o gráfico e também de preparar os dados para fazer a visualização deles.