Pandas for Biologists: Data Manipulation Exercises (in Hebrew)
yuval bloch
title: “Pandas for Biologists: Data Manipulation Exercises” description: “A practical guide with hands-on tasks for mastering data manipulation and analysis using Pandas DataFrames in Python, with a focus on biological datasets.”
הערה חשובה! – יש להריץ בקובץ ה־main בלבד
בשבוע הבא בתרגול תשתמשו בפונקציות שתכתבו הפעם, דרך import
של קובץ הקוד שאתם כותבים עכשיו אל הקוד שתכתבו בשבוע הבא.
כשתעשו זאת, כל הקוד שבקובץ הנוכחי ירוץ בתחילת הקוד שלכם בשבוע הבא, וכך תהיה לכם גישה לפונקציות שכתבתם.
עם זאת, קיימת בעיה: גם הקטעים בקוד שאינם פונקציות ירוצו וידפיסו פלט שעלול לבלבל אתכם.
כדי למנוע זאת, יש להוסיף לכל קטע קוד שאינו הגדרת פונקציה את התנאי הבא:
if __name__ == "__main__":
כך, הקוד שבתוך התנאי ירוץ רק כאשר תפעילו את הקובץ ישירות, ולא כאשר תייבאו אותו באמצעות import
.
בנוסף, חשוב לשמור את הקוד בצורה מסודרת ולתעד היטב כל פונקציה כדי שתוכלו להשתמש בה בקלות בעתיד.
📊 שאלה 1 – חקירת מאגר הנתונים של פרחי האירוס
מאגר הנתונים Iris כולל מדידות של אורך ורוחב עלי גביע (Sepal) ועלי כותרת (Petal) עבור שלושה מיני פרחי אירוס. בשתי השאלות הבאות נשתמש בספריית pandas
לצורך ניתוח הנתונים.
א. טעינת הנתונים וניתוח ראשוני
-
הורידו את קובץ הנתונים
iris.csv
מאתר הקורס וייבאו אותו באמצעותpandas.read_csv
. -
הציגו את חמש השורות הראשונות של הטבלה בעזרת
df.head
. -
השתמשו ב־
df.describe
כדי להפיק מדדים סטטיסטיים בסיסיים (ממוצע, סטיית תקן, מינימום, מקסימום וכו’). -
הפיקו רשימה של כל המינים הקיימים בעמודת
Species
.
ב. ממוצע תכונה לפי מין
כתבו פונקציה:
def mean_by_species(df, feature):
שהקלט שלה הוא:
-
df
– טבלת הנתונים -
feature
– שם של עמודה מספרית
והפלט הוא DataFrame
שבו:
-
כל שורה מייצגת מין אחד של פרח
-
עמודה אחת מציינת את ממוצע הערכים של אותה תכונה באותו מין
-
הטבלה ממוינת לפי הממוצע מהנמוך לגבוה
ג. שמירת התוצאה לקובץ
-
השתמשו בפונקציה
mean_by_species
על התכונהSepalLengthCm
. -
שמרו את התוצאה לקובץ CSV חדש.
🌸 שאלה 2 – יכולת זיהוי מינים לפי תכונות
בתרגיל זה נבחן עד כמה כל אחת מהתכונות מאפשרת להבדיל בין מיני הפרחים.
א. טווח ערכים לפי מין
כתבו פונקציה:
def feature_range_by_species(df, feature):
שמחזירה DataFrame
שבו לכל מין מופיעים שני ערכים: המינימום והמקסימום של התכונה הנתונה עבור אותו מין.
ב – חישוב כמות דגימות בתחום הזיהוי של כל מין
כתבו פונקציה:
def count_in_range(df, feature):
פונקציה זו תחשב, עבור כל מין (Species
), כמה דגימות בטבלה הכללית נמצאות בתחום הערכים (מינימום עד מקסימום) של אותו מין – ללא קשר לשאלה אם הן שייכות למין הזה בפועל.
הנחיות:
-
השתמשו בפונקציה
feature_range_by_species(df, feature)
מהסעיף הקודם כדי לקבל את ערכי המינימום והמקסימום של כל מין. -
עברו על כל מין, וקבעו את תחום הערכים שלו (min/max).
-
בדקו כמה שורות בטבלה עומדות בתנאי:
min_val <= df[feature] <= max_val
-
שמרו את התוצאה ב־
DataFrame
חדש, שבו לכל מין מופיע מספר הדגימות שנפלו בתחום הזה. -
החזירו את הטבלה. דוגמת הרצה:
count_in_range(iris, 'SepalLengthCm')
יחזיר
Species InRange
0 Iris-setosa 80
1 Iris-versicolor 122
2 Iris-virginica 134
ג. – חישוב דיוק הזיהוי לפי מין
בהמשך לשאלה הקודמת, כתבו פונקציה:
def feature_accuracy_by_species(df, feature):
פונקציה זו תחשב את אחוז הדיוק של תחום הזיהוי של כל מין כלומר: מתוך כל הדגימות שנמצאות בתחום הערכים של אותו מין (שחושב בשאלה ב’) – כמה מהן באמת שייכות למין הזה?
הנחיות:
-
קבלו את טבלת התחומים לכל מין (
feature_range_by_species
) ואת טבלת כמות הדגימות שנמצאות בתחום (count_in_range
). -
עבור כל מין:
-
חשבו כמה דגימות בפועל שייכות למין
spicie_population
-
כמה פריטים נמצאים בתחום הזיהוי שלו
population_in_range
-
חשבו את אחוז הדיוק
accuracy = (spicie_population / num_in_range) *100
-
-
שמרו את התוצאות בטבלה חדשה עם שלוש עמודות:
Species
,Accuracy
, ותחום הזיהוי (Min ו־Max). -
החזירו את הטבלה, ממוינת לפי דיוק מהגבוה לנמוך. דוגמת הרצה השורה
feature_accuracy_by_species(iris, 'SepalLengthCm')
Species Mean
2 Iris-virginica 6.588
1 Iris-versicolor 5.936
0 Iris-setosa 5.006
ד. דיוק לפי תכונה
כתבו פונקציה:
def overall_feature_accuracy(df):
שמייצרת data frame
עם שתי עמודות אחת היא של תכונה והשני היא רמת הדיוק הממוצעת בתכונה הזאת על פני כל המינים (ממוצע פשוט של עמודות הדיוק בטבלה שיצרתן בסעיף הקודם)
דוגמת הרצה
overall_feature_accuracy(iris)
תחזיר
Feature Overall Accuracy
2 PetalLengthCm 0.820600
3 PetalWidthCm 0.817340
0 SepalLengthCm 0.469323
1 SepalWidthCm 0.362980
ה. תכונה חדשה לזיהוי בעונת החורף
תכונות הקשורות ל־Petal
מאפשרות זיהוי מדויק יותר, אך ייתכן שאינן זמינות בחורף. לכן נגדיר תכונה חדשה:
- הוסיפו לטבלה עמודה חדשה בשם
SepalRatio
, שמבטאת את היחס בין אורך עלה הגביע לרוחבו: - צרו מחדש את טבלת ההשוואה של הדיוק הכללי הפעם אם התכונה החדשה כמה טוב התכונה החדשה חוזה ביחס לתכונות הקיימות בונוס: נסו ליצור תכונות נוספות לראות כמה טוב החיזוי איזה תכונה תאפשר את הזיהוי הטוב ביותר של פרח
ו. שמירה לקובץ
שימרו את הטבלה שקיבלתם לקובץ CSV
🐧 שאלה 3 – ניתוח נתוני פינגווינים
א. טעינת הנתונים
-
טענו את קובץ הנתונים
penguins_size.csv
באמצעותpandas.read_csv
. -
הציגו את חמש השורות הראשונות.
-
השתמשו ב־
describe
להצגת סטטיסטיקות תיאוריות של העמודות.
ב. ניקוי ערכים חסרים
כתבו פונקציה שמקבלת טבלת DataFrame
ומחזירה גרסה נקייה של הטבלה בהתאם לכללים הבאים:
-
אם בשורה יש יותר מערך חסר אחד – מחקו את השורה כולה.
-
אם קיים ערך חסר יחיד בעמודה מספרית – החליפו אותו בממוצע של אותה עמודה.
-
אם קיים ערך חסר יחיד בעמודה לא־מספרית – החליפו אותו בערך השכיח ביותר בעמודה זו.
הריצו את הפונקציה על הטבלה ושמורו לקובץ הסתכלו על הקובץ וודאו שקיבלתם תוצאה היגיונית
רמז: קראו על הפונקציה df.mode
ג. יחס זכרים לנקבות
כתבו פונקציה שמקבלת שם של אי ושם של מין פינגווין, ומחזירה את היחס בין מספר הזכרים למספר הנקבות באותה קבוצה.
ד. ניתוחים מתקדמים
כתבו קוד לענות על השאלות הבאות:
-
עבור איזה מין של פינגווינים אורך הסנפירים הממוצע של הנקבות הוא הגבוה ביותר?
-
באיזה אי אחוז הפינגווינים מהמין
"Adelie"
הוא הגבוה ביותר ביחס לכלל הפינגווינים באותו אי? -
עבור איזה מין יחס האורך בין מקור (culmen) ל־סנפיר (flipper) הוא הגבוה ביותר בממוצע?