SQL, או שפת הבקשות מבנתית, היא שפת תכנות שמשמשת לגישה, שינוי, עיבוד וחקירה של מידע שאינו נאגר במאגרי בסיס מידע רלונציונליים. פנדס היא ספקטר פתוח של הבית הקיץ של פייתון שמעוצב ספציפית עבור עיבוד מידע וניתוח.
במדריך הלימוד הזה, נדבר על מה ואיך אנחנו יכולים (ומתי אנחנו לא יכולים) להשתמש בפונקציות SQL במסגרת פנדס. בנוסף, נסתכל על מספר דוגמאות ליישום הגישה הזו ונשווה אותן לקוד שווה בפנדס בלבד.
מדוע להשתמש בSQL בפנדס?
בהתבסס על ההגדרות בקטע הקדמה, מדוע אדם ירצה להשתמש בשילוב SQL עם פנדס, כשהאחר הוא ערכת כוללת לניתוח מידע?
התשובה היא שבמקרים מסוימים, בעיקר בתוכניות מורכבות, שאלות SQL נראות הרבה יותר ברורות וקלות לקריאה מאשר הקוד הקשור בהן בפנדס. זה בעיקר נכון עבור אנשים שפעם השתמשו בSQL לעבודה עם מידע ואחר כך למדו פנדס.
אם אתה צריך יותר הדרכה בפנדס, תוכל לבדוק את הקורס עיבוד מידע עם פנדס ואת הטיטוריאל: DataFrames בפייתון.
כדי לראות את קריאת הסיסמלים בפעולה, נניח שיש לנו טאבלה (משטח נתונים) בשם penguins
שמכילה מידע שונה על הפינגווינים (ואנחנו נעבד עם טאבלה זו במהלך ההדרכה הזו). כדי לשלוף את כל המינים הייחודיים של הפינגווינים שהם זכרים ושיש להם ספיגות ארוכות יותר מ-210 מ"מ, נזדקק לקוד הבא בפנדס:
penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique()
במקום זאת, כדי לקבל את אותו המידע בעזרת SQL, נרצה את הקוד הבא:
SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210
קוד השני, כתוב בSQL, נראה כמעט כמו משפט אנגלית טבעי ולכן הוא הרבה יותר אינטואיבטיבי. אנחנו יכולים להגביר את קריאתו עוד על ידי להתפשט אותו לשורות מרובות:
SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210
עכשיו שאיתחלטנו על היתרונות של השימוש בSQL עבור pandas, הבה נראה איך אנחנו יכולים באופן טכני לשלב אותם ביחד.
איך להשתמש בpandasql
ספריית pandasql לפינדס מאפשרת לנו לשאול טאבלות פנדס באמצעות פעולות SQL בלי צורך בקישור לשרת SQL כלשהו. מעבר למנעד, היא משתמשת בסיסמלים SQLite ומזהה באופן אוטומטי את כל טאבלות פנדס וטיפלה בהן כעל טאבלות SQL רגילות.
הגדרת הסב境 שלך
ראשית, אנחנו צריכים להתקין pandasql:
pip install pandasql
אחר כך, אנחנו מבצעים העברה על החבילות הנחוצות:
from pandasql import sqldf import pandas as pd
plaintext
עליו, הכנסנו ישירות את הפונקציה sqldf
מתוך pandasql, שהיא כמעט הפונקציה היסודית היחידה של הספרייה. כפי שהשם מרמז, היא מיושמת לשאול מסדי נתונים באמצעות תחביר SQL. חוץ מהפונקציה הזו, pandasql מגיעה עם שני מערכי נתונים מובנים שניתן לטעון באמצעות פונקציות המסבירות את עצמן load_births()
ו-load_meat()
.
תחביר pandasql
התחביר של הפונקציה sqldf
הוא מאוד פשוט:
sqldf(query, env=None)
כאן, query
הוא פרמטר שדרוש ומקבל שאילתת SQL כמחרוזת, ו-env
—פרמטר אופציונלי (ומעידילי רק בהקשרים מיוחדים) שניתן להיות אם locals()
או globals()
ומאפשר ל-sqldf
לגשת לערכי המשתנים המתאימים בסביבת הפייתון שלך.
הפונקציה sqldf
מחזירה את תוצאות השאילתה כמסד נתונים של pandas.
כאשר אנחנו יכולים להשתמש ב-pandasql
הספרייה pandasql מאפשרת עבודה עם שפת שאילתת הנתונים (DQL), שהיא אחת התת-קבוצות של SQL. במילים אחרות, בעזרת pandasql אנחנו יכולים להריץ שאילות על הנתונים המאוחסנים במסד נתונים כדי להשיג את המידע הנחוץ ממנו. במיוחד, אנחנו יכולים לגשת, לחפש, לסנן, לקבץ, לצרף, לקבץ נתונים, ולבצע פעולות מתמטיות או לוגיות עליהם.
כאשר אנחנו לא יכולים להשתמש ב-pandasql
pandasql לא מאפשרת שימוש בשורה נוספ
בנוסף, מפני שהספרייה הזו מבוססת על תשתית SQL, עלינו להיות מודאגים מה מוקמפים הידועים בSQLite.
דוגמאות לשימוש בpandasql
עכשיו, נסתכל קרוב יותר על איך לבצע שאלות SQL על משקלים נתונים בעזרת תפקיד sqldf
של pandasql
. בכדי לקבל מידע להתאמן עליו, בואו נטען אחד מהמערכות נתונים הבניינים בספרייה Seaborn — penguins
:
import seaborn as sns penguins = sns.load_dataset('penguins') print(penguins.head())
ייצוא:
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
אם אתה צריך להרעיון את הכישורים שלך בSQL, המסלול המסודר בסיסים של SQL הוא מידע טוב להשתמש בו.
הוצאת נתונים בעזרת pandasql
print(sqldf('''SELECT species, island FROM penguins LIMIT 5'''))
ייצוא:
species island 0 Adelie Torgersen 1 Adelie Torgersen 2 Adelie Torgersen 3 Adelie Torgersen 4 Adelie Torgersen
למעלה, הוצאנו מידע על המינים והגאוגרפיה של חמשת הפינגווינים הראשונים מהמשקל penguins
. שימו לב שהריצוף של הsqldf
פונקציה מחזיר משקל נתונים פנדס:
print(type(sqldf('''SELECT species, island FROM penguins LIMIT 5''')))
ייצוא:
<class 'pandas.core.frame.DataFrame'>
בפנדס לבדו, זה יהיה:
print(penguins[['species', 'island']].head())
ייצוא:
species island 0 Adelie Torgersen 1 Adelie Torgersen 2 Adelie Torgersen 3 Adelie Torgersen 4 Adelie Torgersen
דוגמה נוספת היא להוציא את הערכים הייחודיים מעמד:
print(sqldf('''SELECT DISTINCT species FROM penguins'''))
ייצוא:
species 0 Adelie 1 Chinstrap 2 Gentoo
בפנדס, זה יהיה:
print(penguins['species'].unique())
ייצוא:
['Adelie' 'Chinstrap' 'Gentoo']
מייצול נתונים בעזרת pandasql
print(sqldf('''SELECT body_mass_g FROM penguins ORDER BY body_mass_g DESC LIMIT 5'''))
ייצוא:
body_mass_g 0 6300.0 1 6050.0 2 6000.0 3 6000.0 4 5950.0
למעלה, מייצלנו את הפינגווינים לפי מסה גוף בסדר ירידה והצגנו את ח
בפנדס, זה יהיה:
print(penguins['body_mass_g'].sort_values(ascending=False, ignore_index=True).head())
פלט:
0 6300.0 1 6050.0 2 6000.0 3 6000.0 4 5950.0 Name: body_mass_g, dtype: float64
סינון מידע באמצעות pandasql
בואו ננסה את אותו הדוגמה שהזכרנו בפרק למה להשתמש בSQL ב-pandas: למשוך את המינים הייחודיים של הפינגווינים הזכרים ושיש להם סנפירים ארוכים יותר מ-210 מ"מ:
print(sqldf('''SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210'''))
פלט:
species 0 Chinstrap 1 Gentoo
מעלה, סיננו את המידע בהתבסס על שני תנאים: sex = 'Male'
ו-flipper_length_mm > 210
.
אותו הקוד ב-pandas ייראה קצת יותר מטריד:
print(penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique())
פלט:
['Chinstrap' 'Gentoo']
קיבוץ וסכום מידע עם pandasql
עכשיו, בואו ניישם קיבוץ וסכום מידע כדי למצוא את הזנב הארוך ביותר לכל מין בטבלת הנתונים:
print(sqldf('''SELECT species, MAX(bill_length_mm) FROM penguins GROUP BY species'''))
פלט:
species MAX(bill_length_mm) 0 Adelie 46.0 1 Chinstrap 58.0 2 Gentoo 59.6
אותו הקוד ב-pandas:
print(penguins[['species', 'bill_length_mm']].groupby('species', as_index=False).max())
פלט:
species bill_length_mm 0 Adelie 46.0 1 Chinstrap 58.0 2 Gentoo 59.6
ביצוע פעולות מתמטיות עם pandasql
עם pandasql, נוכל בקלות לבצע פעולות מתמטיות או לוגיות על המידע. בואו נדמיין שרוצים לחשב את יחס האורך-לעומק של הזנב עבור כל פינגווין ולהציג את חמישה הערכים הגבוהים ביותר של המדידה הזו:
print(sqldf('''SELECT bill_length_mm / bill_depth_mm AS length_to_depth FROM penguins ORDER BY length_to_depth DESC LIMIT 5'''))
פלט:
length_to_depth 0 3.612676 1 3.510490 2 3.505882 3 3.492424 4 3.458599
שים לב שכעת, השתמשנו בכינוי length_to_depth
עבור העמודה עם הערכי היחס. אחרת, היינו מקבלים עמודה עם שם עצום bill_length_mm / bill_depth_mm
.
ב-pandas, היינו צריכים קודם ליצור עמודה חדשה עם הערכי היחס:
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())
פלט:
0 3.612676 1 3.510490 2 3.505882 3 3.492424 4 3.458599 Name: length_to_depth, dtype: float64
מסקנה
בסוף, בהדרכה זו, בדקנו מדוע ובאיזה זמן אנחנו יכולים לשלב את הפונקציות של SQL עם pandas כדי לכתוב קוד טוב יותר ויעיל יותר. דיברנו על איך להגדיר ולהשתמש בספריית pandasql למטרה זו ועל מגבלות הערך הזה. לבסוף, הבחנו במספר דוגמאות פופולריות של יישומים מעשיים של pandasql ובכל מקרה, השוואנו את הקוד עם הקוד השולייה של pandas.
עכשיו יש לך את כל מה שצריך על מנת ליישם SQL עם pandas בפרוייקטים של המציאות. מקום מעולה להתאמן שלך הוא DataLab של DataCamp, שהוא שולחן הערת הנתונים עם תמיכה בעזרת המידע של AI של DataCamp ותמיכה טובה בSQL.
Source:
https://www.datacamp.com/tutorial/how-to-use-sql-in-pandas-using-pandasql-queries