Esercizi Python con soluzioni: Pandas e analisi dei dati

Programmare

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()
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"]]
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"]]
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;

 

Corsi Correlati

A questo link trovi il mio corso di Python per il machine learning e l’analisi dei dati.

Torna su