Χρήση Pandas και SQL Together για ανάλυση δεδομένων
Σε αυτό το σεμινάριο, θα διερευνήσουμε πότε και πώς μπορεί να ενσωματωθεί η λειτουργικότητα SQL στο πλαίσιο του Pandas, καθώς και οι περιορισμοί του.
Η SQL ή η Structured Query Language, είναι εδώ και πολύ καιρό το πιο χρήσιμο εργαλείο για τη διαχείριση δεδομένων, αλλά υπάρχουν φορές που υπολείπεται, απαιτώντας την ισχύ και την ευελιξία ενός εργαλείου όπως η Python. Η Python, μια ευέλικτη γλώσσα προγραμματισμού πολλαπλών χρήσεων, υπερέχει στην πρόσβαση, την εξαγωγή, τη διαμάχη και την εξερεύνηση δεδομένων από σχεσιακές βάσεις δεδομένων. Μέσα στην Python, η βιβλιοθήκη ανοιχτού κώδικα Pandas είναι ειδικά δημιουργημένη για χειρισμό και ανάλυση δεδομένων.
Σε αυτό το σεμινάριο, θα διερευνήσουμε πότε και πώς μπορεί να ενσωματωθεί η λειτουργικότητα SQL στο πλαίσιο του Pandas, καθώς και οι περιορισμοί του.
Η κύρια ερώτηση που ίσως αναρωτιέστε αυτή τη στιγμή είναι...
Γιατί να χρησιμοποιήσετε και τα δύο;
Ο λόγος έγκειται στην αναγνωσιμότητα και την εξοικείωση: σε ορισμένες περιπτώσεις, ειδικά σε πολύπλοκες ροές εργασίας, τα ερωτήματα SQL μπορεί να είναι πολύ πιο ξεκάθαρα και πιο ευανάγνωστα από τον αντίστοιχο κώδικα Pandas. Αυτό ισχύει ιδιαίτερα για όσους άρχισαν να εργάζονται με δεδομένα σε SQL πριν μεταβούν στα Pandas.
Επιπλέον, δεδομένου ότι τα περισσότερα δεδομένα προέρχονται από βάσεις δεδομένων, η SQL — που είναι η μητρική γλώσσα αυτών των βάσεων δεδομένων — προσφέρει ένα φυσικό πλεονέκτημα. Αυτός είναι ο λόγος για τον οποίο πολλοί επαγγελματίες δεδομένων, ιδιαίτερα οι επιστήμονες δεδομένων, συχνά ενσωματώνουν τόσο την SQL όσο και την Python (συγκεκριμένα, τα Panda) στον ίδιο αγωγό δεδομένων για να αξιοποιήσουν τα δυνατά σημεία του καθενός.
Για να δούμε την αναγνωσιμότητα της SQL σε δράση, ας χρησιμοποιήσουμε το ακόλουθο αρχείο pokemon gen1 pokedex csv.
Φανταστείτε ότι θέλουμε να ταξινομήσουμε το DataFrame κατά τη στήλη "Σύνολο" σε αύξουσα σειρά και να εμφανίσουμε τα 5 κορυφαία. Τώρα μπορούμε να συγκρίνουμε τον τρόπο εκτέλεσης της ίδιας ενέργειας τόσο με τα Panda όσο και με την SQL.
Χρήση Pandas με Python:
data[["#", "Name", "Total"]].sort_values(by="Total", ascending=True).head(5)
Χρήση SQL:
SELECT
"#",
Name,
Total
FROM data
ORDER BY Total
LIMIT 5
Βλέπεις πόσο διαφορετικά είναι και τα δύο σωστά; Αλλά... πώς μπορούμε να συνδυάσουμε και τις δύο γλώσσες στο εργασιακό μας περιβάλλον με την Python;
Η λύση χρησιμοποιεί την PandaSQL!
Χρήση PandaSQL
Το Pandas είναι μια ισχυρή βιβλιοθήκη python για ανάλυση και χειρισμό δεδομένων ανοιχτού κώδικα. Το PandaSQL επιτρέπει τη χρήση της σύνταξης SQL για την υποβολή ερωτημάτων στο Pandas DataFrames. Για τους νέους χρήστες των Panda, η PandaSQL προσπαθεί να κάνει πιο οικεία τη χειραγώγηση και την εκκαθάριση δεδομένων. Μπορείτε να χρησιμοποιήσετε το PandaSQL για να ρωτήσετε Pandas DataFrames χρησιμοποιώντας σύνταξη SQL.
Ας ρίξουμε μια ματιά.
Πρώτα, πρέπει να εγκαταστήσουμε το PandaSQL:
pip install pandasql
Στη συνέχεια (όπως πάντα), εισάγουμε τα απαιτούμενα πακέτα:
from pandasql import sqldf
Εδώ, εισαγάγαμε απευθείας τη συνάρτηση sqldf
από το PandaSQL, που είναι ουσιαστικά το βασικό χαρακτηριστικό της βιβλιοθήκης. Όπως υποδηλώνει το όνομα, το sqldf
σάς επιτρέπει να υποβάλετε ερωτήματα στα DataFrames χρησιμοποιώντας σύνταξη SQL.
sqldf(query_string, env=None)
Σε αυτό το πλαίσιο, το query_string
είναι μια απαιτούμενη παράμετρος που δέχεται ένα ερώτημα SQL σε μορφή συμβολοσειράς. Η παράμετρος env
, προαιρετική και σπάνια χρησιμοποιείται, μπορεί να οριστεί είτε σε locals()
είτε σε globals()
, ενεργοποιώντας το sqldf
για πρόσβαση σε μεταβλητές από το καθορισμένο πεδίο εφαρμογής στο περιβάλλον Python σας.
Πέρα από αυτή τη συνάρτηση, το PandaSQL περιλαμβάνει επίσης δύο βασικά ενσωματωμένα σύνολα δεδομένων που μπορούν να φορτωθούν με τις απλές συναρτήσεις: load_births()
και load_meat()
. Με αυτόν τον τρόπο έχετε ενσωματωμένα μερικά εικονικά δεδομένα για να παίξετε.
Λοιπόν, τώρα, αν θέλουμε να εκτελέσουμε το προηγούμενο ερώτημα SQL στο σημειωματάριό μας Python Jupyter, θα είναι κάτι σαν το εξής:
from pandasql import sqldf
import pandas as pd
sqldf('''
SELECT "#", Name, Total
FROM data
ORDER BY Total
LIMIT 5''')
Η συνάρτηση sqldf
επιστρέφει το αποτέλεσμα ενός ερωτήματος ως Pandas DataFrame.
Πότε πρέπει να το χρησιμοποιήσουμε
Η βιβλιοθήκη pandasql επιτρέπει τον χειρισμό δεδομένων χρησιμοποιώντας τη γλώσσα ερωτημάτων δεδομένων της SQL (DQL), παρέχοντας μια οικεία προσέγγιση βασισμένη σε SQL για την αλληλεπίδραση με δεδομένα στα Pandas DataFrames.
Με το pandasql, μπορείτε να εκτελέσετε ερωτήματα απευθείας στο σύνολο δεδομένων σας, επιτρέποντας την αποτελεσματική ανάκτηση δεδομένων, φιλτράρισμα, ταξινόμηση, ομαδοποίηση, ένωση και συγκέντρωση δεδομένων.
Επιπλέον, υποστηρίζει την εκτέλεση μαθηματικών και λογικών πράξεων, καθιστώντας το ένα ισχυρό εργαλείο για χρήστες με γνώσεις SQL που εργάζονται με δεδομένα στην Python.
Το PandaSQL περιορίζεται στο υποσύνολο Data Query Language (DQL) της SQL, που σημαίνει ότι δεν υποστηρίζει την τροποποίηση πινάκων ή δεδομένων—ενέργειες όπως UPDATE
, INSERT
ή DELETE
δεν είναι διαθέσιμα.
Επιπλέον, δεδομένου ότι το PandaSQL βασίζεται στη σύνταξη SQL, συγκεκριμένα στο SQLite, είναι απαραίτητο να προσέχετε τις ιδιορρυθμίες που σχετίζονται με το SQLite που μπορεί να επηρεάσουν τη συμπεριφορά των ερωτημάτων.
Σύγκριση PandasSQL και SQL
Αυτή η ενότητα δείχνει πώς το PandaSQL και το Panda μπορούν και τα δύο να χρησιμοποιηθούν για την επίτευξη παρόμοιων αποτελεσμάτων, προσφέροντας συγκρίσεις δίπλα-δίπλα για να τονιστούν οι αντίστοιχες προσεγγίσεις τους.
Δημιουργία πολλαπλών πινάκων
Ας δημιουργήσουμε υποσύνολα δεδομένων από ένα μεγαλύτερο σύνολο δεδομένων, δημιουργώντας πίνακες όπως τύπους, θρυλικά, γενιές και χαρακτηριστικά. Χρησιμοποιώντας το PandaSQL, μπορούμε να καθορίσουμε ερωτήματα SQL για να επιλέξουμε συγκεκριμένες στήλες, διευκολύνοντας την εξαγωγή των ακριβών δεδομένων που θέλουμε.
Χρήση PandaSQL:
types = sqldf('''
SELECT "#", Name, "Type 1", "Type 2"
FROM data''')
legendaries = sqldf('''
SELECT "#", Name, Legendary
FROM data''')
generations = sqldf('''
SELECT "#", Name, Generation
FROM data''')
features = sqldf('''
SELECT "#", Name, Total, HP, Attack, Defense, "Sp. Atk", "Sp. Def","Speed"
FROM data''')
Εδώ, το PandaSQL επιτρέπει μια καθαρή, βασισμένη σε SQL σύνταξη επιλογής που μπορεί να φαίνεται διαισθητική στους χρήστες που είναι εξοικειωμένοι με τις σχεσιακές βάσεις δεδομένων. Είναι ιδιαίτερα χρήσιμο εάν η επιλογή δεδομένων περιλαμβάνει σύνθετες συνθήκες ή συναρτήσεις SQL.
Χρησιμοποιώντας καθαρή Python:
# Selecting columns for types
types = data[['#', 'Name', 'Type 1', 'Type 2']]
# Selecting columns for legendaries
legendaries = data[['#','Name', 'Legendary']]
# Selecting columns for generations
generations = data[['#','Name', 'Generation']]
# Selecting columns for features
features = data[['#','Name', 'Total', 'HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed']]
Στην καθαρή Python, επιτυγχάνουμε το ίδιο αποτέλεσμα καθορίζοντας απλά ονόματα στηλών μέσα σε αγκύλες. Αν και αυτό είναι αποτελεσματικό για την απλή επιλογή στηλών, μπορεί να γίνει λιγότερο ευανάγνωστο με πιο σύνθετες συνθήκες φιλτραρίσματος ή ομαδοποίησης, όπου η σύνταξη τύπου SQL μπορεί να είναι πιο φυσική.
Εκτέλεση JOIN
Οι συνδέσεις είναι ένας ισχυρός τρόπος για να συνδυάσετε δεδομένα από πολλαπλές πηγές που βασίζονται σε κοινές στήλες και το υποστηρίζουν τόσο το PandaSQL όσο και το Panda.
Πρώτον, PandaSQL:
types_features = sqldf('''
SELECT
t1.*,
t2.Total,
t2.HP,
t2.Attack,
t2.Defense,
t2."Sp. Atk",
t2."Sp. Def",
t2."Speed"
FROM types AS t1
LEFT JOIN features AS t2
ON t1."#" = t2."#"
AND t1.Name = t2.Name
''')
Χρησιμοποιώντας το SQL, αυτό το LEFT JOIN συνδυάζει τύπους και χαρακτηριστικά που βασίζονται σε τιμές που ταιριάζουν στις στήλες # και Όνομα. Αυτή η προσέγγιση είναι απλή για χρήστες SQL, με σαφή σύνταξη για την επιλογή συγκεκριμένων στηλών και το συνδυασμό δεδομένων από πολλούς πίνακες.
Στην καθαρή Python:
# Performing a left join between `types` and `features` on the columns "#" and "Name"
types_features = types.merge(
features,
on=['#', 'Name'],
how='left'
)
types_features
Στην καθαρή Python, επιτυγχάνουμε το ίδιο αποτέλεσμα χρησιμοποιώντας τη συνάρτηση merge()
, ορίζοντας την για αντιστοίχιση στηλών και το how='left'
για την εκτέλεση αριστερής σύνδεσης. Το Pandas διευκολύνει τη συγχώνευση σε πολλές στήλες και προσφέρει ευελιξία στον καθορισμό τύπων ένωσης. Ωστόσο, η σύνταξη σύνδεσης τύπου SQL μπορεί να είναι πιο ευανάγνωστη όταν εργάζεστε με μεγαλύτερους πίνακες ή όταν εκτελείτε πιο σύνθετες συνδέσεις.
Προσαρμοσμένο ερώτημα
Σε αυτό το παράδειγμα, ανακτούμε τις κορυφαίες 5 εγγραφές με βάση την "Άμυνα", ταξινομημένες με φθίνουσα σειρά.
PandaSQL:
top_5_defense = sqldf('''
SELECT
Name, Defense
FROM features
ORDER BY Defense DESC
LIMIT 5
''')
Το ερώτημα SQL ταξινομεί τα χαρακτηριστικά κατά τη στήλη Άμυνα με φθίνουσα σειρά και περιορίζει το αποτέλεσμα στις κορυφαίες 5 καταχωρήσεις. Αυτή η προσέγγιση είναι άμεση, ειδικά για χρήστες SQL, με τις λέξεις-κλειδιά ORDER BY
και LIMIT
να καθιστούν σαφές τι κάνει το ερώτημα.
Και στην καθαρή Python:
top_5_defense = features[['Name', 'Defense']].sort_values(by='Defense', ascending=False).head(5)
Χρησιμοποιώντας μόνο Python, πετυχαίνουμε το ίδιο αποτέλεσμα χρησιμοποιώντας sort_values()
κατά σειρά Defence και μετά head(5)
για να περιορίσουμε την έξοδο. Το Pandas παρέχει μια ευέλικτη και διαισθητική σύνταξη για την ταξινόμηση και την επιλογή εγγραφών, αν και η προσέγγιση SQL μπορεί να είναι ακόμα πιο οικεία σε όσους εργάζονται τακτικά με βάσεις δεδομένων.
Σύναψη
Σε αυτό το σεμινάριο, εξετάσαμε πώς και πότε ο συνδυασμός της λειτουργικότητας SQL με τα Panda μπορεί να βοηθήσει στην παραγωγή καθαρότερου και αποτελεσματικότερου κώδικα. Καλύψαμε τη ρύθμιση και τη χρήση της βιβλιοθήκης PandaSQL, μαζί με τους περιορισμούς της, και περιηγηθήκαμε σε δημοφιλή παραδείγματα για να συγκρίνουμε τον κώδικα PandaSQL με τον αντίστοιχο κώδικα Pandas Python.
Συγκρίνοντας αυτές τις προσεγγίσεις, μπορείτε να δείτε ότι το PandaSQL είναι χρήσιμο για εγγενείς χρήστες SQL ή σενάρια με πολύπλοκα ερωτήματα, ενώ ο εγγενής κώδικας Pandas μπορεί να είναι πιο Pythonic και ενσωματωμένος για όσους έχουν συνηθίσει να εργάζονται στην Python.
Μπορείτε να ελέγξετε όλο τον κώδικα που εμφανίζεται εδώ στο παρακάτω Σημειωματάριο Jupyter