<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Esercizio 2
Considerare il file movies.csv ottenuto estraendo i primi 1000 record del dataset scaricabile all'indirizzo https
Step1:  Importazione dei moduli pandas e ast e numpy.
Step2:  1) Definizione della funzione get_items()
La funzione get_items() prende in input un valore di campo genres|production_countries e restituisce la lista dei generi|paesi di produzione.
Step3:  2) Lettura del file csv con Pandas
Step4:  3) Costruzione delle tre strutture dati di base
a) Dizionario delle informazioni sui film
Step5:  b) Lista dei paesi che hanno prodotto almeno un film (ciascun paese deve essere presente nella lista esattamente il numero di volte in cui ha prodotto un film).
Step6:  c) Dizionario delle popolarità
Step7:  4) Estrazione dei 10 paesi che hanno prodotto più film
Costruire la lista (primo output) dei primi 10 paesi che hanno prodotto più film, ordinandoli per numero decrescente di film. Ogni paese deve essere rappresentato come tupla (nome del paese, numero di film prodotti).
Step8:  5) Estrazione, per ogni genere, degli n_most_popular film più popolari ordinati per popolarità descrescente, ed estrazione delle lingue coinvolte per ciascuno dei generi
a) Derivare dal dizionario delle popolarità il dizionario che ha la stessa struttura di chiavi e valori, con la differenza che il valore relativo a una chiave (genere) è la lista degli n_most_popular film più popolari ordinati per popolarità decrescente.
NOTA BENE
Step9:  b) Derivare dal dizionario precedente il dizionario con la stessa struttura in cui le liste [popolarità, id] sono sostituite dalle liste [titolo originale, tagline] (secondo output). 
Costruire la lista delle tuple chiave-valore e in seguito costruire il dizionario passando alla funzione dict() tale lista.
Step10:  c) Estrarre dal dizionario del punto 5a il dizionario degli insiemi delle lingue originali coinvolte
<ASSISTANT_TASK:>
Python Code:
input_file_name = './movies.csv'
n_most_popular = 15  # Parametro N
Explanation: Esercizio 2
Considerare il file movies.csv ottenuto estraendo i primi 1000 record del dataset scaricabile all'indirizzo https://www.kaggle.com/rounakbanik/the-movies-dataset#movies_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 dei film
- parametro N
Requisiti generali:
definire una funzione get_items() che prenda in input uno qualsiasi tra i due campi genrese 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
Soluzione
Parametri di input
End of explanation
import pandas as pd
import ast
import numpy as np
Explanation: Importazione dei moduli pandas e ast e numpy.
End of explanation
def get_items(arg_string):
    return [d['name'] for d in ast.literal_eval(arg_string)]
#get_items("[{'iso_3166_1': 'DE', 'name': 'Germany'}, {'iso_3166_1': 'US', 'name': 'United States of America'}]")
Explanation: 1) Definizione della funzione get_items()
La funzione get_items() prende in input un valore di campo genres|production_countries e restituisce la lista dei generi|paesi di produzione.
End of explanation
df = pd.read_csv('movies.csv')
#df
Explanation: 2) Lettura del file csv con Pandas
End of explanation
info_dict = {}
for (index, record) in df.iterrows():
    info_dict[index] = (record['original_title'], record['tagline'], record['original_language'])
info_dict
Explanation: 3) Costruzione delle tre strutture dati di base
a) Dizionario delle informazioni sui film:
- chiave: id dei film
- valore: tupla (titolo originale, tagline, lingua originale)
End of explanation
country_list = []
for (index, record) in df.iterrows():
    country_list.extend(get_items(record['production_countries']))
country_list
Explanation: b) Lista dei paesi che hanno prodotto almeno un film (ciascun paese deve essere presente nella lista esattamente il numero di volte in cui ha prodotto un film).
End of explanation
pop_dict = {}
for (index, record) in df.iterrows():
    if np.isnan(record['popularity']) == False:
        for gen in get_items(record['genres']):
            value = pop_dict.get(gen, [])
            value.append([record['popularity'], index])
            pop_dict[gen] = value
pop_dict
Explanation: c) Dizionario delle popolarità:
- chiave: genere cinematografico
- valore: lista dei film associati al genere (ognuno dei film deve essere rappresentato come lista annidata [popolarità, id])
NB: controllare che il campo popularity sia diverso da NaN (Not a Number).
End of explanation
from collections import Counter
country_rank_list = Counter(country_list).most_common()[:10]
country_rank_list
Explanation: 4) Estrazione dei 10 paesi che hanno prodotto più film
Costruire la lista (primo output) dei primi 10 paesi che hanno prodotto più film, ordinandoli per numero decrescente di film. Ogni paese deve essere rappresentato come tupla (nome del paese, numero di film prodotti).
End of explanation
tuple_list = [(genere, sorted(pop_dict[genere])[::-1][:n_most_popular]) for genere in pop_dict]
pop_rank_dict = dict(tuple_list)
pop_rank_dict
Explanation: 5) Estrazione, per ogni genere, degli n_most_popular film più popolari ordinati per popolarità descrescente, ed estrazione delle lingue coinvolte per ciascuno dei generi
a) Derivare dal dizionario delle popolarità il dizionario che ha la stessa struttura di chiavi e valori, con la differenza che il valore relativo a una chiave (genere) è la lista degli n_most_popular film più popolari ordinati per popolarità decrescente.
NOTA BENE: i valori di questo dizionario sono le liste del dizionario delle popolarità ordinate per popolarità decrescente e troncate ai primi n_most_popular elementi.
Costruire la lista delle tuple chiave-valore e in seguito costruire il dizionario passando alla funzione dict() tale lista.
End of explanation
tuple_list = []
for genere in pop_rank_dict:
    new_list = []
    
    for film in pop_rank_dict[genere]:
        film_id = film[1]
        original_title = info_dict[film_id][0]
        tagline = info_dict[film_id][1]
        new_film = [original_title, tagline]
        new_list.append(new_film)
    
    tuple_list.append((genere, new_list))
    
pop_rank_dict_out = dict(tuple_list)
pop_rank_dict_out
Explanation: b) Derivare dal dizionario precedente il dizionario con la stessa struttura in cui le liste [popolarità, id] sono sostituite dalle liste [titolo originale, tagline] (secondo output). 
Costruire la lista delle tuple chiave-valore e in seguito costruire il dizionario passando alla funzione dict() tale lista.
End of explanation
tuple_list = []
for genere in pop_rank_dict:
    language_set = set()
    
    for film in pop_rank_dict[genere]:        
        language_set.add(info_dict[film[1]][2])
        
    tuple_list.append((genere, language_set))
language_set_dict = dict(tuple_list)
language_set_dict
Explanation: c) Estrarre dal dizionario del punto 5a il dizionario degli insiemi delle lingue originali coinvolte:
- chiave: genere cinematografico
- valore: insieme delle lingue originali coinvolte (oggetto di tipo set)
Costruire la lista delle tuple chiave-valore e in seguito costruire il dizionario passando alla funzione dict() tale lista.
End of explanation
<END_TASK>