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
- Segui la lezione successiva sull’analisi esplorativa dei dati
- Torna all’indice delle lezioni
- Visita la pagina del mio corso online su Pandas, Python e Machine Learning