เข้าถึงข้อมูลสถิติของ BOT ด้วย API พร้อมกับใช้ Python ดึงมาใช้งาน
Bank of Thailand (BOT) เป็น Source data ที่ดีสำหรับการหาข้อมูลสถิติต่าง ๆ ซึ่งเก็บย้อนหลังไว้ยาวนานพอสมควร นอกจากนี้ยังมีการอัพเดตอยู่เป็นประจำ ซึ่งทุกคนสามารถเข้าถึงข้อมูลเหล่านี้ได้ฟรีผ่านหน้าเว็บ BOT ได้
เมื่อหาตัวแปรที่ต้องการใช้งานเจอแล้ว สามารถดาวน์โหลดไฟล์เพื่อนำไปใช้พัฒนาโมเดลหรืออ้างอิงใด ๆ ต่อได้ แต่ถ้าต้องใช้ข้อมูลที่เยอะขึ้น ช่วงเวลาที่นานขึ้น การเลือกตัวแปรจากหน้าเว็บอาจไม่ใช่ที่เหมาะสมมากนัก เพราะหน้าเว็บไม่ได้ถูกออกมาแบบมาให้ใช้งานในลักษณะนั้น
เรื่องนี้ขอยกเป็น Case study ที่เกิดขึ้นจากการทำงาน เนื่องจากโมเดลมาตรฐานบัญชีใหม่หรือ IFRS 9 มีการใช้ข้อมูลเกี่ยวกับ Macroeconomics เป็นจำนวนมาก ซึ่งแน่นอนว่าเจอปัญหาทั้งการโหลดข้อมูล ความผิดพลาดที่เกิดจากการทำ Manual ไฟล์ รวมไปถึงความไม่สะดวกในการอัพเดตข้อมูล เมื่อเวลาเปลี่ยนไป
BOT API
บริการ API จากแบงค์ชาติที่เผยแพร่ข้อมูลต่าง ๆ ผ่านช่องทาง API เพียงแค่เชื่อมต่อเข้าระบบฐานข้อมูลที่แบงค์ชาติจัดเตรียมไว้ ก็สามารถเข้าถึงบริการต่าง ๆ ได้อย่างอัตโนมัติ ซึ่งวันนี้จะใช้ Python ในการเข้าถึงบริการนี้
เริ่มต้นด้วยการสมัครบริการ API ของแบงค์ชาติก่อน ซึ่งมีหลากหลาย Packages ให้เลือกใช้งาน ทั้งแบบฟรีและเสียค่าบริการ ซึ่งถ้าไม่ได้ต้อง Request API อยู่เรื่อย ๆ แบบฟรีก็สามารถใช้งานได้ดีแล้ว วิธีการสมัครต้องเริ่มจากการสมัคร Account ของแบงค์ชาติก่อน จากนั้นจึงสามารถสร้าง Apps API ขึ้นมาได้ โดยไปที่ Apps > Create new app
ให้ตั้งชื่อ Application ที่ต้องการใช้งาน ในที่นี้ตั้งชื่อว่า test_MEF
จากนั้นกด Submit เพื่อส่งคำร้องในการสร้าง
เมื่อ Return ได้มาเป็นหน้าต่างเหมือนด้านล่าง แสดงว่าสร้าง Application สำเร็จแล้ว สิ่งที่ต้องนำไปใช้ต่อใน Python คือ Client ID
ต่อมาต้องทำการ Subscribe API เข้ากับ Application ที่สร้างเอาไว้ ไปที่ API Products > Statistics (1.0.3) แล้วเลือก Application ที่ต้องการ
ขั้นตอนที่เกี่ยวกับหน้าเว็บจบที่ตรงนี้ แต่ว่ามีสิ่งที่น่าสนใจคือที่เมนู Observation จะมีตัวอย่างวิธีการเขียน Code เพื่อเรียกใช้งาน API ในภาษาต่าง ๆ ซึ่งสามารถดูเป็นแนวทางได้
สิ่งสำคัญที่ต้องมีเพื่อใช้ในการค้นหาตัวแปรที่ต้องการคือ Report Code และ Data Series Code ซึ่งเอาไว้อ้างอิงตัวแปรตอนที่เขียนเป็น Code
Code
เริ่มจาก Import
libraries ที่จำเป็นต้องใช้งาน ซึ่งตัวหลักคือ http.client
เพื่อ Connect ไปเว็บของแบงค์ชาติด้วยคำสั่ง .HTTPSConnection()
จากนั้นใส่ URL apigw1.bot.or.th
ต่อมาสร้างตัวแปร headers
โดยให้ใส่ Client ID จาก Application ที่สร้างไว้แทนที่ใน — secret_api_code —
ซึ่งตัวเลขจะเปลี่ยนไปเฉพาะของแต่ละคน
Code ด้านบนนำมาจากที่ใช้งานอยู่จริง ๆ มันเลยดูมีคำสั่งมากกว่าปกติ เพราะต้องการจัดการเรื่อง Datatime ที่ตัวแปรที่ต้องการอยู่คนละ Basis กัน เช่น Monthly หรือ Quarterly รวมไปถึงการเริ่มนับ Quarter ที่เดือนที่ 3 แทนที่จะเป็นเดือนที่ 1 เป็นต้น ดังนั้นจึงขออธิบายเฉพาะส่วนที่จำเป็นต่อการใช้งานเรียก API
ที่ต้องเขียนเป็นลูปขึ้นมา เพราะต้องการดึงข้อมูล API หลายตัวแปร ดังนั้นลูปจึงเป็นทางเลือกที่ดีกว่า โดยใช้ตัวแปร conn ที่สร้างเอาไว้เพื่อ .request() URL ของตัวแปร ซึ่งลิงค์ที่สำคัญที่สุดในการใช้งาน API คือ ‘GET’, ‘/bot/public/observations/?series_code=’+str(i)+’&start_period=’+str(j)+’’, headers=headers
i
หรือseries_code
คือ Data Series Code ได้ที่มาจากไฟล์ ซึ่งตรงนี้อาจนำเข้าข้อมูลเป็น List หรือ DataFrame ก็ทำได้เช่นกันj
หรือstart_period
คือจุดเริ่มต้นในการดึงข้อมูล โดยข้อมูลที่ส่งค่ากลับมา String ในรูปแบบyyyy-mm-dd
ซึ่งอาจต้องมีการแปลงเป็น Pandas datetime ในการใช้งานต่อheaders
คือตัวแปรที่เก็บค่า Client ID ไว้ในรูปแบบ Dictionary
เมื่อได้ทุกอย่างที่ต้องการแล้ว ให้ใช้คำสั่ง .getresponse()
ทำการดึงข้อมูลมาเก็บไว้ที่ตัวแปร res
และทำการ .read()
เพื่อให้อ่านข้อมูล โดยข้อมูล Return ออกมาอาจยากต่อการใช้งาน แนะนำให้ใช้ pandas.io.json.loads(df.decode(‘utf-8))
เพื่อแปลงเป็น Json ให้อ่านและเข้าถึงได้ง่ายขึ้น หรืออาจเปลี่ยนเป็น DataFrame ต่อไปก็ทำได้เช่นกันด้วย pandas.DataFrame.from_dict()
Code ที่ใช้สำหรับการดึงข้อมูลออกมาเป็น DataFrame จบลงที่ตรงนี้ ส่วนเหลือเป็นการจัดการเรื่อง Format ข้อมูล และการจัดการเรื่อง Basis ข้อมูลเท่านั้น
Result
Table สุดท้ายที่ออกมาจาก Code สังเกตเห็นว่าทุกตัวแปรมี Basis ที่เป็น Monthly หมดแล้ว โดยที่บางตัวแปรข้อมูลที่ Public ออกมาอยู่ในรูปแบบ Quarterly อยู่ ที่เป็นแบบนี้ได้เพราะมีการ Interpolate ข้อมูลก่อน ซึ่งโอกาสต่อไปจะมาเขียนเรื่องนี้
อัพเดต
Colab notebook สามารถดูได้จาก Link ด้านบน อาจไม่เหมือนเนื้อหา Blog ตอนนี้ทั้งหมด แต่ใช้งานได้เหมือนกัน