Project

General

Profile

ตัวอย่างการวิเคราะห์ข้อมูลแบบครบวงจรด้วย Aimagin Analytics ใน 10 นาที

วัตถุประสงค์

ใช้ตัวอย่างที่เข้าใจง่ายที่สุด ในเวลาไม่เกิน 10 นาที เพื่อแสดงให้นักวิเคราะห์ข้อมูลเห็นว่าสามารถใช้ Aimagin Analytics ในการวิเคราะห์ข้อมูลแบบครบวงจรอย่างไร
ตัวอย่างครอบคลุมขั้นตอน ดังนี้

โจทย์

  1. ใช้ Aimagin Analytics Development Environment (Dev-En) ซึ่งเป็นเครื่องมือวิเคราะห์ข้อมูลใน Aimagin Analytics ด้วย Python (คล้าย ๆ Jupyter Notebook แตกต่างที่ Jupyter Notebook ทำเป็นบรรทัดๆ และ สั่ง Run ได้ แต่ Aimagin Analytics Dev-En เขียน Code ใน Textbox เดียว แต่สามารถเข้าถึง Database ได้) เพื่อ
    1. ทดสอบดึงข้อมูลจาก Online Database เข้าระบบ
    2. เขียน Python code เพื่อประมวลผล โดยเพิ่ม column พ.ศ. (คำนวณจาก ค.ศ. เป็น พศ.)
    3. ส่งข้อมูลเข้า Analytics (OLAP) Database
    4. แสดงข้อมูลในมุมต่างๆ ด้วย pivot table เพื่อตรวจสอบข้อมูลเบื้องต้น
  2. ใช้ Code ทดสอบข้างต้น ใน Python Scheduler ซึ่งเป็นอีกหนึ่งเครื่องมือใน Aimagin Analytics เพื่อกำหนดการทำงานของ Tasks ต่าง ๆ โดยอัตโนมัติ เพื่อ
    1. กำหนดการทำงานดึงและจัดการข้อมูลอัตโนมัติ วันละครั้ง เวลา 0100น.
    2. ลบข้อมูลเก่าและใช้ข้อมูลใหม่ที่ดึงมาแทนที่ของเดิม ใน OLAP database
  3. สร้าง Pivot table ของข้อมูล ใน Web app ซึ่งเป็นอีกหนึ่งเครื่องมือของ Aimagin Analytics ในการทำ Online Dashboard ให้มี Pre-config view 2 แบบ ให้เลือกได้ โดยกำหนด 1 Pre-config view เป็น default
    1. Pre-config view 1: จำนวนผู้ติดเชื้อ (cases) แยกตาม เดือน และ continent
    2. Pre-config view 2: จำนวนผู้ติดเชื่้อ (cases) แยกตาม เดือน และ ประเทศ ใน Asia

วิธีทำ

  1. หน้า page อยู่ที่ https://data.europa.eu/euodp/en/data/dataset/covid-19-coronavirus-data/resource/260bbbde-2316-40eb-aec3-7cd7bfc2f590
  2. ตรวจสอบที่อยู่ไฟล์ที่ต้องการดาวน์โหลด พบว่าอยู่ที่ https://opendata.ecdc.europa.eu/covid19/casedistribution/csv
  3. ตรวจสอบและวิเคราะห์ CSV file ที่ดาวน์โหลดมา พบว่ามีคอลัมน์ 12 จำนวน ดังนี้
    1. dateRep
    2. day
    3. month
    4. year
    5. cases
    6. deaths
    7. ountriesAndTerritories
    8. geoId
    9. countryterritoryCode
    10. popData2019
    11. continentExp
    12. Cumulative_number_for_14_days_of_COVID-19_cases_per_100000
  4. จาก CSV ต้องสร้างตารางเพื่อเก็บข้อมูลเดิมทั้งหมด และเพิ่ม 3 คอลัมน์ใหม่ ได้แก่
    1. year_thai เก็บปี พ.ศ. (คำนวณโดยนำ year – 543)
    2. id เก็บ id เพื่อเป็น primary key
    3. timestamp เก็บเวลาเพื่อระบุว่าข้อมูลชุดนี้ถูกสร้างมาเมื่อไหร่ ใช้อ้างอิง
  5. สร้าง Table ในหน้า Analytics database
    1. สร้างตารางชื่อ 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 เพื่อหลีกเลี่ยง '-'
  6. ดำเนินการสร้าง Dev Env ในหน้า Development เพื่อทดสอบการดึงข้อมูล โดยเลือก Import TABLE_COVID เข้ามา ซึ่งเป็นตารางที่สร้างไว้ในข้อ 4.
  7. ไปที่หน้า 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")
    
  8. ไป Tab Data Table เพื่อดูผลลัพธ์ที่ได้ โดยเลือก Dev Env ที่เราสร้างไว้
  9. ใน Tab Data Table เปลี่ยนจาก Advanced table เป็น Pivot table
    1. สร้าง pivot แบบที่หนึ่งและดาวน์โหลด config เก็บไว้ (กดปุ่ม download config ของ pivot)
    2. สร้าง pivot แบบที่สองและดาวน์โหลด config เก็บไว้
  10. ไปที่หน้า Scheduler เพื่อสร้าง Task
    1. สร้าง task และนำ code จาก 7 ไปใส่ ตั้งเวลาให้รันเวลา 01:00 ของทุกวัน และทดสอบการรันโค้ด
    2. ตรวจสอบผลลัพธ์ ที่หน้า Transactional database เลือก TABLE_COVID โดยสามารถเช็คผ่านคอลัมน์ timestamp ได้ว่า ข้อมูลชุดนี้ถูกสร้างขึ้นมาตอนไหน
  11. สร้าง Dashboard โดยใช้ Aimagin Connect
    1. สร้าง Tree ที่ประกอบไปด้วย dropdown และ Pivot table
    2. ตั้งค่า Options ของ Drop down
    3. เพิ่มโค้ดในส่วนของ change callback ของ drop down (เมื่อ dropdown มีการเปลี่ยน callback นี้จะถูกเรียกใช้งาน
      //เรียกใช้ฟังก์ชั่น AmgCnt._params.updatePivot(); โดยจะถูกนิยามที่ init callback ของ page
      AmgCnt._params.updatePivot();
      
    4. เพิ่มโค้ดในส่วนของ init callback
      1. เปิดไฟล์ config ที่ดาวน์โหลดมาในขั้นตอนที่ 9 copy content ของไฟล์มาใช้เพื่อตั้งค่าให้ pivot table ผ่าน setParameter
      2. เพิ่มโค้ดเพื่อนิยามฟังก์ชั่นที่ใช้งานในการเลือก 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();
        
        
  12. กด preview เพื่อทดสอบ
    1. pre-config 1
    2. pre-config 2
  13. สามารถนำ page ที่สร้างไป publish เพื่อทำเป็น web app ต่อไปได้