<jupyter_start><jupyter_text>Esercizio 2Considerare il file `movies.csv` ottenuto estraendo i primi 1000 record del dataset scaricabile all'indirizzo https://www.kaggle.com/rounakbanik/the-movies-datasetmovies_metadata.csv.Tale dataset è in formato csv e contiene, in *record* di 24 campi separati da virgola, le informazioni su film.Il file `movies.csv` contiene solo un subset dei campi del dataset originale.--- I campi del file csv che occorrono per risolvere l'esercizio sono:- `id`: indice progressivo- `genres`: stringa che rappresenta il letterale di una lista di dizionari con chiavi `id` e `name` che forniscono ciascuno un genere        [{'id': 16, 'name': 'Animation'}, {'id': 35, 'name': 'Comedy'}]        - `original_title`: titolo originale- `popularity`: valore di popolarità- `tagline`: tagline del film- `original_language`: lingua originale- `production_countries`: stringa che rappresenta il letterale di una lista di dizionari con chiavi `iso_3166_1` e `name` che forniscono ciascuno un paese di origine         [{'iso_3166_1': 'DE', 'name': 'Germany'}, {'iso_3166_1': 'US', 'name': 'United States of America'}]***Si richiede di:- elencare i 10 paesi che hanno prodotto più film, ordinandoli per numero decrescente di film prodotti, specificando per ognuno il numero di film prodotti- fornire per ognuno dei generi cinematografici presenti nel dataset la classifica degli N (parametro in input) film più popolari (per quel genere) ordinandoli per popolarità decrescente e specificando per ognuno di essi il titolo originale e la tagline- l'insieme delle lingue originali che sono coinvolte nella classifica precedente---Parametri di input:- dataset deli film- parametro N---Requisiti generali:- definire una funzione `get_items()` che prenda in input uno qualsiasi tra i due campi `genres`e `production_countries` (indifferentemente) ed estragga    - la lista dei generi nel caso si passi come argomento il valore di un campo `genres`    - la lista dei paesi di produzione nel caso si passi come argomento il valore di un campo `production_countries`Produrre l'output nelle seguenti variabili:- lista di 10 tuple di due elementi `(nome di paese, numero di film prodotti)` contenenti i primi 10 paesi che hanno prodotto più film, ordinate per numero decrescente di film prodotti- dizionario delle classifiche per genere dei primi N film ordinati per popolarità decrescente:    - *chiave*: genere di un film    - *valore*: lista di N liste di due elementi `[titolo originale, tagline]` con i primi N film ordinati per popolarità decrescente- dizionario degli insiemi delle lingue coinvolte in ciascuna delle classifiche precedenti per genere:    - *chiave*: genere di un film    - *valore*: insieme delle lingue originali coinvolte***  1) Come leggere un file csvIl 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 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`.<jupyter_code>import pandas as pd
df = pd.read_csv('movies.csv')
df<jupyter_output><empty_output><jupyter_text>Per iterare lungo i record del *data frame* basta invocare il metodo `iterrows()` che restituisce un oggetto di tipo `generator` da usare in un ciclo `for` di scansione.    for (index, record) in df.iterrows():        do_somethingOgni elemento fornito dell'iteratore è una tupla di due elementi:- `index`: indice progressivo del record (valore intero)- `record`: oggetto di tipo `Series` che contiene i campi del *record*L'accesso al campo relativo alla colonna con nome `column_name` del *record* `record` avviene usando la seguente sintassi:    record[column_name]    **NOTA BENE**: il valore restituito da `record[column_name]` rispetta il tipo della colonna `column_name` nel file csv in input. Ad esempio se il campo nel dataset csv è un valore decimale allora il valore di `record[column_name]` sarà di tipo `float`.<jupyter_code>for (index, record) in df.iterrows():
    print(record['popularity'])<jupyter_output><empty_output><jupyter_text>2) Come interpretare *letteralmente* una stringa  La funzione `literal_eval()` del modulo `ast`  prende come argomento una stringa e restituice l'oggetto rappresentato *letteralmente* dalla stringa.<jupyter_code>import ast

ast.literal_eval("[1,2,3]")<jupyter_output><empty_output><jupyter_text>3) 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.<jupyter_code>import numpy

numpy.isnan(10)<jupyter_output><empty_output><jupyter_text>4) Funzioni/Metodi suggeriti - la funzione `sorted()` prende come argomento un oggetto iterabile e restituisce la lista dei valori ordinati in senso crescente.<jupyter_code>lista = [(11.02, 3), (10.2, 1), (11.02, 2), (2.34, 10)]
sorted(lista)<jupyter_output><empty_output><jupyter_text>- Il metodo `append()` degli oggetti di tipo `list` aggiunge in coda alla lista invocante il valore passato come argomento<jupyter_code>lista = [1,2,3,4]
lista.append([5, 6])
lista<jupyter_output><empty_output><jupyter_text>- Il metodo `extend()` degli oggetti di tipo `list` estende in coda la lista invocante con i valori contenuti nell'argomento passato<jupyter_code>lista = [1,2,3,4]
lista.extend([5, 6])
lista<jupyter_output><empty_output><jupyter_text>- il metodo `get` degli oggetti di tipo `dict` permette di ottenere il valore relativo alla chiave passata come primo argomento e di restituire il secondo argomento (valore di default) se la chiave non è presente nel dizionario.<jupyter_code>my_dict = {'due': 2, 'quattro': 4, 'sei': 6}
my_dict.get('due', -1)
my_dict.get('cinque', -1)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08759001842237481, 'fraction_numerical': 0.012895662368112544, 'mean_word_length': 5.505446623093682, 'pattern_counts': {'":': 0, '<': 33, '<?xml version=': 0, '>': 33, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '331021', 'license': 'CC0-1.0', 'n_tokens_mistral': 2025, 'n_tokens_neox': 2001, 'n_words': 747, 'path': 'laboratorio/lezione4-08ott21/esercizio2-testo.ipynb', 'repo_name': 'crisore99/lezioni', 'size': '5971'}