Esercizio 2

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:

  • elencare i 10 paesi che hanno prodotto più film, ciascuno con il numero di film prodotti (ordinati per numero di film prodotti decrescente)
  • per ognuno dei generi cinematografici presenti:
    • la classifica degli n film più popolari ordinati per popolarità decrescente, specificando il titolo originale e la tagline per ciascuno di essi
    • l'elenco delle lingue originali che sono coinvolte in ciascuna delle classifiche del punto precedente

Parametri di input:

  • nome del dataset in input
  • parametro n

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:

  • le stringhe relative ai campi 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.
  • si richiede produrre le seguenti variabili:
    • 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à decrescente
    • chiave: genere di un film
    • valore: lista di n liste [titolo originale, tagline] contenente i primi n film ordinati per popolarità decrescente
  • language_set_dict: dizionario degli insiemi delle lingue coinvolte in ciascuna delle classifiche presenti in pop_rank_dict
    • chiave: genere di un film
    • valore: insieme delle lingue coinvolte

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.


Come leggere un file csv con Pandas

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.

Come interpretare letteralmente una stringa

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]:
[1, 2, 3]

Come testare il tipo di un oggetto

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

Come testare se un valore è NaN (Not a Number)

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

Funzioni/Metodi suggeriti

  • la funzione 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]:
[(2.34, 10), (10.2, 1), (11.02, 2), (11.02, 3)]
  • Il metodo 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]:
[1, 2, 3, 4, [5, 6]]
  • Il metodo 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]:
[1, 2, 3, 4, 5, 6]