วันอังคารที่ 23 มกราคม พ.ศ. 2561

คำณวน GPA ด้วย Pandas

จากไฟล์ csv ที่เก็บข้อมูลผลการเรียน


    สามารถคำณวนเกรดโดยใช้ Library Pandas ซึ่งเป็นเครื่องมือที่ใช้จัดการข้อมูลเข้ามาช่วยได้ดังนี้



    เรียกใช้ Pandas บน Python


    เปิดไฟล์ csv ที่เก็บเกรดไว้ด้วย Pandas โดยตัว Pandas จะโหลดข้อมูลมาเก็บไว้เป็นตารางโดยเมื่อนำ self.score_data มาใส่ฟังก์ชั่น print() จะได้ตารางดังนี้

 

    เห็นได้ว่าตารางที่แสดงจะมี keys เป็นตัวเลขที่เริ่มจาก 0 และนับเพิ่มขึ้นเรื่อยๆ   


    เลือก column ที่จะมาแสดงให้มีแค่ semester และ credit แล้ว sum กันโดยมอง column semester เป็นหลัก โดยผลการ sum จะเป็นจำนวณ credit ทั้งหมดในแต่ละเทอมซึ่งมีหน้าตาดังนี้

    
    จากตารางที่ print() จะเห็นได้ว่า keys จากตัวเลขจะกลายเป็น semester แล้ว และพบว่ามีการรวม credit ในแต่ละ semester ได้ถูกต้อง



    จากนั้นเก็บเทอมต่างๆ จาก column semester แต่จะเจอปัญหาคือ เกิดการ sort ที่ไม่ถูกต้องตามลำดับเทอม



    การกำหนด key ในการ sort มีการใช้ lambda ซึ่งเป็นฟังก์ชั่นที่ไม่แสดงตัวและจะรีเทิร์นค่า x ออกมาซึ่งในฟังก์ชั่นนี้ได้มีการนำ string ที่เป็น เทอมมาแบ่งโดยตัว '_' เช่น เทอม '1_58' จะได้เป็น List 
['1', '58'] และกำหนดให้ sort จากเลขปี เป็นหลัก    

    เมื่อ sort โดยกำหนด key ในการ sort เองจะเห็นได้ว่า เทอมแต่ละเทอมเรียงกันได้อย่างถูกต้องแล้ว


    จากนั้นจึงคำนวณ GPAX หรือ เกรดเฉลี่ยต่อเทอมโดยการนำ list ที่เก็บเทอมที่ sort ไว้แล้วมาไล่แสดงผล โดยจะมีการกรอง record ให้เหลือแค่เทอม เทอมเดียมโดยใช้ 
data_field[data_field['semester'] == semester] 
จากนั้นเก็บผลที่ได้ไว้ใน df_temp แล้วจึงนำ column credit และ grade_number มาคูณกันแล้ว sum จากกันหารด้วย ผล sum ของ credit จะได้เกรดเฉลี่ยในเทอมนั้นออกมาตามสูตร

GPAX = Σ (grade x credit) / Σ (credit)

    จากนั้นจึงนำมาแสดงผล โดยเกรดที่ได้จะเป็นทศนิยม 2 ตำแหน่งแบบปัดเลขทิ้ง


    และใช้วิธีแบบเดียวกันในการคิด GPA หรือเกรดเฉลี่ยรวมทั้งหมด แต่จะไม่มีการกรองด้วยเทอมซึ่งสามารถทำได้ดังนี้


   จะได้หน้าตา report ทั้งหมดดังนี้


link ที่เกี่ยวข้อง
  - Pandas
  - code

ปัญหาที่พบ
  - Pandas ไม่มีคำสั่ง weighted sum แก้โดยนำ column credit และ grade ของแต่ละวิชามาคูณกัน จากนั้นนำผลคูณทั้งหมดมาบวกกัน แล้วหารด้วย ผล sum credit ทั้งหมด
  - มีการ sort semester มาให้แต่ผิดลำดับเวลา แก้ไขโดย การ sort แบบกำหนด keys ให้
  - หลังจาก sum ข้อมูลโดย group by semester แล้ว ไม่สามารถเพิ่มแถว GPAX ได้โดยตรรง แก้ไขโดยการนำค่าในตารางมาคำณวน GPAX แยกตาหาก

สิ่งที่ได้เรียนรู้
  วิธีการใช้ pandas เบื้องต้น




วันจันทร์ที่ 15 มกราคม พ.ศ. 2561

Calculate GPAX with Google spreadsheet


    ในตอนแรกได้มีการเข้าไปยัง http://klogic.kmutnb.ac.th เพื่อดูข้อมูลเกี่ยวกับวิชาที่ลง หนวยกิตที่ได้ เกรดที่ได้ ซึ่งมีหน้าตาดังนี้


    นำข้อมูลใน http://klogic.kmutnb.ac.th ไปใส่ไว้ใน Google spreadsheet โดยจะมีคอลัมน์ รหัสวิชา
ชื่อวิชา หน่วยกิต ตอนเรียน เกรดที่ได้ และ เกรดที่ได้(ตัวเลข)


    ในการคำนวนเกรดเฉลี่ยต่อเทอม(GPA) สามารถทำได้โดยการนำหน่วยกิตคูณกับเกรดที่ได้ ในแต่ละวิชารวมกันในเทอมนั้นๆ แล้วหารด้วยหน่วยกิตในเทอมนั้น

เกรดเฉลี่ยต่อเทอม =  ((หน่วยกิตวิชาแรก x คะแนนที่ได้จากวิชาแรก) + (หน่วยกิตวิชาที่สอง x คะแนนที่ได้จากวิชาที่สอง) + ... + (หน่วยกิตวิชาสุดท้ายของเทอม x คะแนนที่ได้จากวิชาสุดท้ายของเทอม))  / (หน่วยกิตทั้งหมดของเทอมนี้)

    ซึ่งเขียนเป็นสูตรสำหรับการหา GPA ในเทอมแรกบน Spreadsheet ได้ดังนี้


    ในฟังก์ชั่น SUMPRODUCT โดยปกติจะมีการใช้ argument 2 ตัว ซึ่งเป็นช่วงของ cell ที่ต้องการจะให้งานโดยมีความยาวของช่วงทั้ง 2 เท่ากัน ซึ่งในตัวอย่างการใช้ SUMPRODUCT จะมีการคำณวนดังนี้

 SUMPRODUCT = (C2 x F2) + (C3 x F3) + ... + (C9 x F9) 


    ส่วนฟังก์ชั่น SUM จะเป็นการเอาค่าตัวเลขที่อยู่ใน Cell ที่ป้อนไปใน Argument มารวมกันโดย Argument ที่ป้อนเข้าไปอาจเป็นชื่อ cell หลายๆ argument หรือเป็นช่วงของ cell แค่ Argument หรือจะใช้ชื่อ cell รวมกับช่วงของ cell ก็ได้ การใช้ SUM ในตัวอย่าง จะเกิดการคำณวนดังนี้

 SUM = C2 + C3 + ... + C9 


    เมื่อนำสูตรไปปรับใช้กับเกรดทุกเทอมจะได้ตารางหน้าตาดังนี้


    ในการคิดเกรดเฉลี่ยร่วม(GPAX) ทำได้เหมือนกับการคิดเกรดเฉลี่ยประจำภาค(GPA) โดยปรับแค่ช่วงของข้อมูลจากวิชาใน 1 เทอมเป็นวิชาทั้งหมด โดยจะได้สูตรดังนี้


    จะได้ผลดังนี้

   
    และหากต้องการหาเปอร์เซนต์ของเกรดที่ได้ว่ามี A B+ B C+ ... อย่างละกี่เปอร์เซ็นหาได้โดยการนับจำนวนเกรดที่ได้แต่ละอย่างแล้วนำไปวาดแผนภูมิวงกลมโดยในการนับเกรดจะใช้ฟังก์ชั่น COUNTIF เข้ามาช่วย โดยฟังก์ชั่นนี้จะรับ Argument 2 ตัวซึ่งตัวแรกจะเป็นช่วงของ cell ที่สนใจและ argument ที่ 2 จะเป็นเงื่อนไขในการพิจารณาว่าจะนับ cell ไหนบ้างในกรณีข้อมูลใน cell เป็น string Argument ที่ 2 จะทำหน้าที่เป็นตัวเทียบว่า จะนับ cell ไหนในช่วงที่กำหนดมาบ้าง สมมุติให้ Argument ที่ 2 เป็น "A" จะมีการนับแค่ cell ที่มีข้อมูลเป็น "A" เท่านั้น แต่ถ้าเป็น "A*" จะหมายถึงให้นับ cell ที่มีข้อมูลเริ่มต้นเป็น A
    ในกรณีที่ ข้อมูลใน cell เป็นตัวเลข Argument ตัวที่ 2 สามารถเป็นเงื่อนไขได้เช่น >25 จะเป็นการนับเฉพาะ cell ที่มีข้อมูลเป็นตัวเลขที่มากกว่า 25 เท่านั้น

    ในที่นี้ได้มีการใช้สูตร COUNTIF สำหรับนับว่าได้เกรด A ทั้งหมดกี่ตัวดังนี้


    และเมื่อนำมาปรับใช้กับเกรดทุกเกรดแล้วจะได้ตารางดังนี้



    และเมื่อนำข้อมูลในตารางมาสร้างแผนภูมิวงกลมจะได้ดังนี้



สิ่งที่ได้เรียนรู้
  - ได้รู้จักกับสูตรคำนวณต่างๆในการใช้งาน Google spreadsheet
  - ได้รู้วิธีการคำณวน GPA และ GPAX

ปัญหาที่พบ
  - ฟังก์ชั่น SUMPRODUCT เกิดการ error แก้ไขได้โดยปรับ ช่วงของ cell ของทั้ง 2 Argument ให้มีขนาดเท่ากัน
  - คะแนนที่แสดงใน http://klogic.kmutnb.ac.th เป็นตัวอักษร A B+ B C+ ... ทำให้ไม่สามารถนำมาคิดเกรดเฉลี่ยได้ แก้ไขได้โดยการ copy เกรดออกมาเป็น column อีกอันหนึ่งแล้วใช้เครื่องมือ replace with ของ google spreadsheet เปลี่ยนให้ A เป็น 4 B+ เป็น 3.5 B เป็น 3 และ อื่นๆ

ลิ้งค์ที่เกี่ยวข้อง