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

Boxplot para cada categoria

Bom dia galera! Estou meio travado na questão onde é solicitado para criar um boxplot para cada categoria de filme. Até consegui criar, porém em gráficos separados. Alguém poderia dar alguma dica? Segue o código que utilizei abaixo:

for i in votos_por_genero_por_filme:
  for j in votos_por_genero_por_filme.columns:
    total_votos = votos_por_genero_por_filme.loc[:, j]
    total_votos = total_votos.loc[lambda x: x !=0]
    fig, ax = plt.subplots()
    ax.figure.set_size_inches(12,6) 
    ax.boxplot(total_votos)

plt.show()

Obrigado desde já :)

6 respostas

Bom dia Andre!

Para gerar em um mesmo gráfico recomendo fazer direto com o boxplot do matplotlib:

# Pega os dados para o boxplot de action
total_action = filmes.query('Action == 1')['total_de_votos']
# Pega os dados para o boxplot de horror
total_horror = filmes.query('Horror == 1')['total_de_votos']
# E assim por diante para as demais categorias (essa parte pode ser melhorada/otimizada)

# Agora com todos os dados separados geramos o boxplot (exemplo com apenas 2 generos)
plt.boxplot([total_action, total_horror], labels=['Ação', 'Horror'])

Esse seria um modo bem simples e manual de fazer, e você pode evoluir esse código de várias maneiras, mostrei o mais básico pra não entregar logo a resposta, mas se tiver qualquer dúvida é só falar!

Dá uma olhada nesse tópico também que tem mais algumas dicas.

Bom dia Lucas, pensei exatamente nesse código, porém como disse ficaria bem manual. E tentando otimizar isso cheguei no código que enviei acima. Seguindo nessa linha, tive problemas ao com os parâmetros da query ao usar o for ou o list comprehension. Como poderia passar os parâmetros para a query de modo que ela iterasse com uma lista?

solução!

Entendi, segue um exemplo de como fazer o query dinamicamente:

lista_votos_por_genero = []

for genero in generos.columns:
    # Aqui como o query recebe uma string podemos manipular o seu valor
    votos = filmes.query(f'{genero} == 1')['total_de_votos']
    lista_votos_por_genero.append(votos)


plt.boxplot(lista_votos_por_genero, labels=generos.columns)

Ainda dá pra transformar esse for no list comprehension, e fica o desafio. Novamente qualquer dúvida é só falar!

Perfeito! Muito Obrigado! Só mais uma dúvida, essa manipulação que fez dentro da query tem algum nome específico? Onde posso buscar mais informações sobre esses tipos de manipulações dentro de funções?

Essa manipulação é apenas manipulação de string normal do python, esse específica que eu usei é chamada de f-string e é algo novo do python 3:

nome = 'Andre'
ola = f'Olá {nome}, bom dia!'

print(ola)

Mas isso pode ser feito de várias outras maneiras, por exemplo:

# União de strings
genero = 'Action'
votos = filmes.query(genero + ' == 1')['total_de_votos']

Perfeito! Obrigado!