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

Exercitando conhecimento Pandas

Olá, pessoal. Tudo bom?

Recentemente completei o curso 'Python para Data Science: Funções, Pacotes e Pandas básico' e resolvi praticar!

Tenho um projeto com uns amigos em que estamos estudando sobre os melhores filmes de terror de todos os tempos e eu resolvi tentar fazer esta pesquisa utilizando o que eu aprendi aqui na Alura.

Utilizei o Dataset do IMBd que baixei no Kaggle (está um pouco desatualizado mas o propósito maior foi a prática mesmo).

Estou colocando o código aqui abaixo e gostaria muito de saber se o código ficou bom, se tem algo para melhorar, dicas, sugestões, sei lá.

# Imports
import pandas as pd


# Abrindo os arquivos
data_filmes = pd.read_csv('IMDb_Movies/IMDb movies.csv')
data_notas = pd.read_csv('IMDb_Movies/IMDb ratings.csv')


# Transformando os gêneros em uma lista
data_filmes.genre = data_filmes.genre.str.split(',')


# Separando só os dados importantes para a pesquisa
data_filmes = data_filmes[['original_title','year', 'genre']]
data_notas = data_notas[['weighted_average_vote', 'mean_vote']]


# Concatenando os dois arquivos
dataset = pd.concat([data_filmes, data_notas], axis = 1)


# Colocando todos os filmes que possuam o gênero 'Horror' em uma nova lista
# E transformando num dataframe
dataset_horror = []

for z in range(len(dataset)):
    for y in dataset.genre[z]:
        if y.strip() == 'Horror':
            dataset_horror.append(dataset.iloc[z].values)      

dataset_horror = pd.DataFrame(dataset_horror)


# Filtrando os melhores filmes (média e média ponderada a partir de 8)
# Adicionando-os em uma nova lista e transformando num dataframe
filmes_para_assistir = []

for x in range(len(dataset_horror)):
    if dataset_horror[3][x] >= 8 and dataset_horror[4][x] >= 8:
        filmes_para_assistir.append(dataset_horror.iloc[x].values)

filmes_para_assistir = pd.DataFrame(filmes_para_assistir)


# Adicionando uma nova média das médias (???) para colocar os filmes
# Ordenados por este novo valor
for index, row in filmes_para_assistir.iterrows():
    filmes_para_assistir.loc[index, 5] = (row[3] + row[4]) / 2


# Adicionando nomes às colunas, ordenando e arrumando o index
filmes_para_assistir.columns = ['Título', 'Ano', 'Gênero', 'Média ponderada', 'Média Aritmética', 'Média']
filmes_para_assistir.sort_values(by = 'Média', ascending = False, inplace = True)
filmes_para_assistir.index = range(filmes_para_assistir.shape[0])


# Exportando
filmes_para_assistir.to_csv('IMDb_Movies/Filmes_terror_para_assistir.csv', index = False, encoding = 'utf-8')

Ps.: Teve um bug na hora de exportar em que as acentuações não funcionaram : (

1 resposta
solução!

Boas Rodrigo! Tudo bem? Espero que sim! Perdoe a demora em responder seu tópico. Primeiro vou apontar algumas coisas que gostei no seu código, depois algumas decisões mais gerais que acho que podem melhorar e por fim algumas coisas que eu teria feito de outras maneiras e os porquês. Eu gostei muito do seu código! É muito legal que você usou o que aprendeu no curso para aplicar em alguma coisa que é palpável pra você. De maneira geral, seu código está muito bem organizado e legível, os comentários são excelentes, assim como os nomes das váriáveis são muito claros. Parabéns!


Algumas considerações gerais:

  • Eu não colocaria o nome das variáveis misturando inglês e portugues, como é o caso em data_filmes e data_notas, porque fica ambíguo. Sugiro escolher uma língua para o código e se manter nela.
  • Normalmente, tentamos evitar bastante o uso de for e estruturas de repetição quando estamos trabalhando com Data Frames, pois eles possuem suas prórpias ferramentas para fazer consultas sem a necessidade desses laços (vou demonstrar abaixo);
  • Trabalhar com listas em uma coluna tende a ser bastante difícil em um Data Frame, aconselho a trabalhar como string (também vou demonstrar)

Trabalhando com a coluna genre

Quando você você transformou a coluna genre em uma lista, acaba que fica bastante complexo trabalhar com isso. Uma alternativa é manter o genre como string e fazer uma verificação se dentro dessa string contém 'Horror'. Veja o código abaixo:

# selecionando apenas filmes de Horror
selecao_horror = dataset.genre.str.contains('Horror')
filmes_horror = dataset[selecao_horror]

Dessa forma, usamos a função genre.str.contains() para fazer a seleção e depois montamos um novo Data Frame a partir dela, eliminando a necessitade de um bloco for.


Filtrando os melhores filmes (médias acima de 8)

Aqui, cai no mesmo caso de usar uma função do pandas para eliminar a necessidade de um bloco de repetição:

filmes_com_media_maior_do_que_8 = filmes_horror.query('weighted_average_vote > 8 and mean_vote > 8')

Dessa forma, podemos filtrar em uma linha os filmes de acordo com os critérios que você colocou usando a função pd.query().

Obtendo a média geral

Da mesma forma que a função anterior, podemos manipular os dados sem a necessidade de um laço:

filmes_com_media_maior_do_que_8['Media Geral'] = (filmes_com_media_maior_do_que_8['mean_vote'] + filmes_com_media_maior_do_que_8['weighted_average_vote']) /2

Considerações finais

Eu quis trazer alguns pontos que ahei que são importantes e que podem facilitar a sua vida. Mas não se esqueça que de qualquer forma, seu código está excelente e você conseguiu com organização e eficiência chegar no resultado desejado.

Sobre o bug dos acentos, eu fiz o teste no collab e não tive esse problema. Qualquer dúvida pode entrar em contato.

Espero ter ajudado! Bons estudos!