You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Data-Science-For-Beginners/translations/he/2-Working-With-Data/07-python/README.md

26 KiB

עבודה עם נתונים: פייתון וספריית Pandas

 איור מאת (@sketchthedocs)
עבודה עם פייתון - איור מאת @nitya

סרטון מבוא

בעוד שמסדי נתונים מציעים דרכים יעילות מאוד לאחסן נתונים ולשאול אותם באמצעות שפות שאילתה, הדרך הגמישה ביותר לעיבוד נתונים היא כתיבת תוכנית משלך כדי לעבד את הנתונים. במקרים רבים, שאילתה במסד נתונים תהיה דרך יעילה יותר. עם זאת, במקרים שבהם נדרש עיבוד נתונים מורכב יותר, לא ניתן לבצע זאת בקלות באמצעות SQL.
עיבוד נתונים ניתן לתכנות בכל שפת תכנות, אך ישנן שפות מסוימות שהן ברמה גבוהה יותר בכל הנוגע לעבודה עם נתונים. מדעני נתונים בדרך כלל מעדיפים אחת מהשפות הבאות:

  • Python, שפת תכנות כללית, שנחשבת לעיתים קרובות לאחת האפשרויות הטובות ביותר למתחילים בשל הפשטות שלה. לפייתון יש הרבה ספריות נוספות שיכולות לעזור לך לפתור בעיות מעשיות רבות, כמו חילוץ נתונים מארכיון ZIP או המרת תמונה לגווני אפור. בנוסף למדעי הנתונים, פייתון משמשת לעיתים קרובות גם לפיתוח אתרים.
  • R היא כלי מסורתי שפותח עם עיבוד נתונים סטטיסטיים בראש. היא מכילה גם מאגר גדול של ספריות (CRAN), מה שהופך אותה לבחירה טובה לעיבוד נתונים. עם זאת, R אינה שפת תכנות כללית, והיא משמשת לעיתים רחוקות מחוץ לתחום מדעי הנתונים.
  • Julia היא שפה נוספת שפותחה במיוחד עבור מדעי הנתונים. היא נועדה לספק ביצועים טובים יותר מפייתון, מה שהופך אותה לכלי מצוין לניסויים מדעיים.

בשיעור זה נתמקד בשימוש בפייתון לעיבוד נתונים פשוט. נניח היכרות בסיסית עם השפה. אם ברצונך להעמיק בפייתון, תוכל לעיין באחד מהמשאבים הבאים:

נתונים יכולים להגיע בצורות רבות. בשיעור זה נתמקד בשלוש צורות של נתונים - נתונים טבלאיים, טקסט ותמונות.

נתמקד בכמה דוגמאות לעיבוד נתונים, במקום לתת סקירה מלאה של כל הספריות הקשורות. זה יאפשר לך להבין את הרעיון המרכזי של מה אפשרי, ולהשאיר אותך עם הבנה היכן למצוא פתרונות לבעיות שלך כשאתה זקוק להם.

העצה הכי שימושית. כשאתה צריך לבצע פעולה מסוימת על נתונים ואינך יודע איך לעשות זאת, נסה לחפש באינטרנט. Stackoverflow מכיל בדרך כלל הרבה דוגמאות קוד שימושיות בפייתון עבור משימות טיפוסיות רבות.

שאלון לפני השיעור

נתונים טבלאיים ו-Dataframes

כבר פגשת נתונים טבלאיים כשדיברנו על מסדי נתונים יחסיים. כשיש לך הרבה נתונים, והם נמצאים בטבלאות רבות ומקושרות, בהחלט יש היגיון להשתמש ב-SQL לעבודה איתם. עם זאת, ישנם מקרים רבים שבהם יש לנו טבלה של נתונים, ואנו צריכים לקבל הבנה או תובנות על נתונים אלו, כמו התפלגות, מתאם בין ערכים, וכו'. במדעי הנתונים, ישנם מקרים רבים שבהם אנו צריכים לבצע כמה טרנספורמציות של הנתונים המקוריים, ולאחר מכן ויזואליזציה. שני השלבים הללו יכולים להתבצע בקלות באמצעות פייתון.

ישנן שתי ספריות שימושיות ביותר בפייתון שיכולות לעזור לך להתמודד עם נתונים טבלאיים:

  • Pandas מאפשרת לך לעבוד עם Dataframes, שהם אנלוגיים לטבלאות יחסיות. ניתן להגדיר עמודות עם שמות, ולבצע פעולות שונות על שורות, עמודות ו-Dataframes באופן כללי.
  • Numpy היא ספרייה לעבודה עם tensors, כלומר מערכים רב-ממדיים. מערך מכיל ערכים מסוג בסיסי אחיד, והוא פשוט יותר מ-Dataframe, אך מציע יותר פעולות מתמטיות ויוצר פחות עומס.

ישנן גם כמה ספריות נוספות שכדאי להכיר:

  • Matplotlib היא ספרייה המשמשת לוויזואליזציה של נתונים ושרטוט גרפים
  • SciPy היא ספרייה עם פונקציות מדעיות נוספות. כבר נתקלנו בספרייה זו כשדיברנו על הסתברות וסטטיסטיקה

הנה קטע קוד שתשתמש בו בדרך כלל לייבוא הספריות הללו בתחילת תוכנית פייתון:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import ... # you need to specify exact sub-packages that you need

Pandas מתמקדת בכמה מושגים בסיסיים.

Series

Series היא רצף של ערכים, בדומה לרשימה או מערך numpy. ההבדל העיקרי הוא של-Series יש גם אינדקס, וכשמבצעים פעולות על Series (למשל, חיבור), האינדקס נלקח בחשבון. האינדקס יכול להיות פשוט כמו מספר שורה שלם (זהו האינדקס המשמש כברירת מחדל כשיוצרים Series מרשימה או מערך), או שהוא יכול להיות בעל מבנה מורכב, כמו טווח תאריכים.

הערה: יש קוד מבואי ל-Pandas במחברת המצורפת notebook.ipynb. אנו מציינים כאן רק חלק מהדוגמאות, ואתם בהחלט מוזמנים לבדוק את המחברת המלאה.

נניח לדוגמה: אנו רוצים לנתח מכירות של דוכן גלידה שלנו. בואו ניצור סדרה של מספרי מכירות (מספר הפריטים שנמכרו בכל יום) לתקופת זמן מסוימת:

start_date = "Jan 1, 2020"
end_date = "Mar 31, 2020"
idx = pd.date_range(start_date,end_date)
print(f"Length of index is {len(idx)}")
items_sold = pd.Series(np.random.randint(25,50,size=len(idx)),index=idx)
items_sold.plot()

גרף סדרת זמן

עכשיו נניח שבכל שבוע אנו מארגנים מסיבה לחברים, ולוקחים 10 חבילות גלידה נוספות למסיבה. נוכל ליצור סדרה נוספת, שמאונדקסת לפי שבוע, כדי להדגים זאת:

additional_items = pd.Series(10,index=pd.date_range(start_date,end_date,freq="W"))

כשנחבר את שתי הסדרות יחד, נקבל את המספר הכולל:

total_items = items_sold.add(additional_items,fill_value=0)
total_items.plot()

גרף סדרת זמן

הערה שאיננו משתמשים בתחביר הפשוט total_items+additional_items. אם היינו עושים זאת, היינו מקבלים הרבה ערכי NaN (לא מספר) בסדרה המתקבלת. זאת מכיוון שיש ערכים חסרים עבור חלק מנקודות האינדקס בסדרה additional_items, וחיבור NaN לכל דבר אחר נותן NaN. לכן עלינו לציין את הפרמטר fill_value במהלך החיבור.

עם סדרות זמן, ניתן גם לדגום מחדש את הסדרה עם מרווחי זמן שונים. לדוגמה, נניח שאנו רוצים לחשב את ממוצע נפח המכירות חודשי. נוכל להשתמש בקוד הבא:

monthly = total_items.resample("1M").mean()
ax = monthly.plot(kind='bar')

ממוצעים חודשיים של סדרת זמן

DataFrame

DataFrame הוא למעשה אוסף של סדרות עם אותו אינדקס. נוכל לשלב כמה סדרות יחד ל-DataFrame:

a = pd.Series(range(1,10))
b = pd.Series(["I","like","to","play","games","and","will","not","change"],index=range(0,9))
df = pd.DataFrame([a,b])

זה ייצור טבלה אופקית כזו:

0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8 9
1 I like to use Python and Pandas very much

נוכל גם להשתמש בסדרות כעמודות, ולציין שמות עמודות באמצעות מילון:

df = pd.DataFrame({ 'A' : a, 'B' : b })

זה ייתן לנו טבלה כזו:

A B
0 1 I
1 2 like
2 3 to
3 4 use
4 5 Python
5 6 and
6 7 Pandas
7 8 very
8 9 much

הערה שנוכל גם לקבל את פריסת הטבלה הזו על ידי טרנספוזיציה של הטבלה הקודמת, למשל על ידי כתיבת

df = pd.DataFrame([a,b]).T..rename(columns={ 0 : 'A', 1 : 'B' })

כאן .T מציין את פעולת הטרנספוזיציה של ה-DataFrame, כלומר שינוי שורות ועמודות, ופעולת rename מאפשרת לנו לשנות את שמות העמודות כך שיתאימו לדוגמה הקודמת.

הנה כמה מהפעולות החשובות ביותר שנוכל לבצע על DataFrames:

בחירת עמודות. נוכל לבחור עמודות בודדות על ידי כתיבת df['A'] - פעולה זו מחזירה סדרה. נוכל גם לבחור תת-קבוצה של עמודות ל-DataFrame אחר על ידי כתיבת df[['B','A']] - זה מחזיר DataFrame נוסף.

סינון שורות מסוימות לפי קריטריונים. לדוגמה, כדי להשאיר רק שורות שבהן העמודה A גדולה מ-5, נוכל לכתוב df[df['A']>5].

הערה: הדרך שבה סינון עובד היא הבאה. הביטוי df['A']<5 מחזיר סדרת בוליאנים, שמציינת האם הביטוי True או False עבור כל אלמנט בסדרה המקורית df['A']. כשסדרת בוליאנים משמשת כאינדקס, היא מחזירה תת-קבוצה של שורות ב-DataFrame. לכן לא ניתן להשתמש בביטוי בוליאני כללי של פייתון, לדוגמה, כתיבת df[df['A']>5 and df['A']<7] תהיה שגויה. במקום זאת, עליך להשתמש בפעולת & מיוחדת על סדרות בוליאניות, ולכתוב df[(df['A']>5) & (df['A']<7)] (סוגריים חשובים כאן).

יצירת עמודות מחושבות חדשות. נוכל בקלות ליצור עמודות מחושבות חדשות עבור ה-DataFrame שלנו על ידי שימוש בביטוי אינטואיטיבי כמו זה:

df['DivA'] = df['A']-df['A'].mean() 

דוגמה זו מחשבת את הסטייה של A מערך הממוצע שלה. מה שקורה כאן בפועל הוא שאנו מחשבים סדרה, ואז משייכים סדרה זו לצד השמאלי, ויוצרים עמודה חדשה. לכן, לא נוכל להשתמש בפעולות שאינן תואמות לסדרות, לדוגמה, הקוד הבא שגוי:

# Wrong code -> df['ADescr'] = "Low" if df['A'] < 5 else "Hi"
df['LenB'] = len(df['B']) # <- Wrong result

הדוגמה האחרונה, למרות שהיא נכונה תחבירית, נותנת לנו תוצאה שגויה, מכיוון שהיא משייכת את אורך הסדרה B לכל הערכים בעמודה, ולא את אורך האלמנטים הבודדים כפי שהתכוונו.

אם אנו צריכים לחשב ביטויים מורכבים כאלה, נוכל להשתמש בפונקציית apply. הדוגמה האחרונה יכולה להיכתב כך:

df['LenB'] = df['B'].apply(lambda x : len(x))
# or 
df['LenB'] = df['B'].apply(len)

לאחר הפעולות לעיל, נקבל את ה-DataFrame הבא:

A B DivA LenB
0 1 I -4.0 1
1 2 like -3.0 4
2 3 to -2.0 2
3 4 use -1.0 3
4 5 Python 0.0 6
5 6 and 1.0 3
6 7 Pandas 2.0 6
7 8 very 3.0 4
8 9 much 4.0 4

בחירת שורות לפי מספרים ניתן לבצע באמצעות מבנה iloc. לדוגמה, כדי לבחור את 5 השורות הראשונות מה-DataFrame:

df.iloc[:5]

קיבוץ משמש לעיתים קרובות לקבלת תוצאה דומה ל-טבלאות ציר ב-Excel. נניח שאנו רוצים לחשב את הערך הממוצע של העמודה A עבור כל מספר נתון של LenB. אז נוכל לקבץ את ה-DataFrame שלנו לפי LenB, ולקרוא ל-mean:

df.groupby(by='LenB').mean()

אם אנו צריכים לחשב ממוצע ומספר אלמנטים בקבוצה, נוכל להשתמש בפונקציית aggregate מורכבת יותר:

df.groupby(by='LenB') \
 .aggregate({ 'DivA' : len, 'A' : lambda x: x.mean() }) \
 .rename(columns={ 'DivA' : 'Count', 'A' : 'Mean'})

זה נותן לנו את הטבלה הבאה:

LenB Count Mean
1 1 1.000000
2 1 3.000000
3 2 5.000000
4 3 6.333333
6 2 6.000000

קבלת נתונים

ראינו כמה קל לבנות Series ו-DataFrames מאובייקטים של פייתון. עם זאת, נתונים בדרך כלל מגיעים בצורה של קובץ טקסט או טבלת Excel. למרבה המזל, Pandas מציעה דרך פשוטה לטעון נתונים מהדיסק. לדוגמה, קריאת קובץ CSV פשוטה כמו זו:

df = pd.read_csv('file.csv')

נראה דוגמאות נוספות לטעינת נתונים, כולל הבאתם מאתרים חיצוניים, בסעיף "אתגר".

הדפסה ויצירת גרפים

מדען נתונים נדרש לעיתים קרובות לחקור את הנתונים, ולכן חשוב להיות מסוגלים להמחיש אותם. כאשר DataFrame גדול, פעמים רבות נרצה רק לוודא שאנו פועלים נכון על ידי הדפסת השורות הראשונות. ניתן לעשות זאת על ידי קריאה ל-df.head(). אם אתם מריצים זאת מתוך Jupyter Notebook, זה ידפיס את ה-DataFrame בצורה טבלאית ונוחה.

כמו כן, ראינו את השימוש בפונקציה plot להמחשת עמודות מסוימות. בעוד ש-plot שימושית מאוד למשימות רבות ותומכת בסוגי גרפים שונים באמצעות הפרמטר kind=, תמיד ניתן להשתמש בספריית matplotlib הגולמית כדי ליצור גרפים מורכבים יותר. נעסוק בהמחשת נתונים בפירוט בשיעורים נפרדים.

סקירה זו מכסה את המושגים החשובים ביותר של Pandas, אך הספרייה עשירה מאוד ואין גבול למה שניתן לעשות איתה! כעת ניישם את הידע הזה לפתרון בעיה ספציפית.

🚀 אתגר 1: ניתוח התפשטות הקורונה

הבעיה הראשונה שבה נתמקד היא מודלינג של התפשטות מגפת הקורונה. לשם כך, נשתמש בנתונים על מספר הנדבקים במדינות שונות, המסופקים על ידי המרכז להנדסת מערכות ומדע (CSSE) ב-אוניברסיטת ג'ונס הופקינס. מערך הנתונים זמין ב-מאגר GitHub זה.

מכיוון שאנו רוצים להדגים כיצד להתמודד עם נתונים, אנו מזמינים אתכם לפתוח את notebook-covidspread.ipynb ולקרוא אותו מההתחלה ועד הסוף. תוכלו גם להריץ תאים ולבצע אתגרים שהשארנו עבורכם בסוף.

התפשטות הקורונה

אם אינכם יודעים כיצד להריץ קוד ב-Jupyter Notebook, עיינו ב-מאמר זה.

עבודה עם נתונים לא מובנים

בעוד שנתונים מגיעים לעיתים קרובות בצורה טבלאית, במקרים מסוימים נצטרך להתמודד עם נתונים פחות מובנים, כמו טקסט או תמונות. במקרה כזה, כדי ליישם טכניקות עיבוד נתונים שראינו קודם, נצטרך לחלץ נתונים מובנים. הנה כמה דוגמאות:

  • חילוץ מילות מפתח מטקסט ובדיקת תדירות הופעתן
  • שימוש ברשתות עצביות לחילוץ מידע על אובייקטים בתמונה
  • קבלת מידע על רגשות של אנשים מזרם וידאו

🚀 אתגר 2: ניתוח מאמרים על הקורונה

באתגר זה נמשיך בנושא מגפת הקורונה, ונתמקד בעיבוד מאמרים מדעיים בנושא. קיים מאגר CORD-19 עם יותר מ-7000 (בזמן הכתיבה) מאמרים על הקורונה, הזמינים עם מטא-נתונים ותקצירים (ובכמחציתם גם טקסט מלא).

דוגמה מלאה לניתוח מערך נתונים זה באמצעות Text Analytics for Health מתוארת בפוסט זה. נדון בגרסה פשוטה יותר של ניתוח זה.

NOTE: איננו מספקים עותק של מערך הנתונים כחלק ממאגר זה. ייתכן שתצטרכו להוריד תחילה את הקובץ metadata.csv ממערך נתונים זה ב-Kaggle. ייתכן שתידרש הרשמה ל-Kaggle. ניתן גם להוריד את מערך הנתונים ללא הרשמה מכאן, אך הוא יכלול את כל הטקסטים המלאים בנוסף לקובץ המטא-נתונים.

פתחו את notebook-papers.ipynb וקראו אותו מההתחלה ועד הסוף. תוכלו גם להריץ תאים ולבצע אתגרים שהשארנו עבורכם בסוף.

טיפול רפואי בקורונה

עיבוד נתוני תמונה

לאחרונה פותחו מודלים חזקים מאוד של בינה מלאכותית המאפשרים להבין תמונות. ישנם משימות רבות שניתן לפתור באמצעות רשתות עצביות מאומנות מראש או שירותי ענן. דוגמאות כוללות:

  • סיווג תמונות, שיכול לעזור לכם לקטלג תמונה לאחת מהקטגוריות המוגדרות מראש. ניתן לאמן מסווגי תמונות מותאמים אישית באמצעות שירותים כמו Custom Vision
  • זיהוי אובייקטים כדי לזהות אובייקטים שונים בתמונה. שירותים כמו computer vision יכולים לזהות מספר אובייקטים נפוצים, וניתן לאמן מודל Custom Vision לזיהוי אובייקטים ספציפיים.
  • זיהוי פנים, כולל גיל, מגדר וזיהוי רגשות. ניתן לעשות זאת באמצעות Face API.

כל שירותי הענן הללו ניתנים לקריאה באמצעות Python SDKs, ולכן ניתן לשלבם בקלות בתהליך חקר הנתונים שלכם.

הנה כמה דוגמאות לחקר נתונים ממקורות תמונה:

סיכום

בין אם יש לכם נתונים מובנים או לא מובנים, באמצעות פייתון תוכלו לבצע את כל השלבים הקשורים לעיבוד והבנת נתונים. זו כנראה הדרך הגמישה ביותר לעיבוד נתונים, ולכן רוב מדעני הנתונים משתמשים בפייתון ככלי העיקרי שלהם. לימוד מעמיק של פייתון הוא כנראה רעיון טוב אם אתם רציניים במסע שלכם במדעי הנתונים!

שאלון לאחר ההרצאה

סקירה ולמידה עצמית

ספרים

משאבים מקוונים

לימוד פייתון

משימה

בצעו חקר נתונים מפורט יותר עבור האתגרים לעיל

קרדיטים

שיעור זה נכתב באהבה על ידי Dmitry Soshnikov


כתב ויתור:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית Co-op Translator. למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי-דיוקים. המסמך המקורי בשפתו המקורית נחשב למקור הסמכותי. למידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי בני אדם. איננו נושאים באחריות לכל אי-הבנה או פרשנות שגויה הנובעת משימוש בתרגום זה.