ใช้ Python ดึงข้อมูล API ของ Corona-virus (COVID-19)

Sasiwut Chaiyadecha
1 min readMar 25, 2020

--

ทำอะไรอัพเดตตามสถานการณ์โลกซะหน่อย

ดึงข้อมูล API ของ Corona-virus (COVID-19)

ตอนนี้พวกเราทุกคนอยู่ในสภาวะที่ไม่ค่อยดีนัก เนื่องจากไวรัสมันแพร่ระบาดแบบไม่เห็นวี่แววว่าจะควบคุมได้ หลาย ๆ บริษัทก็ประกาศ wfh (work from home) เป็นที่เรียบร้อย

จริง ๆ การดึงข้อมูลอะไรเนี่ย ตอนนี้มีหลายเว็บหลายบริการมาก ๆ ที่ให้ข้อมูลเกี่ยวกับ Corona-virus ซึ่งทำออกมาดี ๆ สวย ๆ ทั้งนั้นเลย แต่ว่าอันนั้นไม่ใช่ประเด็น ประเด็นคือเราอยากเขียนเอง จะได้เอาไปทำอะไรต่อตามแบบของเราด้วย

ตอนนี้มีบริการ API หลากหลายเจ้ามาก ๆ Code ครั้งนี้เลือกบริการของ https://corona.lmao.ninja/historical ที่ให้ API แบบเป็นข้อมูลย้อนหลังมาด้วย เผื่อว่าจะเอาไปทำอะไรต่อนั่นเอง

พูดเยอะแล้ว เริ่ม Code เลยดีกว่า ตอนนี้จะพยายามอธิบายไปทีละ Step ละกันนะ

Code

เริ่มแรกก็ง่าย ๆ ไม่มีอะไรมาก ใช้ตัว requests เพื่อเป็นการดึงข้อมูลจาก Link API ที่บอกไว้ข้างบน แล้วก็เปลี่ยนไฟล์ที่ได้รับมาให้เป็น .json ซะเลย

พอได้ไฟล์ที่เป็น .json มาแล้ว ส่วนตัวไม่ถนัดไฟล์นี้เลย ชอบตรงที่มันใช้เก็บข้อมูลได้ดีมาก แต่พอเอามาทำอะไรต่อ สำหรับเราแล้วมันยาก (อาจจะเพราะยังไม่เก่งพอก็ได้ แง) ดังนั้นเราต้องมาแปลงเป็น Format ที่เราคุ้นเคยอย่าง DataFrame ซะก่อน

ตัว API ที่เลือกใช้ในครั้งนี้ มันส่งข้อมูลกลับมาเป็น Dictionary ซ่อนใน Dictionary อีกทีนึง ซึ่งพอทำเป็น DataFrame รอบแรกแล้ว ใน DataFrame จะเก็บในรูปแบบของ Dictionary ดังนั้นเลยต้องใช้ json_normalize() เพื่อทำให้มันเป็น DataFrame อีกที แล้วค่อยจัดใหม่

คราวนี้มันเป็นสไตล์ที่ถนัดละกัน ส่วนตัวแล้วชอบทำ Table เป็นแนวตั้ง เลยเลือกใช้ stack() เพื่อต่อข้อมูลลงมาเรื่อย ๆ ตามแนวตั้ง

แต่ว่าคราวนี้ตัว Index ที่ให้ค่าออกมา มันเป็น string.date ตัวอย่างเช่น cases.22/02/2020 แบบนี้เอาไปทำต่อยาก เลยต้องแยก มันออกเป็น 2 columns ก่อน เราจะได้จำนวนเคสทั้งหมด และ Date ของวันนั้น ๆ วิธีการแยกก็ไม่ยากครับ ให้มัน .split() โดยใช้ . เป็นตัวแยก จากนั้นก็ตั้งชื่อ columns ทั้ง 2 ใหม่

ข้อมูลที่ได้จาก API มันเป็น object แบบ string ซึ่งมันเอาไปทำอะไรต่อไม่ได้ เช่น การบวกลบคูณหาร ดังนั้นก็แปลงให้มันรูปแบบข้อมูลที่ควรจะเป็นได้เลย Date ก็ใช้ pandas.to_datetime() ส่วนจำนวนเคสติดเชื้อต่าง ๆ ก็ใช้ pandas.to_numeric()

ทีนี้เนี่ย ข้อมูลที่ API แจกมา บางประเทศมันมี State มีจังหวัด มีเขตด้วย เช่น USA หรือ Australia แต่ประเทศอื่น ๆ ส่วนมากแล้วให้ข้อมูลมาเป็นระดับประเทศ ดังนั้นเพื่อการนำไปวิเคราะห์ต่อ เลยจะ .sum() ตัวเลขทั้งหมดเป็นระดับประเทศเลยละกัน

ทีนี้เนี่ยข้อมูลมันมีหลายแบบเช่น จำนวนเคสติดเชื้อทั้งหมด (cases) จำนวนที่เสียชีวิต (deaths) จำนวนที่หายจากโรค (recovered) เลยอยากได้ Table แสดงผลพวกนี้ด้วย เลยเลือกใช้ pandas.pivot_table ซะเลย เพราะจะได้ใช้ aggfunc = np.sum ไปทีเดียเลย จากนั้นก็จัด Table ให้ Report ง่าย ๆ นิดหน่อย ก็เป็นอันเสร็จ

ตอนนี้เอาแค่ดึงข้อมูลกับจัด Table ก่อนละกัน เดี่ยว Calculation ค่อยตามมา

Stay Safe กันนะครับ

--

--