<jupyter_start><jupyter_text><jupyter_code>import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# lê a base de dados
filmes = pd.read_csv("https://raw.githubusercontent.com/alura-cursos/introducao-a-data-science/master/aula0/ml-latest-small/movies.csv")

# muda o título das colunas
filmes.columns = ["filmeId", "titulo", "generos"]

# mostra as primeiras linhas do dataframe
filmes.tail()

avaliacoes = pd.read_csv("https://github.com/alura-cursos/introducao-a-data-science/blob/master/aula0/ml-latest-small/ratings.csv?raw=true")
avaliacoes.columns = ["usuarioId", "filmeId", "nota", "momento"]
avaliacoes.head()

# tira a média das notas por filme
media_por_filme = avaliacoes.groupby("filmeId")["nota"].mean()

# junta os filmes as suas respectivas médias.
filmes_com_media = filmes.join(media_por_filme,on = "filmeId")
filmes_com_media = filmes_com_media.rename(columns={'nota': 'nota_media'})
filmes_com_media.sort_values(by="nota_media",ascending=False)

notas_por_filme = avaliacoes.groupby("filmeId")["nota"].count()
filmes_com_media_e_total = filmes_com_media.join(notas_por_filme, on = "filmeId")

filmes_com_media_e_total = filmes_com_media_e_total.rename(columns={'nota': 'total_avaliacoes'})
filmes_com_media_e_total<jupyter_output><empty_output><jupyter_text>Desafio 1 do [<NAME>](https://twitter.com/guilhermecaelum)Rotacionar os thicks (os nomes dos generos) do gráfico de barras verdes (o último), de forma a deixar as legendas mais legíveis.<jupyter_code>sns.set_style("whitegrid")

filmes_por_genero = filmes["generos"].str.get_dummies('|').sum().sort_values(ascending=False)
plt.figure(figsize=(16,8))
sns.barplot(x=filmes_por_genero.index,
            y=filmes_por_genero.values,
            palette=sns.color_palette("BuGn_r", n_colors=len(filmes_por_genero) + 4))

# rotaciona os nomes dos generos
plt.xticks(rotation=45)
plt.show()<jupyter_output><empty_output><jupyter_text>Desafio 2 do [Paulo Silveira](https://twitter.com/paulo_caelum)Encontar vários filmes com médias próximas e distribuições diferentes, use a função **plot_filmes(n)** para plotar.<jupyter_code>def plot_filme(n):
  '''
  -> Plota um histograma e um gráfico de caixa das notas do filme de ID n e
  retorna um describe do Pandas

  -> Parâmetros:
          n: ID do filme que será analizado
  
  -> Return:
          describe do Pandas 
  '''
  notas_do_filme = avaliacoes.query(f"filmeId=={n}")["nota"]
  nome_filme = filmes.query(f"filmeId=={n}")["titulo"].values
  
  print("Filme: ",nome_filme[0])
  notas_do_filme.plot(kind='hist')
  plt.show()
  notas_do_filme.plot.box()
  plt.show()
  
  return notas_do_filme.describe()
plot_filme(260)<jupyter_output>Filme:  Star Wars: Episode IV - A New Hope (1977)<jupyter_text>Desafio 3 do [<NAME>](https://twitter.com/paulo_caelum) Criar o boxplot dos 10 filmes com mais votos (não é com maior média, é com mais votos!). Não apenas plot mas também analise e tente tirar conclusões.<jupyter_code>top10_mais_votos = filmes_com_media_e_total.sort_values("total_avaliacoes",
                                                        ascending=False).head(10)
top10_mais_votos_titulos = top10_mais_votos["titulo"].to_list()
top10_mais_votos_ids = top10_mais_votos['filmeId'].to_list()
print(top10_mais_votos_titulos)
print(top10_mais_votos_ids)
plt.figure(figsize=(20,8))
cx = sns.boxplot(data=avaliacoes.query("filmeId in @top10_mais_votos_ids"),
            x="filmeId", y="nota")

# Montagem do boxplot
cx.set_xticklabels(top10_mais_votos_titulos, fontsize=12)
cx.set_xlabel("Filme", fontsize=16)
cx.set_ylabel("Nota", fontsize=16)
plt.xticks(rotation=45)

plt.show()<jupyter_output><empty_output><jupyter_text>Desafio 4 do [<NAME>](https://twitter.com/guilhermecaelum)Configurar a visualização do boxplot gerado pelo seaborn (último boxplot plotado na aula). Configurar o tamanho e colocar o nome dos filmes nos thicks.<jupyter_code># <NAME>
# Foi feito algo parecido na questão 3
plt.figure(figsize=(12, 6))
ax = sns.boxplot(data = avaliacoes.query("filmeId in [1,2,919,46578]"), x="filmeId", y="nota")

ax.set_xticklabels(filmes.query("filmeId in [1,2,919,46578]")['titulo'], fontsize=12)
ax.set_xlabel("Filme", fontsize=16)
ax.set_ylabel("Nota", fontsize=16)
plt.show()<jupyter_output><empty_output><jupyter_text>Desafio 5 do [<NAME>](https://twitter.com/allanspadini)Calcular moda, média e mediana dos filmes. Explore filmes com notas mais próximas de 0.5, 3 e 5.<jupyter_code># Moda das notas de cada filme
moda_filmes = avaliacoes.groupby("filmeId")["nota"].agg(pd.Series.mode)

# Mediana das notas de cada filme
mediana_filmes = avaliacoes.groupby("filmeId")["nota"].median()

# Monta um novo dataframe com a moda a média e a mediana de cada filme
est_filmes = filmes_com_media.join(moda_filmes, on = "filmeId")
est_filmes = est_filmes.rename(columns={"nota":"nota_moda"})
basic_est_filmes = est_filmes.join(mediana_filmes, on = "filmeId")
basic_est_filmes = basic_est_filmes.rename(columns={"nota":"nota_mediana"})

basic_est_filmes

def explora_filme(filme_id):
  """
  -> Mostra a moda, média e mediana de um filme do dataframe. Não retorna nada

  -> Parâmetro:
        filme_id: ID do filme a ser analisado
  """
  filme = basic_est_filmes.query(f'filmeId == {filme_id}')
  
  print(f"Filme: {filme.iloc[0][1]}")
  print()
  print(f"Moda: {filme.iloc[0][4]}")
  print(f"Média: {filme.iloc[0][3].round(2)}")
  print(f"Mediana: {filme.iloc[0][5]}")
  print("-"*10)

explora_filme(8387)
explora_filme(89386)
explora_filme(3774)
explora_filme(2041)
explora_filme(7541)
explora_filme(160080)
explora_filme(177593)
explora_filme(1178)
explora_filme(4334)<jupyter_output>Filme: Three Billboards Outside Ebbing, Missouri (2017)

Moda: [4.5 5. ]
Média: 4.75
Mediana: 4.75
----------
Filme: Paths of Glory (1957)

Moda: 5.0
Média: 4.54
Mediana: 4.75
----------
Filme: Yi Yi (2000)

Moda: 5.0
Média: 4.6
Mediana: 5.0
----------<jupyter_text>Desafio 6 da [<NAME>](https://twitter.com/thais_tandre)Plotar o boxplot e o histograma um do lado do outro (na mesma figura ou em figuras distintas, mas um do lado do outro).<jupyter_code>def plot_filme_sbs(n):
  '''
  -> Plota um histograma e um gráfico de caixa, lado a lado, das notas do filme 
  de ID n e retorna um describe do Pandas

  -> Parâmetros:
          n: ID do filme que será analizado
  
  -> Return:
          describe do Pandas 
  '''
  notas_do_filme = avaliacoes.query(f"filmeId=={n}")["nota"]
  nome_filme = filmes.query(f"filmeId=={n}")["titulo"].values
  
  print("Filme: ",nome_filme[0])
  f, axes = plt.subplots(1, 2, figsize=(16, 6))
  notas_do_filme.plot(kind='hist', ax=axes[0])
  notas_do_filme.plot(kind='box', ax=axes[1])
  plt.tight_layout()

  return notas_do_filme.describe()
plot_filme_sbs(260)<jupyter_output>Filme:  Star Wars: Episode IV - A New Hope (1977)<jupyter_text>Desafio 7 do [<NAME>](https://twitter.com/tgcsantos)Criar um gráfico de notas médias por ano (média geral considerando todos os filmes lançados naquele ano).<jupyter_code># Cria uma cópia do datafrme
filmes_com_media_e_ano = filmes_com_media.copy()

# Cria uma nova coluna no dataframe e extrai o ano do título 
filmes_com_media_e_ano['ano'] = filmes_com_media['titulo'].str.extract("\((\d{4})\)")
filmes_com_media_e_ano
nota_media_por_ano = filmes_com_media_e_ano.groupby('ano')['nota_media'].mean()

plt.figure(figsize=(18, 8))
nota_media_por_ano.plot()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13773992971073262, 'fraction_numerical': 0.026493646931603138, 'mean_word_length': 5.53045013239188, 'pattern_counts': {'":': 2, '<': 37, '<?xml version=': 0, '>': 45, 'https://': 9, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 4, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '613455', 'license': 'Apache-2.0', 'n_tokens_mistral': 3156, 'n_tokens_neox': 3032, 'n_words': 579, 'path': 'Aula_02_desafios_QuarentenaDados.ipynb', 'repo_name': 'LeonardoClemente23/quarentenadados-Alura', 'size': '7459'}