Esercizi Python con soluzioni: Pandas e analisi dei dati

In questa pagina trovi una serie di esercizi su Python con relative soluzioni a partire da tre Dataframe della libreria Pandas. La libreria Pandas è uno strumento fondamentale per chiunque voglia utilizzare Python per l’analisi dei dati. I dati sono organizzati in Dataframe, una struttura simile alle tabelle di un database relazionale ma che in più incorpora il concetto di ordine. Tramite questi esercizi ripasserai come svolgere le principali attività di analisi su un Dataframe come filtrare, aggregare, rappresentare e combinare i dati. Ho riportato anche la soluzione in SQL così avrai modo di confrontare i due linguaggi.

Esercizi Python per filtrare i dati di un dataframe

I tre dataframe con le relative colonne sono

Clienti (NumeroCliente, Nome, Cognome, DataNascita, RegioneResidenza);

Fatture (NumeroFattura, Tipologia, Importo, Iva, IdCliente, DataFattura, NumeroFornitore);

Fornitori (NumeroFornitore, Denominazione, RegioneResidenza, DataInizioContratto, DataFineContratto);

Importiamo le librerie pandas e numpy tramite il codice

import pandas as pd
import numpy as np

La sintassi utilizzata in questi esercizi richiede la versione 1.1.5 di Pandas (in particolare il metodo .agg). Potete verificare la versione lanciando il comando pip show pandas.

1) Calcolare il numero di fatture di tipologia A.

Fatture[Fatture["Tipologia"]=="A"].shape[0]
SELECT COUNT(*) 
FROM   Fatture 
WHERE  Tipologia = 'A';

2) Calcolare la somma degli importi delle fatture di tipologia V.

Fatture[Fatture["Tipologia"]=="V"]["Importo"].sum()

Oppure con il nuovo metodo query

Fatture.query("Tipologia == 'V' "]["Importo"].sum()
SELECT SUM(Importo) 
FROM   Fatture 
WHERE  Tipologia = 'V';

3) Estrarre la denominazione e la data di fine contratto dei fornitori residenti in Lombardia o in Piemonte.

Fornitori[Fornitori["RegioneResidenza"] \
          .isin(["Lombardia","Piemonte"])] \
         [["Denominazione","DataFineContratto"]]

Oppure con il nuovo metodo query

Fornitoriquery("RegioneResidenza in ['Lombardia', 'Piemonte' ] ") \
         [["Denominazione","DataFineContratto"]]
SELECT 
   Denominazione, 
   DataFineContratto
FROM Fornitori
WHERE  RegioneResidenza IN ('Lombardia','Piemonte');

4) Estrarre il nome e il cognome dei clienti Lombardi nati nel 1973.

Clienti[(Clienti["DataNascita"].dt.year == 1973) & \
        (Clienti["Regione"] == "Lombardia")] \
       [["Nome","Cognome"]]

Oppure con il nuovo metodo query

Clienti.query("DataNascita.dt.year == 1973 and Regione == 'Lombardia' " ) \
       [["Nome","Cognome"]]
SELECT Denominazione, DataFineContratto
FROM   Clienti
WHERE  YEAR(DataNascita) = 1973
   AND RegioneResidenza = 'Lombardia';

Aggregare i dati di un dataframe con Python

5) Riportare il numero di fatture e la somma dei relativi importi divisi per NumeroCliente.

Fatture.groupby(["NumeroCliente"], 
                 as_index = False, 
                 dropna = False) \
       .agg(NumeroFatture = ("NumeroFattura",
                             np.size),
            TotaleImporto = ("Importo",
                             np.sum))
SELECT NumeroCliente, 
    COUNT(*) AS NumeroFatture, 
    SUM(Importo) AS TotaleImporto
FROM   Fatture
GROUP BY NumeroCliente;

6) Riportare l’elenco dei clienti che hanno almeno due fatture associate.

Step1 = Fatture.groupby(["NumeroCliente"],
                         as_index = False, 
                         dropna = False) \
               .agg(NumeroFatture = ("NumeroFattura",
                                     np.size))
Step1[Step1["NumeroFatture"] >= 2][["Clienti"]]
SELECT   NumeroCliente
FROM     Fatture
GROUP BY NumeroCliente
HAVING   COUNT(*)>2;

7) Rappresentare in un grafico a torta la distribuzione dell’importo delle fatture al variare del fornitore, considerando soltanto le fatture con tipologia A.

Grafico = Fatture[Fatture["Tipologia"] == "A"] \
          .groupby(["NumeroFornitore"], 
                  as_index = False, 
                  dropna = False)\
          .agg(TotaleImporto = ("Importo",
                                np.sum))
Grafico.plot(x = "NumeroFornitore",
             y = "TotaleImporto",
             kind = "pie")
SELECT   NumeroFornitore, 
    SUM(Importo) AS TotaleImporto
FROM     Fatture
WHERE    Tipologia = 'A'
GROUP BY NumeroFornitore;

Esercizi Python per combinare i dati di due dataframe

8) Riportare la somma degli importi divisa per regione di residenza dei clienti.

Step1 = pd.merge(Fatture, 
             Clienti, 
             how = "inner", 
             left_on = "NumeroCliente", 
             right_on = "NumeroCliente", 
             suffixes = [ "_x", "_y"])
Step1.groupby(["RegioneResidenza"], 
              as_index = False, 
              dropna = False) \
     .agg(TotaleImporto = ("Importo", 
                           np.sum))
SELECT  c.RegioneResidenza, 
    SUM(f.Importo) AS TotaleImporto 
FROM Fatture AS f 
INNER JOIN Clienti AS c 
   ON f.NumeroCliente = c.NumeroCliente 
GROUP BY c.RegioneResidenza;

9) Estrarre l’elenco delle fatture contenente il NumeroFattura, la DataFattura, il nome e cognome del cliente e la denominazione del fornitore.

Step1 = pd.merge(Fatture[["NumeroFattura",
                          "DataFattura",
                          "NumeroCliente",
                          "NumeroFornitore"]],
                 Clienti[["NumeroCliente",
                          "Nome",
                          "Cognome"]],
                 how = "left",
                 left_on = "NumeroCliente",
                 right_on = "NumeroCliente", 
                 suffixes = [ "_x", "_y"])
Elenco = pd.merge(Step1,
                  Fornitori[["NumeroFornitore",
                             "Denominazione"]],
                  how = "left",
                  left_on = "NumeroFornitore",
                  right_on = "NumeroFornitore", 
                  suffixes = [ "_x", "_y"])
Elenco = Elenco.rename(columns = {"Denominazione": "DenominazioneFornitore", 
                                  "Nome": "NomeCliente",
                                  "Cognome": "CognomeCliente"})
Elenco[["NumeroFattura",
        "DataFattura",
        "NomeCliente",
        "CognomeCliente",
        "DenominazioneFornitore"]]
SELECT fa.NumeroFattura,
    fa.DataFattura,
    c.Nome AS NomeCliente, 
    c.Cognome AS CognomeCliente, 
    fo.Denominazione AS DenominazioneFornitore
FROM  Fatture AS fa
LEFT JOIN Clienti AS c
  ON fa.NumeroCliente = c.NumeroCliente
LEFT JOIN Fornitori AS fo
  ON fa.NumeroFornitore = fo.NumeroFornitore;

Continua a imparare

Torna in alto
Torna su