ตัวอย่างการวิเคราะห์ข้อมูลแบบครบวงจรด้วย Aimagin Analytics ใน 10 นาที¶
วัตถุประสงค์
ใช้ตัวอย่างที่เข้าใจง่ายที่สุด ในเวลาไม่เกิน 10 นาที เพื่อแสดงให้นักวิเคราะห์ข้อมูลเห็นว่าสามารถใช้ Aimagin Analytics ในการวิเคราะห์ข้อมูลแบบครบวงจรอย่างไร
ตัวอย่างครอบคลุมขั้นตอน ดังนี้
โจทย์
- ใช้ Aimagin Analytics Development Environment (Dev-En) ซึ่งเป็นเครื่องมือวิเคราะห์ข้อมูลใน Aimagin Analytics ด้วย Python (คล้าย ๆ Jupyter Notebook แตกต่างที่ Jupyter Notebook ทำเป็นบรรทัดๆ และ สั่ง Run ได้ แต่ Aimagin Analytics Dev-En เขียน Code ใน Textbox เดียว แต่สามารถเข้าถึง Database ได้) เพื่อ
- ทดสอบดึงข้อมูลจาก Online Database เข้าระบบ
- เขียน Python code เพื่อประมวลผล โดยเพิ่ม column พ.ศ. (คำนวณจาก ค.ศ. เป็น พศ.)
- ส่งข้อมูลเข้า Analytics (OLAP) Database
- แสดงข้อมูลในมุมต่างๆ ด้วย pivot table เพื่อตรวจสอบข้อมูลเบื้องต้น
- ใช้ Code ทดสอบข้างต้น ใน Python Scheduler ซึ่งเป็นอีกหนึ่งเครื่องมือใน Aimagin Analytics เพื่อกำหนดการทำงานของ Tasks ต่าง ๆ โดยอัตโนมัติ เพื่อ
- กำหนดการทำงานดึงและจัดการข้อมูลอัตโนมัติ วันละครั้ง เวลา 0100น.
- ลบข้อมูลเก่าและใช้ข้อมูลใหม่ที่ดึงมาแทนที่ของเดิม ใน OLAP database
- สร้าง Pivot table ของข้อมูล ใน Web app ซึ่งเป็นอีกหนึ่งเครื่องมือของ Aimagin Analytics ในการทำ Online Dashboard ให้มี Pre-config view 2 แบบ ให้เลือกได้ โดยกำหนด 1 Pre-config view เป็น default
- Pre-config view 1: จำนวนผู้ติดเชื้อ (cases) แยกตาม เดือน และ continent
- Pre-config view 2: จำนวนผู้ติดเชื่้อ (cases) แยกตาม เดือน และ ประเทศ ใน Asia
- Pre-config view 1: จำนวนผู้ติดเชื้อ (cases) แยกตาม เดือน และ continent
วิธีทำ
- หน้า page อยู่ที่ https://data.europa.eu/euodp/en/data/dataset/covid-19-coronavirus-data/resource/260bbbde-2316-40eb-aec3-7cd7bfc2f590
- ตรวจสอบที่อยู่ไฟล์ที่ต้องการดาวน์โหลด พบว่าอยู่ที่ https://opendata.ecdc.europa.eu/covid19/casedistribution/csv
- ตรวจสอบและวิเคราะห์ CSV file ที่ดาวน์โหลดมา พบว่ามีคอลัมน์ 12 จำนวน ดังนี้
- dateRep
- day
- month
- year
- cases
- deaths
- ountriesAndTerritories
- geoId
- countryterritoryCode
- popData2019
- continentExp
- Cumulative_number_for_14_days_of_COVID-19_cases_per_100000
- จาก CSV ต้องสร้างตารางเพื่อเก็บข้อมูลเดิมทั้งหมด และเพิ่ม 3 คอลัมน์ใหม่ ได้แก่
- year_thai เก็บปี พ.ศ. (คำนวณโดยนำ year – 543)
- id เก็บ id เพื่อเป็น primary key
- timestamp เก็บเวลาเพื่อระบุว่าข้อมูลชุดนี้ถูกสร้างมาเมื่อไหร่ ใช้อ้างอิง
- สร้าง Table ในหน้า Analytics database
- สร้างตารางชื่อ TABLE_COVID ประกอบด้วยคอลัมน์เดิมจาก CSV จากข้อ 3 และคอลัมน์ใหม่จาก ข้อ 4 โดยให้เป็น String หมด และ id เป็น Primary Key โดยเปลี่ยนชื่อ Cumulative_number_for_14_days_of_COVID-19_cases_per_100000 เป็น Cumulative_number_for_14_days_of_COVID_19_cases_per_100000 เพื่อหลีกเลี่ยง '-'
- สร้างตารางชื่อ TABLE_COVID ประกอบด้วยคอลัมน์เดิมจาก CSV จากข้อ 3 และคอลัมน์ใหม่จาก ข้อ 4 โดยให้เป็น String หมด และ id เป็น Primary Key โดยเปลี่ยนชื่อ Cumulative_number_for_14_days_of_COVID-19_cases_per_100000 เป็น Cumulative_number_for_14_days_of_COVID_19_cases_per_100000 เพื่อหลีกเลี่ยง '-'
- ดำเนินการสร้าง Dev Env ในหน้า Development เพื่อทดสอบการดึงข้อมูล โดยเลือก Import TABLE_COVID เข้ามา ซึ่งเป็นตารางที่สร้างไว้ในข้อ 4.
- ไปที่หน้า Code Execute และเลือก Environment ที่สร้างไว้ ใส่ code ด้านล่างและ Execute
import requests import csv from clickhouse_driver import connect, Client import os import datetime #ใช้ library requests ในการ get content จาก url x = requests.get('https://opendata.ecdc.europa.eu/covid19/casedistribution/csv') #สร้างไฟล์ชื่อ covid.csv f = open("covid.csv", "wb") #เขียนข้อมูลใส่ไฟล์ f.write(x.content) #ปิดไฟล์ f.close() #เชื่อมต่อกับ Clickhouse database conn = amgcnt.clickhouse() cursor = conn.cursor() #นิยาม header ของ table #Cumulative_number_for_14_days_of_COVID-19_cases_per_100000 ถูกเปลี่ยน #เป็น Cumulative_number_for_14_days_of_COVID_19_cases_per_100000 เพื่อหลีกเลี่ยง # ’-‘ เป็นชื่อ Column header = ['id', 'dateRep', 'day', 'month', 'year', 'cases', 'deaths', 'countriesAndTerritories', 'geoId', 'countryterritoryCode', 'popData2019', 'continentExp', 'Cumulative_number_for_14_days_of_COVID_19_cases_per_100000', 'year_thai', 'timestamp'] # สร้างตัวแปร t1 เพื่อเก็บ header ในรูปแบบ [‘“id” String’, ‘“dateRep” String‘,…] #สร้างตัวแปร t2 เพื่อเก็บชื่อ header ในรูปแบบ [‘“id”’, ‘“dateRep”’,…] #จะมี “ ครอบชื่อคอลัมน์หรือไม่มีก็ได้ แต่ตัวอย่างนี้ใส่ไว้ t1 = [] t2 = [] for i in header: t1.append('"' + i + '"'+' String') t2.append('"' + i + '"') # สร้างตัวแปร datetime เพื่อเก็บ timestamp ในรูปแบบ yyyy-mm-dd hh:mm:ss timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") # สร้างตัวแปร id เพื่อเก็บ datetime ในรูปแบบ yyyymmddhhmmsszzzzz id = datetime.datetime.now().strftime("%Y%m%d%H%M%S%f") # ลบตาราง ‘TABLE_COVID_TEMP’ + id ถ้าพบ #id จะใส่หรือไม่ใส่ก็ได้ แต่ที่ใส่เพื่อป้องกันการซ้ำ (ซึ่งไม่ควรเกิดขึ้น) cursor.execute("DROP TABLE IF EXISTS TABLE_COVID_TEMP"+id) # สร้างตาราง ‘TABLE_COVID_TEMP’ + id อ้างอิงโครงสร้าง TABLE_COVID ที่ Import เข้ามา cursor.execute("CREATE TABLE IF NOT EXISTS TABLE_COVID_TEMP"+id+" AS TABLE_COVID") # อ่าน CSV file with open('covid.csv') as f: reader = csv.reader(f) # ข้าม header i = next(reader) rows = [] for row in reader: r1 = [] # สร้าง id ซึ่งประกอบจาก คอลัมน์ที่ 8 คือ geoId รวมกับ คอลัมน์ที่ 1 เปลี่ยนจาก / เป็น _ r1.append(row[7]+row[0].replace('/', '')) #อ่านข้อมูลใส่ list for r in row: r1.append(r) #แปลง year เป็น year_thai r1.append(str(int(row[3])+543)) #ใส่ timestamp r1.append(timestamp) #ใส่ list เข้าไปใน rows rows.append(r1) #insert rows ที่สร้างไว้ใส่ตาราง ‘TABLE_COVID_TEMP’ + id cursor.executemany("INSERT INTO TABLE_COVID_TEMP"+id+" (" + ", ".join(t2)+ ") VALUES", rows) #ลบตาราง TABLE_COVID cursor.execute("DROP TABLE IF EXISTS TABLE_COVID") #เปลี่ยนชื่อจากตาราง ‘TABLE_COVID_TEMP’ + id ให้เป็นตาราง TABLE_COVID cursor.execute("RENAME TABLE TABLE_COVID_TEMP"+id+" TO TABLE_COVID")
- ไป Tab Data Table เพื่อดูผลลัพธ์ที่ได้ โดยเลือก Dev Env ที่เราสร้างไว้
- ใน Tab Data Table เปลี่ยนจาก Advanced table เป็น Pivot table
- สร้าง pivot แบบที่หนึ่งและดาวน์โหลด config เก็บไว้ (กดปุ่ม download config ของ pivot)
- สร้าง pivot แบบที่สองและดาวน์โหลด config เก็บไว้
- สร้าง pivot แบบที่หนึ่งและดาวน์โหลด config เก็บไว้ (กดปุ่ม download config ของ pivot)
- ไปที่หน้า Scheduler เพื่อสร้าง Task
- สร้าง task และนำ code จาก 7 ไปใส่ ตั้งเวลาให้รันเวลา 01:00 ของทุกวัน และทดสอบการรันโค้ด
- ตรวจสอบผลลัพธ์ ที่หน้า Transactional database เลือก TABLE_COVID โดยสามารถเช็คผ่านคอลัมน์ timestamp ได้ว่า ข้อมูลชุดนี้ถูกสร้างขึ้นมาตอนไหน
- สร้าง task และนำ code จาก 7 ไปใส่ ตั้งเวลาให้รันเวลา 01:00 ของทุกวัน และทดสอบการรันโค้ด
- สร้าง Dashboard โดยใช้ Aimagin Connect
- สร้าง Tree ที่ประกอบไปด้วย dropdown และ Pivot table
- ตั้งค่า Options ของ Drop down
- เพิ่มโค้ดในส่วนของ change callback ของ drop down (เมื่อ dropdown มีการเปลี่ยน callback นี้จะถูกเรียกใช้งาน
//เรียกใช้ฟังก์ชั่น AmgCnt._params.updatePivot(); โดยจะถูกนิยามที่ init callback ของ page AmgCnt._params.updatePivot();
- เพิ่มโค้ดในส่วนของ init callback
- เปิดไฟล์ config ที่ดาวน์โหลดมาในขั้นตอนที่ 9 copy content ของไฟล์มาใช้เพื่อตั้งค่าให้ pivot table ผ่าน setParameter
- เพิ่มโค้ดเพื่อนิยามฟังก์ชั่นที่ใช้งานในการเลือก config มาใช้
//set ตารางให้กับ pivot table ถ้าไม่มี config ก็จะสามารถเลือก config ได้เอง setParameter('id-18y5WvMv12-1599588623912', 'Table', {tableName:"TABLE_COVID", database:"clickhouse"}); AmgCnt._params.updatePivot = function() { //set ตัวแปร config ให้เก็บ config ของตัวเลือกแรก let config = ``/*นำ content ไฟล์ของ config 1 มาใส่ระหว่าง ``*/ if(getParameter('id-q7QD964f45-1599630627063', 'Value')!='จำนวนผู้ติดเชื้อ (cases) แยกตาม เดือน และ continent') {//กรณีถ้าพบว่าค่าใน dropdown เป็นตัวเลือกที่ 2 config = ``/*นำ content ไฟล์ของ config 2 มาใส่ระหว่าง ``*/ } //set config ให้กับ pivot table ผ่าน setParameter setParameter('id-18y5WvMv12-1599588623912', 'Config', config); } //set default option ให้กับ dropdown ผ่าน setParameter setParameter('id-q7QD964f45-1599630627063', 'Value', 'จำนวนผู้ติดเชื้อ (cases) แยกตาม เดือน และ continent'); //update ตาราง pivot AmgCnt._params.updatePivot();
- เปิดไฟล์ config ที่ดาวน์โหลดมาในขั้นตอนที่ 9 copy content ของไฟล์มาใช้เพื่อตั้งค่าให้ pivot table ผ่าน setParameter
- สร้าง Tree ที่ประกอบไปด้วย dropdown และ Pivot table
- กด preview เพื่อทดสอบ
- pre-config 1
- pre-config 2
- pre-config 1
- สามารถนำ page ที่สร้างไป publish เพื่อทำเป็น web app ต่อไปได้