fbpx

01. מבוא והצגת נתונים

הקדמה

האנליסטים (מנתחי נתונים) מתעסקים בנתונים, פחות אלגוריתמיקה ויותר שאילתות. פחות בניית מערכות, יותר הסקת מסקנות.

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

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

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

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

מבוא לפנדס – Pandas

היי סטודנטים, ברוכים הבאים למדריך ה-Pandas של לוגיקוד.

במדריך זה תכירו את הכלי Pandas, (להלן פנדס) המאוד נפוץ ושימושי בעולם התכנות פייתון בכללי ובמדעי הנתונים בפרט.

“pandas is an open source, providing high-performance, easy-to-use data structures and data analysis tools for the Python programming language.” (official doc)

בתרגום חופשי: פנדס היא ספריית קוד פתוח לניתוח נתונים.

נשים לב שלא להתבלבל בין Panda לבין Pandas. הספריה Panda שונה לחלוטין, היא בעולם קידוד הווידאו ולא נדבר עליה כלל.

הפנדס שלנו מתעסקת כאמור בעולם ניתוח הנתונים והטבלאות.

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

המרכיב הבסיסי של “עמודות ושורות” שיש בתוכנת אקסל, הוא גם מרכיב בסיסי בפנדס.

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

לאחר שהתקנו את פנדס (למשל על ידי pip או דרך pycharm) נעשה ייבוא:

				
					import pandas
				
			

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

				
					import pandas as pd
				
			

שני טיפוסי הנתונים הבסיסיים בפנדס הם הטיפוס DataFrame, בו נחזיק מידע של טבלה (גם שורות וגם עמודות), והטיפוס Series המתאים להחזיק מידע בעל מימד אחד, שזה כמו רשימה/מערך. או בעולם הטבלאות: עמודה בודדת, או שורה אחת.

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

למשל, נניח שיש לנו רשימת אנשים ורשימת משכורות, נוכל להפוך את הרשימות ל-Series, ואז ליצור DataFrame באופן הבא:

				
					name = ['Ori', 'David', 'Moshe', 'Josef']
salary = [4500, 4000, 5200, 8000]

s1 = pd.Series(name)
s2 = pd.Series(salary)

dic = {'Name': s1, 'Salary': s2}
df = pd.DataFrame(dic)
				
			

אם נדפיס את df (שזה קיצור ל-DataFrame), הפלט יהיה:

אם נשים לב, פנדס מייצר אינדקסים לכל שורה בטבלה.

 

פורמט CSV

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

אני מנחש שאתם מכירים כבר את הפורמט CSV, אבל רק ליתר ביטחון אתאר אותו בקצרה.

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


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

לשם כך יש לנו קובץ אקסל עם הטבלה הזו:

את קובץ האקסל נוכל להמיר לקובץ בפורמט CSV ע”י שמירה בפורמט ספציפי מתוך תוכנת האקסל, 

או בגליונות אקסל של גוגל: קובץ -> הורדה -> CSV:

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

שם הפורמט הוא CSV שזה קיצור של Comma Separated Values. – ערכים המופרדים ע”י פסיק. 

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

אני ממליץ לטובת הלמידה, שתיצרו לכם קובץ CSV משלכם, או עם נתונים שאתם תזינו או קובץ של נתונים כלשהם שאפשר למצוא ברשת (לדוגמה באתר kaggle).

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

 

טעינת CSV

את טבלת ה-CSV, פנדס מסוגל לקרוא בקלות, וזה נעשה ע”י הפקודה:

				
					df = pd.read_csv(cars_path)
				
			

נסו להדפיס את הטבלה. 

אתם מצליחים לראות את הנתונים? נהדר. נמשיך.

פנדס מאפשרת לנו לבצע אוסף פעולות נרחב מאוד לניתוח המידע. 

נתחיל עם הדברים הפשוטים.

 

גישה לנתונים

אם נרצה לקבל רק את n השורות הראשונות בטבלה, או האחרונות, נבצע:

				
					n = 5
top_n_lines = df.head(n)
last_n_lines = df.tail(n)
				
			

לקבלת רשימת העמודות הקיימות בטבלה, נבצע:

				
					df.columns
				
			

אך שימו לב, פורמט זה איננו לא list של פייתון וגם לא Series של פנדס, אך נוכל להמיר לאיזה פורמט שנרצה:

				
					list(df.columns)
# or
df.columns.to_list()
				
			

האובייקט df במידה מסוימת דומה למילון, בכך שנוכל לקבל את העמודות שבטבלה ע”י ציון שמם באופן הבא:

				
					df['Year']
				
			

פעולה זו תחזיר לנו אובייקט מסוג Series שמכיל את העמודה בשם Year שבטבלה המוחזקת ב-df.

נשים לב, שישנה דרך נוספת לפנות לקבלת העמודה באופן הבא:

				
					df.Year
				
			

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

 

אם נרצה לקבל מספר עמודות (ספציפיות), הפלט כבר לא יהיה אובייקט Series אלא אובייקט DataFrame, בעצם נקבל “תת טבלה”. 

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

				
					df[ ['Year', 'Model'] ]
				
			

פקודה זו תיצור “תת טבלה” מהטבלה המקורית, ובטבלה החדשה יופיעו רק העמודות שציינו.

לקבלת מידע על כמות האובייקטים, נשתמש בפקודה size. למשל:

				
					df.columns.size     # מספר העמודות
df['Model'].size    # מספר השורות
df.size             # מספר המשבצות
				
			

מה המספרים שיצאו לכם?

תבדקו שזה אכן תואם למה שצריך להיות! נסו גם להריץ df.shape

 

שאילתות טווח

בדומה ליכולת הפייתונית לקבלת ערכים מסוימים מתוך רשימה, למשל:

				
					lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
lst[3:5]  #  ->  3, 4
				
			

אנו יכולים גם בפנדס לבקש לקבל שורות ספציפיות. 

למשל (על טבלת המכוניות):

				
					df[10:13]
				
			

פקודה זו תביא לנו את השורות 10, 11 ו-12. (מהמספר השמאלי, ועד המספר הימני, לא כולל הימני):

נשים לב שהאינדקסים המקוריים שפנדס יצר, מופיעים לנו בתת הטבלה שנוצרה ע”י הטווח שציינו.

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

				
					df[10:13]['Model']  
#  or 
df[10:13].Model
# or
df[10:13][ ['Model', 'ID'] ]  # for two columns
				
			

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

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

				
					df.iloc[2:5]        # lines 2,3,4 with all columns
df.iloc[2:5 , 4]    # lines 2, 3, 4 with only column number 4.
				
			

תרגיל:

  1. ללא שימוש ב-iloc:
    • כתבו פקודה המחזירה את 2 השורות האחרונות שבטבלה.
    • כתבו את אותה פקודה, אך הפעם נרצה לקבל רק את עמודת ה-Year שבטבלה.
    • כתבו את אותה הפקודה, הפעם נרצה לקבל גם את עמודת Year וגם את עמודת ה-Model.
  2. בצעו את כל הנ”ל באמצעות שימוש בפונקצית iloc. כשהפעם נרצה את שורות מספר 4,5,6,7

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

פתרון:

				
					df[-2:]     # or df.tail(2)
df[-2:]['Year']
df[-2:][['Year', 'Model']]
df.iloc[4:8]
df.iloc[4:8, 2]
df.iloc[4:8, 1:3]
				
			

כניסה

שכחתי סיסמה

אין לך חשבון? להצטרפות

איפוס סיסמה:

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

ברכות! סיימתם את השיעור הראשון בקורס!

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

שינוי סיסמה

עריכת פרטים אישיים