Accedere a https://www.kaggle.com/rounakbanik/the-movies-dataset#movies_metadata.csv e scaricare il dataset in formato csv movies_metadata.csv.zip
. Tale dataset contiene, in record di 24 campi, i film realizzati fino al 2017.
Considerando solo i primi 1000 record, si richiede di:
Parametri di input:
I campi del file csv che occorrono per risolvere l'esercizio sono:
genres
(stringa)
[{'id': 16, 'name': 'Animation'}, {'id': 35, 'name': 'Comedy'}, {'id': 10751, 'name': 'Family'}]
original_title
(stringa)
popularity
(decimale)id
(ID)tagline
(stringa)original_language
(stringa)production_countries
(stringa)
[{'iso_3166_1': 'DE', 'name': 'Germany'}, {'iso_3166_1': 'US', 'name': 'United States of America'}]
Requisiti generali:
genres
e production_countries
letteralmente specificano una lista di dizionari in cui è presente la chiave name
a cui viene associato il valore di un genere cinematografico nel caso di genres
e un paese nel caso di production_countries
. Si richiede quindi la definizione di una funzione get_items()
che prenda in input uno qualsiasi tra questi due campi ed estragga la lista dei generi (ad esempio ['Animation', 'Comedy', 'Family']
) nel caso di genres
e la lista dei paesi di produzione (ad esempio ['Germany', 'United States of America']
) nel caso di production_countries
.country_rank_list
: lista di 10 tuple (paese, numero di film prodotti) contenente i primi 10 paesi che hanno prodotto più film (ordinati per numero di film prodotti decrescente)pop_rank_dict
: dizionario delle classifiche per genere dei primi n film ordinati per popolarità decrescentelanguage_set_dict
: dizionario degli insiemi delle lingue coinvolte in ciascuna delle classifiche presenti in pop_rank_dict
NOTA BENE: alcuni record del dataset csv hanno un valore del campo popularity
che non è un decimale oppure non hanno proprio un valore. Non conviene perciò considerarle.
In [2]:
input_file_name = './movies_metadata.csv.zip'
n = 15
Importazione dei moduli pandas
, ast
e numpy
.
In [3]:
import pandas as pd
import ast
import numpy as np
In [4]:
def get_items(arg_string):
return [dictionary['name'] for dictionary in ast.literal_eval(arg_string)]
Leggere il dataset csv ed estrarre solo le prime 1000 righe.
In [7]:
movies_df = pd.read_csv(input_file_name)[:1000]
In [41]:
#movies_df.head()
Costruire le seguenti strutture di base:
info_dict
: dizionario delle informazioni sui filmid
del dataset csv)country_list
: lista dei paesi che hanno prodotto un film (ciascun paese deve essere presente nella lista esattamente per il numero di volte in cui ha prodotto un film)pop_dict
: dizionario delle popolaritàInizializzare le strutture di base vuote.
In [9]:
info_dict = {}
country_list = []
pop_dict = {}
Attraversare i record di movies_df
per riempire info_dict
e country_list
, e costruire pop_dict
con valori tutti uguali a liste vuote []
.
NOTA BENE: effettuare il controllo sul valore del campo popularity
che deve essere un numero (altrimenti non considerare il record).
In [21]:
for (index, row) in movies_df.iterrows():
if(isinstance(row['popularity'], float) and np.isnan(row['popularity']) == False):
info_dict[row['id']] = (row['original_title'], row['tagline'], row['original_language'])
country_list.extend(get_items(row['production_countries']))
[pop_dict.update([(gen, [])]) for gen in get_items(row['genres'])]
In [42]:
#info_dict
In [43]:
#country_list
In [44]:
#pop_dict
Attraversare di nuovo i record di movies_df
per riempire i valori di pop_dict
.
In [25]:
for (index, row) in movies_df.iterrows():
if(isinstance(row['popularity'], float) and np.isnan(row['popularity']) == False):
[pop_dict[gen].append([row['popularity'], row['id']]) for gen in get_items(row['genres'])]
In [45]:
#pop_dict
In [27]:
from collections import Counter
country_rank_counter = Counter(country_list)
country_rank_list = country_rank_counter.most_common()[:10]
In [46]:
#country_rank_list
Ottenere da pop_dict
il dizionario pop_rank_dict_temp
con la stessa struttura, ma con la differenza che il valore relativo a un dato genere è la lista degli n film più popolari (ordinati per popolarità decrescente).
NOTA BENE: ottenere prima key_value_tuples
, lista di tuple (chiave, valore) di pop_rank_dict_temp
, e in seguito costruire il dizionario con la funzione dict()
.
In [39]:
key_value_tuples = [(gen, sorted(pop_dict[gen])[::-1][:n]) for gen in pop_dict]
pop_rank_dict_temp = dict(key_value_tuples)
In [47]:
#pop_rank_dict_temp
Ottenere da pop_rank_dict_temp
il dizionario pop_rank_dict
NOTA BENE: ottenere prima key_value_tuples
, lista di tuple (chiave, valore) di pop_rank_dict
, e in seguito costruire il dizionario con la funzione dict()
.
In [35]:
key_value_tuples = [(gen, [[info_dict[films[1]][0], info_dict[films[1]][1]] for films in pop_rank_dict_temp[gen]]) for gen in pop_rank_dict_temp]
pop_rank_dict = dict(key_value_tuples)
In [48]:
#pop_rank_dict
Ottenere da pop_rank_dict_temp
il dizionario language_set_dict
degli insiemi delle lingue coinvolte in ciascuna delle classifiche per genere degli n film ordinati per popolarità descrescente
set
)NOTA BENE: ottenere prima key_value_tuples
, lista di tuple (chiave, valore) di language_set_dict
, e in seguito costruire il dizionario con la funzione dict()
.
In [37]:
key_value_tuples = [(gen, set([info_dict[films[1]][2] for films in pop_rank_dict_temp[gen]])) for gen in pop_rank_dict_temp]
language_set_dict = dict(key_value_tuples)
In [49]:
#language_set_dict
In [ ]: