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.
Il modulo pandas
permette di leggere un file in formato csv (anche zippato) tramite la funzione read_csv
che prende come argomento il nome del file da leggere.
L'oggetto restituito è un oggetto di tipo DataFrame
(un data frame), cioé una struttura bidimensionale (tabella) organizzata in righe (record) e colonne intestate.
Il codice seguente
import pandas as pd
df = pd.read_csv(input_file_name)
legge il file input_file_name
e lo restituisce in un oggetto di tipo DataFrame
.
Per vedere solo le prime righe del data frame basta invocare il metodo head()
:
df.head()
Per tenere solo le prime n
righe del data frame:
df = df[:n]
Per iterare lungo le righe del data frame basta invocare il metodo iterrows()
che restituisce un iteratore da usare in un ciclo di scansione. Ogni elemento dell'iteratore è una tupla di due elementi:
index
: indice della riga (valore intero)row
: oggetto di tipo Series
che contiene i campi del record
for (index, row) in df.iterrows():
do_something_with_row
L'accesso al campo relativo alla colonna con nome column_name
della record row
avviene usando la seguente sintassi:
row[column_name]
NOTA BENE: il valore restituito da row[column_name]
rispetta il tipo della colonna column_name
nel file csv in input. Ad esempio se il campo nel dataset csv è un valore intero allora il valore di row[column_name]
sarà di tipo int
.
La funzione ast_literal()
del modulo ast
prende come argomento una stringa e restituice l'oggetto rappresentato letteralmente dalla stringa.
In [10]:
import ast
ast.literal_eval("[1,2,3]")
Out[10]:
La funzione isinstance()
restituisce il valore True
se l'oggetto passato come primo argomento è del tipo specificato come secondo argomento.
In [13]:
isinstance(10, int)
Out[13]:
La funzione isnan()
del modulo numpy
restituisce il valore True
se il valore passato come argomento è NaN.
In [11]:
import numpy
numpy.isnan(10)
Out[11]:
sorted()
prende come argomento un oggetto iterabile e restituisce la lista dei valori ordinati in senso crescente. Ad esempio la seguente istruzione ordina una lista di tuple
In [16]:
sorted([(11.02, 3), (10.2, 1), (11.02, 2), (2.34, 10)])
Out[16]:
append()
degli oggetti di tipo list
aggiunge in coda alla lista invocante il valore passato come argomento
In [17]:
lista = [1,2,3,4]
lista.append([5, 6])
In [18]:
lista
Out[18]:
extend()
degli oggetti di tipo list
estende in coda la lista invocante con i valori contenuti nell'argomento passato
In [27]:
lista = [1,2,3,4]
lista.extend([5, 6])
In [28]:
lista
Out[28]: