Dashboard Filmes IMDb
Para uma melhor usabilidade veja no computador (ou gire o seu dispositivo)
Saiba mais sobre este dashboard
Não sei você, mas eu sou o tipo de pessoa que fica mais tempo tentando escolher um bom filme para ver do que vendo o filme em si. Normalmente utilizo as notas fornecidas pelo site do IMDb.
As notas fornecidas neste site são uma proxy muito boa da qualidade do filme.
Então eu fiz esse dashboard para justamente otimizar esse tempo de escolha e conseguir analisar os melhores filmes por categoria, ator, diretor, ano, etc.
Os filmes estão “Rankeados” em função da:
- Nota Média (peso 10)
- Número de Votos (peso 8) // isso para não rankear os filmes desconhecidos acima dos blockbusters)
- Ano de Divulgação (peso 0.5) // isso para dar um leve "up" nos filmes mais recentes)
Capítulo 1: Aquisição e Tratamento de Dados
De onde vieram os dados?
Os dados foram obtidos baixando o dados (.tsv – tab separeted values) do banco de dados do site do IMDb e importando para o Power BI as seguintes tabelas
- title.basics.tsv.gz (f_Title)
- title.principals.tsv.gz (f_Title Crew)
- title.ratings.tsv.gz (dRating)
- name.basics.tsv.gz (d_Artirst)
Transformação de Dados
…
Capítulo 2: Apresentação e Cálculos em DAX
Modelagem de Dados
Após importar os dados e filtrar somente os “titleType” = “movies” é necessário relacionar as tabelas.
Vejo o diagrama relacional entre as tabelas criado no Power BI
Obs1* As tabelas dGenre, dGenreID e dYear foram geradas usando o Power Query a partir da consulta f_Title
Obs2* para filtrar as tabelas que não tem “titleType” = “movies” foi necessário realizar Left Outer Join usando a f_title[“tconst”] e a f_title Crew[“tconts”].
Criando os visuais
bla bla bla
Design
bla bla bla
Como o Rank dos filmes foi calculado usando DAX?
Para calcular corretamente o Rank foi necessário primeiro normalizar o votos, ou seja, transformar um valor que varia de zero votos até 3 milhões de votos o valor vai variar de 0 a 1, onde 1 representa o número de votos máximo e 0 representa o número de votos mínimo.
Rating (Rank) =
// Normalizando soma de votos
VAR MAX_global = CALCULATE( MAX(f_Title[numVotes]) , ALL(f_Title) )
VAR soma_atual = AVERAGE(f_Title[numVotes])
VAR MIN_global = CALCULATE(MIN(f_Title[numVotes]) , ALL(f_Title) )
VAR normalizado = DIVIDE( soma_atual - MIN_global , MAX_global - MIN_global )
VAR peso_votos = 8
// Normalizando Ano
VAR MAX_Ano = CALCULATE( MAX(f_Title[startYear]) , ALL(f_Title) )
VAR Ano = AVERAGE(f_Title[startYear])
VAR MIN_Ano= CALCULATE(MIN(f_Title[startYear]) , ALL(f_Title) )
VAR normalizado_ano = DIVIDE( Ano - MIN_Ano , MAX_Ano- MIN_Ano )
VAR peso_ano = 0.5
// Nota
VAR nota_atual = AVERAGE(f_Title[AverageRating])
// Nota final
VAR condicion = IF(nota_atual < 4 , BLANK() , nota_atual + normalizado*peso_votos + normalizado_ano*peso_ano)
RETURN condicion
Após calcular a medida vamos Rankea-la:
Rank =
VAR ranke = RANKX( ALLSELECTED(f_Title) , [Rating (Rank)] , , , Skip)
VAR media = AVERAGE(f_Title[AverageRating])
RETURN IF(media < 4 , BLANK() , ranke )
Capítulo 3: Python & APIs
Como os posteres (imagens) foram obtidos?
A imagens foram obtidas utilizando a linguagem de programação Python e fazendo a conexão com a seguinte API:
O código em Python foi executado no Visual Studio em um arquivo Jupyter Notebook.
As livrarias que foram utilizadas
import pandas as pd
import requests
import json
from IPython.core.display import clear_output
from pandas import json_normalize
from tqdm import tqdm_notebook as tqdm
import time
Através dos valores já obtidos da tabela “f_Title” é possível gerar um arquivo .csv (commar separeted values) exportando de uma visual de tabela somente o “tconst” e o “Title”. O valor de “tconst” será usado pela API para procurar a imagem
df2 = pd.read_csv("C:\CAMINHO DO ARQUIVO\Movies2.csv")
df2["URL"] = ""
df2
Veja abaixo a função que retorna o link da imagem usando o código “tconst”:
As imagens foram prioritariamente buscadas na língua inglesa.
def get_image( imdbcode: str ):
KEY = "SUA_CHAVE"
IMG_PATTERN = 'http://api.themoviedb.org/3/movie/{imdbid}/images?api_key={key}'
r = requests.get(IMG_PATTERN.format(key=KEY,imdbid=imdbcode))
api_response = r.json()
posters = api_response['posters']
a = json.loads(r.text)
res = json_normalize(a['posters'])
data = pd.DataFrame(res)
data = data[ data['iso_639_1'] == 'en' ]
data2 = data[data['height'] == 3000 ]
if (len(data2) >= 1 ):
result = data2["file_path"].values[0]
else:
result = data["file_path"].values[0]
result = 'https://image.tmdb.org/t/p/w500' + result
return result
Agora vamos procurar para cada linha na tabela exportada o respectivo URL:
for index, row in tqdm(df2.iterrows()):
Imdb_id = row['tconst']
try:
row['URL'] = get_image(Imdb_id)
except:
pass
df = df2
df
Agora vamos gerar um novo .csv com o dataframe obtido.
df.to_csv (r"C:\CAMINHO DO ARQUVI\IMDB.csv", index = False, header=True)
Visual Personalizado
Agora que já temos o URL de todas as imagens é possível utilizar o visual personalizado “Image Grid” e usar a coluna de URL como entrada.
Lembrando que o dashboard possui diversas ferramente de navegação como botões de “drill-through” e filtros.
Capítulo 4: Navegação de Página
Botões
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.
Tooltips
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.
Drill-Through
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.
Outros Conteúdos
Licenças do Power BI Explicadas
Tudo o que você precisa saber sobre as licenças e preços do Microsoft Power BI, Fabric, Power BI Embedded e Power BI Report Server.
Como Juntar Abas de Planilha Excel para Analisar O Histórico de Várias Ações
Como importar rapidamente o histórico de várias ações com uma planilha Excel automatizada pro Power BI usando a fórmula HISTÓRICODEAÇÕES e juntando abas de planilha Excel numa só
Indústria 4.0 e Análise de Dados
Como a tranformação digital aliada à manutenção industrial pode gerar valor para consumidores e parceiros de negócio.