Come utilizzare SQL in pandas usando le query di pandasql

SQL, o Structured Query Language, è un linguaggio di programmazione utilizzato per accedere, estrarre, manipolare e esplorare dati memorizzati in database relazionali. pandas è una libreria open-source di Python progettata specificamente per la manipolazione e l’analisi dati.

In questo tutorial, viene discusso quando e come utilizzare le funzionalità SQL all’interno dell’framework di pandas, e inoltre quali sono le alternative. In aggiunta, verranno illustrati diversi esempi di implementazione di questo approcio e i risultati saranno confrontati con il codice equivalente in pandas puro.

Perché utilizzare SQL in pandas?

Data le definizioni introduttive, perché usare SQL insieme a pandas, se quest’ultimo è un pacchetto tutto incluso per l’analisi dati?

La risposta è che in alcune occasioni, specialmente per programmi complessi, le query SQL sembrano molto più semplici e leggibili rispetto al codice corrispondente in pandas. Questo è vero in particolarità per chiunque abbia iniziato a lavorare con dati utilizzando SQL prima di imparare pandas.

Se hai bisogno di ulteriori corsi su pandas, puoi dare un’occhiata ai nostri corsi Manipolazione di Dati con pandas e Tutorial Pandas: DataFrame in Python.

Per vedere la leggibilità di SQL in azione, supponiamo di avere una tabella (un dataframe) chiamata penguins che contiene varie informazioni sui pinguini (e ci lavoriamo su una tale tabella più avanti in questo tutorial). Per estrarre tutte le specie uniche di pinguini che sono maschi e che hanno zampe più lunghe di 210 mm, avremo bisogno del seguente codice in pandas:

penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique()

Invece, per ottenere le stesse informazioni utilizzando SQL, eseguiremmo il seguente codice:

SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210

Il secondo pezzo di codice, scritto in SQL, assomiglia quasi ad una frase naturale in inglese ed è quindi molto più intuitivo. Possiamo aumentare ulteriormente la sua leggibilità spargendolo su più righe:

SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210

Ora che abbiamo identificato i vantaggi dell’uso di SQL per pandas, vediamo come possiamo tecnicamente combinarli entrambi.

Come utilizzare pandasql

La libreria Python pandasql consente di interrogare i dataframe di pandas eseguendo comandi SQL senza dover connettersi a alcun server SQL. Sotto il coatto, utilizza lo sintassi SQLite, identifica automaticamente qualsiasi dataframe di pandas e lo tratta come una tabella SQL normale.

Configurazione dell’ambiente

Prima di tutto, dobbiamo installare pandasql:

pip install pandasql

Poi, importiamo le package necessarie:

from pandasql import sqldf import pandas as pd

Abbiamo importato direttamente la funzione sqldf da pandasql, che è praticamente l’unica funzione significativa della libreria. Come suggerisce il nome, si applica per interrogare i dataframe utilizzando la sintassi SQL. Oltre a questa funzione, pandasql include due semplici dataset integrati che possono essere caricati utilizzando le funzioni autoesplicative load_births() e load_meat().

Sintassi di pandasql

La sintassi della funzione sqldf è molto semplice:

sqldf(query, env=None)

Qui, query è un parametro richiesto che accetta una query SQL come stringa, e env—un parametro facoltativo (e raramente utile) che può essere locals() o globals() e consente a sqldf di accedere al corrispondente insieme di variabili nel tuo ambiente Python.

La funzione sqldf restituisce il risultato di una query come un dataframe pandas.

Quando possiamo usare pandasql

La libreria pandasql consente di lavorare con i dati utilizzando il Data Query Language (DQL), che è uno dei sottoinsiemi di SQL. In altre parole, con pandasql, possiamo eseguire query sui dati memorizzati in un database per recuperare le informazioni necessarie da esso. In particolare, possiamo accedere, estrarre, filtrare, ordinare, raggruppare, unire, aggregare i dati e eseguire operazioni matematiche o logiche su di essi.

Quando non possiamo usare pandasql

pandasql non consente di utilizzare altri sottoinsiemi di SQL oltre al DQL. Ciò significa che non possiamo applicare pandasql per modificare (aggiornare, troncare, inserire, ecc.) tabelle o cambiare (aggiornare, eliminare o inserire) i dati in una tabella.

Si noti che, poiché questa libreria si basa sulla sintassi SQL, dovremmo fare attenzione alle note particolarità in SQLite.

Esempi di utilizzo di pandasql

Ora, esamineremo più in dettaglio come eseguire query SQL sui dataframes di pandas usando la funzione sqldf di pandasql. Per avere alcuni dati su cui esercitarsi, carichiamo uno dei dataset integrati della libreria seaborn—penguins:

import seaborn as sns penguins = sns.load_dataset('penguins') print(penguins.head())

Output:

species island bill_length_mm bill_depth_mm flipper_length_mm \ 0 Adelie Torgersen 39.1 18.7 181.0 1 Adelie Torgersen 39.5 17.4 186.0 2 Adelie Torgersen 40.3 18.0 195.0 3 Adelie Torgersen NaN NaN NaN 4 Adelie Torgersen 36.7 19.3 193.0 body_mass_g sex 0 3750.0 Male 1 3800.0 Female 2 3250.0 Female 3 NaN NaN 4 3450.0 Female

Se hai bisogno di aggiornare le tue competenze SQL, il nostro percorso di abilità Fondamenti SQL è un buon punto di riferimento.

Estrarre dati con pandasql

print(sqldf('''SELECT species, island FROM penguins LIMIT 5'''))

Output:

species island 0 Adelie Torgersen 1 Adelie Torgersen 2 Adelie Torgersen 3 Adelie Torgersen 4 Adelie Torgersen

Qui sopra, abbiamo estratto informazioni sulla specie e la geografia dei primi cinque pinguini dal dataframe penguins. Nota che l’esecuzione della funzione sqldf restituisce un dataframe di pandas:

print(type(sqldf('''SELECT species, island FROM penguins LIMIT 5''')))

Output:

<class 'pandas.core.frame.DataFrame'>

In pandas puro, sarebbe:

print(penguins[['species', 'island']].head())

Output:

species island 0 Adelie Torgersen 1 Adelie Torgersen 2 Adelie Torgersen 3 Adelie Torgersen 4 Adelie Torgersen

Un altro esempio è l’estrazione di valori unici da una colonna:

print(sqldf('''SELECT DISTINCT species FROM penguins'''))

Output:

species 0 Adelie 1 Chinstrap 2 Gentoo

In pandas, sarebbe:

print(penguins['species'].unique())

Output:

['Adelie' 'Chinstrap' 'Gentoo']

Ordinare i dati con pandasql

print(sqldf('''SELECT body_mass_g FROM penguins ORDER BY body_mass_g DESC LIMIT 5'''))

Output:

body_mass_g 0 6300.0 1 6050.0 2 6000.0 3 6000.0 4 5950.0

Qui sopra, abbiamo ordinato i nostri pinguini per massa corporea in ordine decrescente e visualizzato i primi cinque valori di massa corporea.

In pandas, sarebbe:

print(penguins['body_mass_g'].sort_values(ascending=False, ignore_index=True).head())

Output:

0 6300.0 1 6050.0 2 6000.0 3 6000.0 4 5950.0 Name: body_mass_g, dtype: float64

Filtraggio dati con pandasql

Provare lo stesso esempio che abbiamo menzionato nel capitolo Perché usare SQL in pandas: estrazione delle specie uniche di pinguini che sono maschi e che hanno pinne più lunghe di 210 mm:

print(sqldf('''SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210'''))

Output:

species 0 Chinstrap 1 Gentoo

Al di sopra, abbiamo filtrato i dati in base a due condizioni: sex = 'Male' e flipper_length_mm > 210.

Lo stesso codice in pandas sarebbe un po ‘più ingombrante:

print(penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique())

Output:

['Chinstrap' 'Gentoo']

Raggruppamento e aggregazione dati con pandasql

Ora, applicare il raggruppamento dati e l’aggregazione per trovare la coda più lunga per ogni specie nel dataframe:

print(sqldf('''SELECT species, MAX(bill_length_mm) FROM penguins GROUP BY species'''))

Output:

species MAX(bill_length_mm) 0 Adelie 46.0 1 Chinstrap 58.0 2 Gentoo 59.6

Lo stesso codice in pandas:

print(penguins[['species', 'bill_length_mm']].groupby('species', as_index=False).max())

Output:

species bill_length_mm 0 Adelie 46.0 1 Chinstrap 58.0 2 Gentoo 59.6

Eseguire operazioni matematiche con pandasql

Con pandasql, puoi facilmente eseguire operazioni matematiche o logiche sui dati. Immaginate di voler calcolare il rapporto lunghezza-profondità coda per ogni pinguino e mostrare le cinque valori più alti di questa misura:

print(sqldf('''SELECT bill_length_mm / bill_depth_mm AS length_to_depth FROM penguins ORDER BY length_to_depth DESC LIMIT 5'''))

Output:

length_to_depth 0 3.612676 1 3.510490 2 3.505882 3 3.492424 4 3.458599

Nota che questa volta abbiamo usato l’alias length_to_depth per la colonna con i valori del rapporto. Altrimenti, riceveremmo una colonna con un nome mostruoso bill_length_mm / bill_depth_mm.

In pandas, dovremmo prima creare una nuova colonna con i valori del rapporto:

penguins['length_to_depth'] = penguins['bill_length_mm'] / penguins['bill_depth_mm'] print(penguins['length_to_depth'].sort_values(ascending=False, ignore_index=True).head())

Output:

0 3.612676 1 3.510490 2 3.505882 3 3.492424 4 3.458599 Name: length_to_depth, dtype: float64

Conclusione

Per concludere, in questo tutorial abbiamo approfondito le ragioni e i momenti in cui è possibile combinare la funzionalità di SQL per pandas per scrivere codice migliore e più efficiente. Abbiamo discusso come impostare e utilizzare la libreria pandasql a questo scopo e quali limiti questo package ha. Infine, abbiamo considerato numerosi popolari esempi di applicazione pratica di pandasql e, in ognuno dei casi, abbiamo confrontato il codice con il suo corrispettivo in pandas.

Ora hai tutto ciò che serve per applicare SQL per pandas in progetti reali. Un ottimo posto per la tua pratica è il DataLab, il data notebook con AI di DataCamp che supporta molto bene SQL.

Source:
https://www.datacamp.com/tutorial/how-to-use-sql-in-pandas-using-pandasql-queries