כיצד להשתמש ב-SQL בפנדות באמצעות שאילתות pandasql

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