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_dictNOTA 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]: