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;
Continua a imparare
- Come creare un istogramma con Matplotlib
- Studiamo come importare i dati con Pandas
- Il mio video corso su Python, Pandas e Machine Learning