Hoe SQL te gebruiken in pandas met behulp van pandasql Queries

SQL, of Structured Query Language, is een programmeertaal die wordt gebruikt om toegang te krijgen, gegevens uit te trekken, te manipuleren en te verkennen in relaties databases. pandas is een open-bron Python-bibliotheek speciaal ontworpen voor gegevensmanipulatie en analyse.

In deze handleiding zullen we praten over wanneer en hoe we SQL-functionaliteit kunnen gebruiken binnen het framework van pandas, en wanneer dat niet mogelijk is. Verder zullen we verschillende voorbeelden bekijken van de implementatie van deze aanpak en de resultaten vergelijken met de equivalente code in zuivere pandas.

Waarom SQL in pandas gebruiken?

Given de definities in de inleiding, waarom zou iemand SQL combineren met pandas als后者 al een alles-in-één pakket is voor dataanalyse?

De antwoord is dat op sommige gelegenheden, vooral voor complexe programma’s, SQL-query’s veel eenvoudiger en makkelijker te lezen zijn dan de equivalente code in pandas. Dat is vooral waar voor mensen die eerst SQL gebruikten om met gegevens te werken en later pandas leerden.

Als u meer training nodig heeft op pandas, kunt u onze Data Manipulation with pandas cursus en Pandas Tutorial: DataFrames in Python bekijken.

To zien hoe SQL leesbaarheid in actie werkt, laten we ervan uitgaan dat we een tabel (een dataframe) hebben genaamd penguins die diverse informatie over pinguïns bevat (en we zullen later in deze handleiding met zo’n tabel werken). Om alle unieke soorten pinguïns te extraheren die mannen zijn en een flipper langder dan 210 mm hebben, zouden we de volgende code in pandas nodig hebben:

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

In plaats daarvan, om dezelfde informatie te krijgen met SQL, zouden we de volgende code uitvoeren:

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

De tweede code, geschreven in SQL, ziet er bijna als een natuurlijke Engelse zin uit en is daardoor veel intuïtiever. We kunnen de leesbaarheid verder verbeteren door hem over meerdere regels uit te breiden:

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

Nu we de voordelen van het gebruik van SQL voor pandas hebben geïdentificeerd, laten we eens kijken hoe we ze technisch kunnen combineren.

Hoe pandasql te gebruiken

De pandasql Python-bibliotheek maakt het mogelijk om pandas-dataframes te bevragen door SQL-opdrachten uit te voeren zonder een verbinding met een SQL-server te hoeven maken. Onder de motorkap gebruikt het SQLite-syntaxis, detecteert automatisch elk pandas-dataframe en behandelt het als een normale SQL-tabel.

Uw omgeving instellen

Eerst moeten we pandasql installeren:

pip install pandasql

Vervolgens importeren we de benodigde pakketten:

from pandasql import sqldf import pandas as pd

Boven hebben we de sqldffunctie direct geïmporteerd uit pandasql, wat vrijwel de enige betekenisvolle functie van de bibliotheek is. Zoals de naam al suggereert, wordt het gebruikt om dataframes te queryën met SQL-syntax. Naast deze functie biedt pandasql twee eenvoudige ingebouwde datasets die kunnen worden geladen met behulp van de zelfuitlatende functies load_births() en load_meat().

pandasql Syntax

De syntax van de sqldffunctie is erg eenvoudig:

sqldf(query, env=None)

Hier is query een verplicht parameter dat een SQL-query als string aanneemt, en env—een optioneel (en zelden nuttig) parameter dat locals() of globals() kan zijn en die sqldf toelaat om toegang te krijgen tot het overeenkomstige set van variabelen in uw Python-omgeving.

De sqldffunctie retourneert het resultaat van een query als een pandas dataframe.

Wanneer we pandasql kunnen gebruiken

De pandasql-bibliotheek laat werken met gegevens door gebruik te maken van de Data Query Language (DQL), die een van de subsets van SQL is. Met andere woorden, met pandasql kunnen we queries uitvoeren op de gegevens die zijn opgeslagen in een database om de nodige informatie eruit te halen. In het bijzonder kunnen we toegang krijgen tot, extraheren, filteren, sorteren, groeperen, samenvoegen, aggregeren van de gegevens, en wiskundige of logische bewerkingen uitvoeren daarop.

Wanneer we pandasql niet kunnen gebruiken

pandasql staat niet toe om enige andere subset van SQL buiten DQL toe te passen. Dit betekent dat we pandasql niet kunnen toepassen om tabellen te wijzigen (bijwerken, afkappen, invoegen, etc.) of om de gegevens in een tabel te wijzigen (bijwerken, verwijderen of invoegen).

Hieronder vindt u de vertaling van het bovenstaande Engelse gegevenstekst in de Nederlandse taal, conform de gewoone spreek- en schrijfwijze:

Ook al is deze bibliotheek gebaseerd op SQL-syntaxis, moeten we ons bewaren op de bekende ongelukkigheden in SQLite.

Voorbeelden van het gebruik van pandasql

Nu zullen we een meer gedetailleerde blik op hoe u SQL-query’s kunt uitvoeren op pandas dataframes met behulp van de sqldf functie van pandasql. Om iets te hebben om op te praktiseren, laadt let op een van de ingebouwde datasets van de seaborn bibliotheek—penguins:

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

Uitvoer:

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

Als u uw SQL-vaardigheden moet verversen, is onze SQL Fundamentals vaardighedenbaan een goed referentiepunt.

Data uitgeven met pandasql

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

Uitvoer:

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

Bovenop hebben we informatie gehaald over de soort en geografie van de eerste vijf pinguïns uit de penguins dataframe. Noteer dat het uitvoeren van de sqldf functie een pandas dataframe teruggeeft:

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

Uitvoer:

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

In pure pandas zou dit zijn:

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

Uitvoer:

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

Een ander voorbeeld is het halen van unieke waarden uit een kolom:

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

Uitvoer:

species 0 Adelie 1 Chinstrap 2 Gentoo

In pandas zou dat zijn:

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

Uitvoer:

['Adelie' 'Chinstrap' 'Gentoo']

Data sorteren met pandasql

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

Uitvoer:

body_mass_g 0 6300.0 1 6050.0 2 6000.0 3 6000.0 4 5950.0

Bovenstaand hebben we onze penguins gesorteerd op lichaamsgewicht in aflopende volgorde en de top vijf waarden van het lichaamsgewicht getoond.

In pandas, het zou zijn:

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

Uitvoer:

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

Filteren van gegevens met pandasql

Probeer hetzelfde voorbeeld dat we in het hoofdstuk ‘Waarom SQL gebruiken in pandas’ noemden: het extraheren van de unieke soorten pinguïns die mannen zijn en een vleugel die langer is dan 210 mm hebben:

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

Uitvoer:

species 0 Chinstrap 1 Gentoo

Boven filterden we de gegevens op basis van twee voorwaarden: sex = 'Male' en flipper_length_mm > 210.

Hetzelfde code in pandas zou iets overweldigender zijn:

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

Uitvoer:

['Chinstrap' 'Gentoo']

Groeperen en aggregeren van gegevens met pandasql

Laat nu data groeperen en aggregeren om de langste snavel voor elke soort in de dataframe te vinden:

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

Uitvoer:

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

Hetzelfde code in pandas:

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

Uitvoer:

species bill_length_mm 0 Adelie 46.0 1 Chinstrap 58.0 2 Gentoo 59.6

Uitvoeren van wiskundige bewerkingen met pandasql

Met pandasql kunnen we gemakkelijk wiskundige of logische bewerkingen op de gegevens uitvoeren. Laten we eens denken dat we de verhouding tussen snavellengte en -diepte willen berekenen voor elke penguin en de topvijf waarden van deze meting willen weergeven:

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

Uitvoer:

length_to_depth 0 3.612676 1 3.510490 2 3.505882 3 3.492424 4 3.458599

Let op dat ditmaal we de alias length_to_depth voor de kolom met de verhoudingswaarden gebruikten. Anders zouden we een kolom met de afschrikwekkende naam bill_length_mm / bill_depth_mm krijgen.

In pandas zouden we eerst een nieuwe kolom moeten maken met de verhoudingswaarden:

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())

Uitvoer:

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

Conclusie

Om af te sluiten, in deze tutorial hebben we onderzocht waarom en wanneer we de functionaliteit van SQL voor pandas kunnen combineren om betere, efficiëntere code te schrijven. We hebben besproken hoe je de pandasql-bibliotheek hiervoor kunt instellen en gebruiken en welke beperkingen dit pakket heeft. Ten slotte hebben we talloze populaire voorbeelden van de praktische toepassing van pandasql overwogen en in elk geval de code vergeleken met het pandas-tegenhanger.

Nu heb je alles wat je nodig hebt om SQL voor pandas toe te passen in real-world projecten. Een geweldige plek om te oefenen is de DataLab, DataCamp’s door AI ondersteund data-notebook met uitstekende SQL-ondersteuning.

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