Search
  • Hackend

Tips to handle your data with pandas - python

Updated: Apr 26, 2019

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

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


שלב 1 : אסיפת המידע

שלב 2 : אימון מודל על בסיס המידע

שלב 3 : בדיקת המודל על ידי סימולציות של חיזויים והשוואות לתוצאות הסימולציות

שלב 4 : אספקת מודל חיזוי המבוסס על אחוזי דיוק מסויימים (לרוב נרצה מעל 90% הצלחה בחיזוי)


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

המבנה של המאמר הוא בתצורה של אוסף הבעיות הקטנות (והפתרונות להם) הכרוחות ביצירת סט-מידע

הבעיה : אנו זקוקים להמון מידע

הדרך הנכונה להחזיק המון מידע לצורכי למידת מכונה הוא או באמצעות בסיסי נתונים, או באמצעות קבצי csv. בשלב זה, אני מעוניין שנסתכל על אתר kaggle . מדובר באתר שימושי מאוד בכל תחום ה-data-science.



לצורך המדריך נצטרך להוריד משם data-set של ניתוח שינה, כנסו ללינק

המידע יורד כקובץ zip, יש לחלץ את הקובץ לתקייה, בסוף התהליך אמור להיות לכם קובץ בשם sleepingdata.csv.


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



עכשיו שיש לנו את המידע שלנו, בואו נתחיל לכתוב קוד !


הבעיה : כיצד באמצעות קוד נטען קבצי csv לתוכנית שלנו

הפתרון הוא דיי פשוט, ראשית כל נתקין את ספריית העזר שתיתן לנו את הפונקציות הדרושות

שלב א : התקנת ספרייה pandas :

היכנסו ל-terminal של pycharm והריצו שם את הפקודה : pip install pandas


שלב ב : ייבוא pandas

וודאו שעשינו import לספריית pandas על מנ שנוכל להשתמש בה



שלב ג : טעינת המידע לתוכנית

טענו את הקובץ למשתנה בשם raw_data. שימו לב שעל מנת לטעון קבצים יש לתת את הנתיב המלא שלהם לפונקציית קריאת ה-csv.

שימו לב #2 במקרה זה, אנו צריכים להוסיף עוד דגל בקריאה לפונקציה זהו דגל sep, המשמעות שלנו מגיע ממילה seprator באנגלית שמשמעותה ״הפרדה״, בעצם זהו התו לפיו הפונקציה יודעת להפריד תאי מידע.


שלב ד : הבנת סוגי הערכים

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


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

אנחנו רואים שיש לנו לא מעט מידע :

1. התחלה

2. סוף

3. איכות שינה

4. זמן במיטה

5. זמן wakeup

6. פתקים לפני השינה

7. קצב לב

8. מד צעדים


שלב א : הבנת המידע

לפני שאנחנו צוללים נרצה לראות האם המידע שלנו שלם, כלומר, נרצה לדעת האם לכל דגימת שינה יש את כל 8 הפרמטרים.

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

בכדי לראות את גודל המידע נשתמש ב


raw_data.shape

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

raw_data.notnull().sum()




ניתן לראות שיש כ-3 תאים מסך כל 8 התאים האפשריים שלא שלמים תמיד , הרי אלו פתקים מהשינה, עמודת ה-wake-up, וקצב הלב.

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


בעיית התיוג :

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

מצוי : בעולם האמיתי, מידע הוא לא רק מספרים, לדוגמה עמודת הwake-up היא עמודה המכילה סמיילי שמח - :) במידה והבן אדם קם שמח, וסמיילי מבואס - :| במידה והבן אדם קם מבואס, וערך Nan במידה והבן אדם לא הזין מידע.

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

או שאני שמח

או שאני מבואס,

או שלא הזנתי לכם מה אני מרגיש עכשיו,

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

הכל קורה בארבע שורות קוד פשוטות להפליא :



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

עתה, ננסה לטפל ב-sleep notes, הדפסה מהירה שלהם תראה לנו שהם מבולגנים מאוד, באותה תא מידע יש לנו אינדיקציה האם הבן אדם שתה קפה, שתה תה, היה לו יום לחוץ, התאמן וכו, באמצעות הפקודה unique נוכל לראות את קבוצת הערכים הקיימים בעמודה :


אותנו יעניין לייצר עמודות חדשות בהתאם לnote-ים הללו :

1. האם שתית קפה (1 אם שתית 0 אם לא)

2. האם התאמנת (1 אם שתית 0 אם לא)

3. האם שתית תה (1 אם שתית 0 אם לא)

4. האם זה היה יום מתיש (1 אם שתית 0 אם לא)

5. האם אכלת בשעה מאוחרת (1 אם שתית 0 אם לא)


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


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



שימו לב מה קורה בשורה 11 :

יש בספריית pandas יכולת להפעיל פונקציה על כל אחד מהשורות בסט המידע שלנו באמצעות apply. הפונקציה היא מסוג ביטוי lambda, בצורה פשטנית זו פונקציה פשוטה שמקבלת שורה (שורה הכוונה ל-8 הערכים שאנו מודדים בכל דגימה), מתוך הדגימה אנו מחלצים את ה-sleep notes, לאחר מכן אנחנו ממירים את המידע שחילצנו לאוביקט מסוג str, המוטיבציה להמרה היא בכדי שנוכל לבצע על האוביקט את פונקציית ה-find שעובדת רק על אוביקטים מסוג string. לאחר מכן אנחנו בודקים עם ערך ההחזרה של ה-find גדול ממינוס 1. במידה וכן זה אומר שרצף המילים "Drank coffee" כן נמצא בתוך התא שאנו מנסים לקרוא.

שימו לב שכל הביטוי הזה נעטף ב int על מנת שנוכל לעבוד עם מספרים (0 או 1) ולא ערכים בוליאניים (True או False).

בנוסף, שימו לב שאנחנו שמים עוד דגל בפונקצית ה-apply בשם axis=1, אנו שמים את הדגל הזה על מנת לדאוג לתאימות במימדים של סט המידע שלנו.


נעשה זאת עתה ליתר הערכים האחרים :

1. האם התאמנת (1 אם שתית 0 אם לא)

2. האם שתית תה (1 אם שתית 0 אם לא)

3. האם זה היה יום מתיש (1 אם שתית 0 אם לא)

4. האם אכלת בשעה מאוחרת (1 אם שתית 0 אם לא)


לא נרצה לשמור מידע מיותר :


מיצינו את כל המידע מעמודת ה-sleeping notes לכן אנו יכולים להיפטר ממנה על ידי drop :

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

1. למצות את מד הצעדים הידוע בכינויו : "Activity steps"

2. להמיר את הזמן שישנו לערכים חוקיים 8:30 - > 8.5

3.להבין מה עושים עם קצב הלב (הרי המידע שם לא מלא)

4. להוריד את עמודות הend ו-start (משום שהזמן בשינה מגלם אותן ברמה שאנו צריכים)


אם כן, נתחיל מהמשימות הקלות קודם כל :

להוריד את עמודות הstart ו-end,

נעשה זאת בדומה למה שעשינו עם sleep notes :




סיימנו עם המשימה הראשונה, נרצה להמיר את ערכי time in bed :

רצוי : אם ישנתי 8 וחצי שעות אני ארצה שהזמן יהיה 8.5

מצוי : אם ישנתי 8 וחצי שעות כתוב שישנתי 8:30 .

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


ישנם שני אתגרים, הראשון הוא להמיר מחרוזת לאובייקט זמן, והשני הוא לחלץ מאובייקט הזמן את ההמרה הנכונה.

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



מה עושים עם ערכים ריקים ?


סיימנו 2 מתוך ארבעת האתגרים שהצבנו לעצמנו :

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

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


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


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



נרצה עתה לסדר מחדש את הקוד, בסך הכל נקבל :



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

78 views
ABOUT
SOCIAL

office@hackend.com

Tel:

054-345-5954

052-575-7077

054-261-3395

  • White LinkedIn Icon
  • White Facebook Icon

© 2018 by Hackend. Proudly created with Wix.com