Analytic

เป็นเครื่องมือที่ใช้สำหรับทำการวิเคราะห์ข้อมูลในเชิงลึก ใช้ในการคาดการณ์เหตุการณ์ที่อาจจะเกิดขึ้นอนาคต จากข้อมูลที่เกิดขึ้นอดีต (Data Analytics) ซึ่งซอฟต์แวร์ที่มีให้ใช้ในปัจจุบัน คือ Jupyter Notebook

Library ที่จำเป็นที่ใช้ในการวิเคราะห์ข้อมูล

  • Pandas เป็น library ที่มีจุดเด่นคือใช้ในการวิเคราะห์ข้อมูล โดยที่ Pandas สามารถอ่านไฟล์ได้เกือบทั้งหมด และ Pandas ยังมีคำสั่งที่จะช่วยเตรียมข้อมูลให้สมบูรณ์ก่อนที่จะนำไปคำนวณได้ จึงเป็น Library ที่ใช้ในด้าน Data Science ได้

  • Numpy คือ library ที่เกี่ยวกับฟังก์ชั่นทางคณิตศาสตร์และการคำนวณต่างๆ โดยจะเข้าไปจัดการข้อมูลที่เป็นตารางแบบ array

  • Matplotlib เป็น library ที่ใช้ในการสร้างกราฟจาก array ซึ่งสามารถสร้างกราฟได้ทั้งในเเบบ 2 มิติ , 3 มิติ, กราฟเส้นตรง, พาราโบลา และกราฟอื่นๆได้อีกมากมาย แต่ทั้งนี้การที่มันจะทำงานได้ ต้องมีการใช้ควบคู่ไปกับ numpy

  • Seaborn เป็น library เหมือนกับ Matplotlib แต่จะมีการพล็อตกราฟที่สวยขึ้น ถูกพัฒนาขึ้นมาจาก Matplotlib

  • Scikit-learn (sklearn) เป็น library ทีใช้ในการทำ Machine Learning ซึ่ง Scikit-learn มี code ที่สามารถจัดการข้อมูลได้หลากหลาย ไม่ว่าจะเป็นการทำ Clustering , Classification , regression ซึ่งในที่นี้จะให้คอมพิวเตอร์เรียนรู้แบบ linear regression เเละยังสามารถนำมาประยุกต์ใช้กับ Data Science ได้

การสร้างไฟล์

เริ่มแรกให้ทำการสร้างไฟล์ขึ้นมาก่อนโดยทำการคลิกที่ปุ่ม "file" เลือกไปที่ "new" และเลือก "notebook"

_images/jupyternotebook1.png

จากนั้นทำการคลิกเข้าไปจะมีหน้าต่าง Select kernel เลือก Python3(ipykernel) แล้วกด "Select"

_images/jupyternotebook2.png

จะได้ไฟล์ขึ้นมาดังรูป

_images/jupyternotebook3.png

การใช้งาน jupyternotebook เบื้องต้น

ใน Jupyter notebook จะทำงานร่วมกับ Cell ซึ่ง Cell เป็นได้ 3 อย่างดังนี้

  • Code เป็น block ของ code(python) เราสามารถกด Enter ได้จะเป็นการขึ้นบรรทัดใหม่ ใน 1 cell มี code ได้หลายบรรทัด

  • Markdown เป็นการเขียน markdown เพื่อให้คำอธิบายเพิ่มเติม อาจเป็น link ไปยัง reference site ภายนอก หรือแสดงรูปภาพ Markdown

  • Raw เป็นข้อความหรือคำอธิบายที่เป็น text ธรรมดา

ในส่วนการ run jupyter notebook สามารถเลือกกด run ทีละ cell หรือ run ทั้งไฟล์(ทุก cells) เลยก็ได้

_images/jupyternotebook4.png

เป็นการ run cell ที่ถูกเลือก

_images/jupyternotebook5.png

เป็นการ run cells ทั้งหมดที่อยู่ในไฟล์

ในแต่ละ cell จะมีเครื่องมือที่ช่วยในการจัดการ cell ได้

_images/jupyternotebook6.png
  • Duplicate ปุ่มแรกจะเป็นการสร้าง cell ที่เหมือนกันขึ้นมาอีก cell

  • Move Up กดปุ่มลูกศรขึ้นจะเป็นการสลับที่กับ cell ก่อนหน้า

  • Move Down กดปุ่มลูกศรลงจะเป็นการสลับที่กับ cell ถัดไป

  • Insert Above จะเป็นการเพิ่ม cell ก่อนหน้า

  • Insert Below จะเป็นการเพิ่ม cell ถัดจาก cell ปัจจุบัน

  • Delete ลบ cell ออก

การใช้งาน jupyternotebook ร่วมกับ InfluxDB

_images/jupyternotebook7.png

ตัวอย่าง

ตัวอย่างการใช้งานจะเป็นการดึงค่าจาก InfluxDB โดยจะเป็นการดึงค่ากระแสและแรงดันไฟฟ้าเพื่อนำมาวิเคราะห์ข้อมูลและพล็อตออกมาเป็นกราฟ

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from influxdb_client import InfluxDBClient
import pandas as pd
from scipy import stats

# Define queries
token = "QX54Ci5Y0kEJsEp6-HzP76poVbZ38gNY6W1UYiqIAU2zRFtvahixOg403wNjTN9_N1NDarrwFXtMzXzxCCwxgQ==" // เอามาจาก InfluxDB
url = "https://influxdb-nexpie.flowstack.nexiiot.io"
org = "primary" // คือ Organization
bucket = "solar" //คือ Bucket ที่ต้องการนำมาวิเคราะห์ข้อมูล
measurement = "Gen" // คือ Measurement ที่ต้องการนำมาวิเคราะห์ข้อมูล

get_ac = f'from(bucket: "{bucket}") \
            |> range(start: -10y) \
            |> filter(fn: (r) => r._measurement == "{measurement}")\
            |> filter(fn: (r) => r._field == "AC_POWER")\
            |> filter(fn: (r) => r.PLANT_ID == "4135001")'
get_dc = f'from(bucket: "{bucket}") \
            |> range(start: -10y) \
            |> filter(fn: (r) => r._measurement == "{measurement}")\
            |> filter(fn: (r) => r._field == "DC_POWER")\
            |> filter(fn: (r) => r.PLANT_ID == "4135001")'


# Initialize InfluxDB client and query API
client = InfluxDBClient(url=url, token=token, org=org)
query_api = client.query_api()

# Execute queries and extract data
data = {}
for query, field in [(get_ac, 'ac'), (get_dc, 'dc')]:
    result = query_api.query(query)
    data[field] = [(record['_time'], record['_value']) for table in result for record in table.records]
#  Print data as Dataframe
df = pd.DataFrame(data)
print(df)

# Extract the x and y values for linear regression for ac
x_ac = [i[0] for i in data['ac']]
y_ac = [i[1] for i in data['ac']]

# Extract the x and y values for linear regression for dc
x_dc = [i[0] for i in data['dc']]
y_dc = [i[1] for i in data['dc']]

เมื่อทำการใส่ code ข้างต้นแล้วทำการกด run จะได้ output ac และ dc ขึ้นมา

_images/jupyternotebook8.png

จากนั้นทำการพล็อตกราฟโดยใช้คำสั่ง

_images/jupyternotebook9.png

จะได้กราฟขึ้นดังรูป

_images/jupyternotebook10.png

Node Jupyter Cell

_images/nodejupytercell1.png

โหนด "Jupyter Cell" ทำหน้าที่ใช้ในการอ่านไฟล์จากส่วนของ Analytic และดำเนินการ execute โค้ดที่อยู่ไฟล์ดังกล่าว ซึ่งภายในไฟล์สามารถเขียนโค้ดแยกเป็นส่วนๆได้ (หรือเรียกว่า cell) นอกจากนี้ยังสามารถเลือก execute โค้ดแต่ละส่วนตามความต้องการของผู้ใช้ได้

วิธีการใช้งาน node jupyter cell

  1. ให้ผู้ใช้งานลากโหนด "Jupyter Cell" ที่อยู่ในแพลิตต์ทางด้านซ้าย หมวดหมู่ device มาวางลงพื้นที่เวิร์คสเปซ ซึ่งแสดงดังรูป

_images/nodejupytercell2.png
  1. ทำการ double click ที่ตัวโหนด "Jupyter Cell" บนเวิร์คสเปซเพื่อเปิดหน้าต่างแก้ไขขึ้นมา หน้าต่างแก้ไขนี้ใช้ในการเลือกไฟล์ และเลือก language ที่ต้องการรัน ซึ่งแสดงดังรูป

_images/nodejupytercell3.png
  1. โดยผู้ใช้ต้องเลือก Language ที่จะใช้ในการรันโค้ด ซึ่งถ้ามีตัวเลือกเพียง "Add new kernelconfig…" หมายความว่า ผู้ใช้ยังไม่ได้สร้าง Language โดยผู้ใช้สามารถสร้าง Language ขึ้นมาได้โดยการเลือก "Add new kernelconfig…" และคลิกรูป icon ดินสอดังรูป

_images/nodejupytercell4.png

โดยจะขึ้นหน้าต่างให้กรอกรายละเอียดของ Language ที่ต้องการใช้ ซึ่งผู้ใช้สามารถกรอกรายละเอียดได้ดังนี้

  • Language ระบุภาษาที่ต้องการใช้ในการรัน โดยโหนดกำหนดค่าเริ่มต้นเป็น python3

    • ภาษา python: python3

    • ภาษา javascript: javascript

  • Endpoint ตำแหน่งของ Jupyter Notebook ที่ใช้ในการโต้ตอบ และจัดการข้อมูลกับ Flow Engine โดยโหนดกำหนดค่าเริ่มต้นเป็นเป็น default

_images/nodejupytercell5.png

เมื่อผู้ใช้เพิ่ม Language สำเร็จ โหนด "Jupyter Cell" เลือก Language ที่สร้างขึ้นให้อัตโนมัติ ซึ่งแสดงดังรูป

_images/nodejupytercell6.png
  1. โหนด "Jupyter Cell" จะดำเนินการอ่านไฟล์ที่ส่วนของ Analytic และผู้ใช้สามารถเลือก cell ที่ต้องการจะให้ทำงานได้ โดยคลิกที่ Analytic หลังจากนั้นดำเนินการสร้างไฟล์ ซึ่งเมื่อคลิก Python3 (ipykernel) จะได้ไฟล์ชื่อ "Untitled.ipynb"

_images/nodejupytercell7.png

โดยผู้ใช้สามารถตั้งชื่อไฟล์ใหม่ได้ ด้วยการคลิกขวาที่ไฟล์ และเลือก Rename แสดงดังรูป

_images/nodejupytercell8.png

นอกจากนี้ผู้ใช้สามารถเขียนโค้ด python ลงใน cell หรือสร้าง cell ใหม่เพิ่มขึ้นมา เพื่อแยกโค้ด python ตามที่ต้องการได้ ตัวอย่างการเขียน Code ประกาศตัวแปรและการนำตัวแปรมาคำนวณ แสดงดังรูป โดย cell ที่ 1 มีการประกาศตัวแปรชื่อ message, a และ b พร้อมกำหนดค่าเป็น "Hello World", 5 และ 2 ตามลำดับ หลังจากนั้นมีการใช้คำสั่ง print เพื่อแสดงผลข้อมูลในตัวแปร message ส่วน cell ที่ 2 มีการประกาศตัวแปรชื่อ result และมีการกำหนดค่าให้กับตัวแปรด้วยการนำตัวแปร a และ b มาบวกกัน โดยที่ตัวแปร a และ b ได้ถูกประกาศไว้ที่ cell ที่ 1 หลังจากนั้นมีการใช้คำสั่ง print เพื่อแสดงผลข้อมูลในตัวแปร result โดยถ้าผู้ใช้รันโค้ดใน cell ที่ 2 โดยไม่ได้รันโค้ดใน cell ที่ 1 จะทำให้เกิดข้อผิดพลาดขึ้นได้ เนื่องจากโค้ดใน cell ที่ 2 ต้องใช้ข้อมูลตัวแปรจากใน cell ที่ 1

_images/nodejupytercell9.png

เมื่อผู้ใช้สร้างไฟล์ในส่วนของ Analytic สำเร็จ ให้ผู้ใช้กลับไปที่ส่วนของ FlowEngine แล้ว double click โหนด "Jupyter Cell" ที่สร้างไว้ โดยที่หัวข้อ Filename ผู้ใช้สามารถพิมพ์ชื่อไฟล์ได้ หรือคลิกปุ่ม More vert หรือจุดสามจุด เพื่อแสดงรายการไฟล์ และเลือกไฟล์ที่ต้องการได้ แสดงดังรูป

_images/nodejupytercell10.png

เมื่อผู้ใช้เลือกไฟล์ที่ต้องการแล้ว (เช่น /basic_python.jpynb) หัวข้อ Cell จะมีตัวเลือกเพิ่มขึ้นมา ซึ่งจะขึ้นอยู่กับจำนวน cell ที่ผู้ใช้สร้างไว้ในไฟล์ที่เลือก โดยจะมีหมายเลขกำกับไว้ที่แต่ละ cell ซึ่งหมายเลข 1 จะเริ่มต้นจาก cell ที่อยู่บนสุดของไฟล์ และเรียงลงมาตามลำดับ แสดงดังรูป

_images/nodejupytercell11.png

หมายเหตุ ตัวเลือกของ cell สามารถกำหนดชื่อเพิ่มเติมได้ โดยในบรรทัดแรกของ cell ให้ผู้ใช้พิมพ์ # แล้วตามด้วยชื่อที่ต้องการกำหนดให้ cell

_images/nodejupytercell12.png

นอกจากนี้ผู้ใช้ยังสามารถสร้างตัวแปรผ่านโหนด "Jupyter Cell" แล้วนำตัวแปรไปใช้งานที่ส่วนของ Analytic ได้ ยกตัวอย่างเมื่อเลือก cell หมายเลข 2 โดยภายใน cell มีการนำตัวแปร a มาบวกกับตัวแปร b ซึ่งทั้งสองตัวแปรถูกประกาศไว้ที่ cell หมายเลข 1 ดังนั้นผู้ใช้สามารถสร้างตัวแปร a และตัวแปร b ได้จากหัวข้อ "Variable initialization" แสดงดังรูป

_images/nodejupytercell13.png

โดยโหนด "Jupyter Cell" รองรับการประกาศตัวแปรชนิด string (ข้อความ), number (ตัวเลข), boolean (true หรือ false) และ Object (อยู่ในรูปแบบ JSON) ดังรูป

_images/nodejupytercell14.png
  1. โหนด "Jupyter Cell" มี Input 1 ช่อง และมี Output 2 ช่อง โดย Input ใช้สำหรับการกระตุ้นให้โหนด "Jupyter Cell" ทำงาน ส่วน output มีทั้งหมด 2 ช่อง ดังนี้

    • text output เป็นข้อมูลทุกอย่างที่ฟังก์ชัน print ที่ส่วน Analytic แสดงผลออกมา

    error output ข้อผิดพลาดที่เกิดจากการประมวลผล cell ที่เลือกของไฟล์นั้น

_images/nodejupytercell15.png

Text output ของโหนด "Jupyter cell" สามารถนำไปใช้ในการกระตุ้นโหนด "Jupyter cell" ถัดไปได้ ซึ่งจะสามารถนำไปกระตุ้นได้ก็ต่อเมื่อโหนด "Jupyter cell" นั้นรันโค้ดสำเร็จ ไม่มีข้อผิดพลาด โดยข้อมูลที่ออกมาจากช่อง output ทั้งหมด ถูกเก็บไว้ในตัวแปร msg.payload ซึ่งผู้ใช้สามารถเลือกโหนด debug มาใช้แสดงผลข้อมูลที่ debug message ได้ ยกตัวอย่างในข้อที่ 3 ทดลองรัน cell 1 ของไฟล์ basic_python.jpynb ซึ่งได้ผลลัพธ์ดังรูป

_images/nodejupytercell16.png

จากโค้ด python ใน cell หมายเลข 1 มีการใช้ฟังก์ชัน print เพื่อแสดงข้อมูลในตัวแปร message ซึ่งเป็นข้อความ "Hello World" โดย Output ของโหนด "Jupyter Cell" นำข้อความดังกล่าวที่ได้จากฟังก์ชัน print เก็บไว้ในตัวแปร msg.payload และหลังจากนั้นใช้โหนด Debug ที่ตั้งชื่อว่า "Cell1" นำข้อมูลจากตัวแปร msg.payload ไปแสดงที่ส่วน Debug นอกจากนี้โค้ด python ใน cell หมายเลข 1 ยังมีการประกาศตัวแปรชื่อ "a" และ "b" โดยจากตัวอย่างได้มีการนำข้อมูลตัวแปรดังกล่าวไปประมวลผลต่อที่ cell หมายเลข 2 ซึ่งถ้าทดลองรัน cell 2 ของไฟล์ basic_python.jpynb ต่อเนื่องจากการทดลองรัน cell 1 จะได้ผลลัพธ์ดังรูป

_images/nodejupytercell17.png

นอกจากนี้ถ้าทดลองประกาศตัวแปรที่ส่วนของ Variable initialization ของโหนด "Jupyter Cell" โดยให้ตั้งชื่อว่า "a" และ "b" ให้เท่ากับ 1 และ 2 ตามลำดับ ซึ่งเป็นทั้งสองตัวแปรมีชื่อเหมือนกับตัวแปร "a" และ "b" ที่ประกาศใน cell หมายเลข 1 ดังนั้นเมื่อทดลองรัน cell 2 จะได้ผลลัพธ์ที่แตกต่างออกไป เนื่องจากมีการกำหนดค่าให้กับตัวแปรใหม่ โดยผลลัพธ์เดิมคือ 7 แต่ผลลัพธ์ใหม่คือ 3 แสดงดังรูป

_images/nodejupytercell18.png

นอกจากการประกาศตัวแปรชนิด number แล้ว ผู้ใช้สามารถประกาศตัวแปรชนิดอื่นได้ เช่น การประกาศตัวแปรชนิด object ในรูปแบบ JSON ดังตัวอย่างในรูป

_images/nodejupytercell19.png

ตัวอย่าง

จากตัวอย่างจะเป็นการนำข้อมูลการใช้ของ CPU และ RAM ของเครื่องไปเก็บไว้ใน database postgresql ผ่าน library SQLalchemy บน Jupyter Notebook และนำข้อมูลจาก database ไปสร้างเป็นกราฟแสดงผลแบบ real-time บน grafana ที่มีอยู่ใน flow stack

เริ่มต้นสร้าง language ใหม่ที่มีชื่อว่า "cpu_ram_postgresql" เพื่อใช้สำหรับตัวอย่างนี้ โดยกำหนด language เป็น "python3" และ connection เป็น "default" แสดงดังรูป

_images/nodejupytercellexample1.png

สร้างไฟล์ชื่อว่า "postgresql.ipynb" ที่ส่วนของ Analytic และเริ่มต้นสร้าง cell ที่ 1 ซึ่งเป็น cell ที่ทำหน้าที่ประมวลผลการใช้ CPU และ RAM โดยบรรทัดแรกของ cell ให้กำหนดเป็น comment "Cal_CPU_RAM" เพื่อเป็นชื่อ cell ซึ่งฝั่งโหนด "Jupyter Cell" จะเห็นเป็น "1. Cal_CPU_RAM" และข้อมูลการใช้ CPU และ RAM ที่ได้จะเก็บอยู่ในตัวแปร cpu_usage_percent และ used_memory_percent ตามลำดับ ผู้ใช้งานสามารถทดลองรัน cell นี้ที่ฝั่ง analytic ได้ด้วยการคลิก cell ที่ต้องการ แล้วกดปุ่ม shift+enter จะได้ผลลัพธ์แสดงดังรูป

_images/nodejupytercellexample2.png

รัน cell "1. Cal_CPU_RAM" ที่โหนด "Jupyter Cell" ด้วยการใช้ language เป็น "cpu_ram_postgresql" ที่สร้างไว้ก่อนหน้านี้ โดยกำหนด Filename เป็น "postgresql.ipynb" และเลือก Cell ที่มีชื่อว่า "1. Cal_CPU_RAM" หลังจากนั้นเปลี่ยนชื่อของโหนดเป็น "Cal_CPU_RAM" เพื่อให้ง่ายต่อการใช้งานมากขึ้น ซึ่งแสดงดังรูป

_images/nodejupytercellexample3.png

ลากโหนด "inject" และ "debug" มาเชื่อมต่อกับโหนด "Cal_CPU_RAM" โดยให้โหนด "inject" (โหนด "timestamp") เชื่อมต่อกับ input ของโหนด "Cal_CPU_RAM" และโหนด "debug" เชื่อมต่อกับ output ช่องที่ 1 ของ โหนด "Cal_CPU_RAM" ซึ่งเป็น text output โดยคลิก inject ที่โหนด "timestamp" หลังจากนั้นสังเกตผลลัพธ์ที่ส่วนของ debug โดยแสดงดังรูป

_images/nodejupytercellexample4.png

ขั้นตอนต่อมาเป็นส่วนของการสร้างการเชื่อมต่อกับ database postgresql ด้วย library SQLalchemy โดยเริ่มต้นสร้าง cell ที่ 2 ของไฟล์ "postgresql.ipynb" โดยบรรทัดแรกของ cell ให้กำหนดเป็น comment "connect_postgresql" เพื่อเกิดเป็นชื่อของ cell ซึ่งฝั่งโหนด "Jupyter Cell" จะเห็นเป็น "2. connect_postgresql" และเพิ่มโค้ดลงที่อยู่ในรูปลงใน cell โดยที่ก่อนที่ผู้ใช้จะใช้งาน cell นี้ได้ ผู้ใช้ต้องติดตั้ง library sqlalchemy เสียก่อน ซึ่งสามารถติดตั้งได้ด้วยคำสั่ง "!pip install SQLAlchemy" เมื่อผู้ใช้ติดตั้ง library สำเร็จแล้ว ทดลองรัน cell นี้ด้วยการคลิกที่ cell แล้วกดปุ่ม shift+enter จะได้ผลลัพธ์แสดงดังรูป

_images/nodejupytercellexample5.png

ทดลองรัน cell "2. connect_postgresql" ที่โหนด "Jupyter Cell" ด้วยการใช้ language เป็น "cpu_ram_postgresql" ที่สร้างไว้ก่อนหน้านี้ โดยกำหนด Filename เป็น "postgresql.ipynb" และเลือก Cell ที่มีชื่อว่า "2. connect_postgresql" หลังจากนั้นเปลี่ยนชื่อของโหนดเป็น "connect_pg" เพื่อให้ง่ายต่อการใช้งานมากขึ้น ซึ่งแสดงดังรูป

_images/nodejupytercellexample6.png

ลาก output ช่องที่ 3 ของโหนด "Cal_CPU_RAM" มาเชื่อมต่อกับ input ของโหนด "connect_pg" และ output ช่องที่ 1 ของ โหนด "connect_pg" เชื่อมต่อกับโหนด "debug" ซึ่งเป็น text output โดยคลิก inject ที่โหนด "timestamp" หลังจากนั้นสังเกตผลลัพธ์ที่ส่วนของ debug โดยแสดงดังรูป

_images/nodejupytercellexample7.png

เมื่อสร้างการเชื่อมต่อกับ database สำเร็จแล้ว ขั้นตอนต่อมา คือ สร้าง schema สำหรับ Table ที่จะเก็บข้อมูลการใช้ CPU และ RAM ของเครื่อง โดยเริ่มต้นสร้าง cell ที่ 3 ของไฟล์ "postgresql.ipynb" โดยบรรทัดแรกของ cell ให้กำหนดเป็น comment "Define_the_Schema" เพื่อเกิดเป็นชื่อของ cell ซึ่งฝั่งโหนด "Jupyter Cell" จะเห็นเป็น "3. Define_the_Schema" และเพิ่มโค้ดลงที่อยู่ในรูปลงใน cell โดยตารางมีชื่อว่า "ram_cpu_usage" ประกอบด้วย column ดังนี้

  • id ลำดับของข้อมูล ชนิดข้อมูล interger

  • cpu ข้อมูลการใช้ cpu (หน่วยเป็น %) ชนิดข้อมูล float

  • ram ข้อมูลการใช้ ram (หน่วยเป็น %) ชนิดข้อมูล float

  • created_on เวลาที่สร้างข้อมูล ชนิดข้อมูล datetime

  • updated_on เวลาที่อัปเดตข้อมูล ชนิดข้อมูล datetime

แล้วทดลองรัน cell นี้ด้วยการคลิกที่ cell แล้วกดปุ่ม shift+enter จะได้ผลลัพธ์แสดงดังรูป

_images/nodejupytercellexample8.png

ทดลองรัน cell "3. Define_the_Schema" ที่โหนด "Jupyter Cell" ด้วยการใช้ language เป็น "cpu_ram_postgresql" ที่สร้างไว้ก่อนหน้านี้ โดยกำหนด Filename เป็น "postgresql.ipynb" และเลือก Cell ที่มีชื่อว่า "3. Define_the_Schema" หลังจากนั้นเปลี่ยนชื่อของโหนดเป็น "schema" เพื่อให้ง่ายต่อการใช้งานมากขึ้น ซึ่งแสดงดังรูป

_images/nodejupytercellexample9.png

ลาก output ช่องที่ 3 ของโหนด "connect_pg" มาเชื่อมต่อกับ input ของโหนด "schema" และ output ช่องที่ 1 ของ โหนด "schema" เชื่อมต่อกับโหนด "debug" ซึ่งเป็น text output โดยคลิก inject ที่โหนด "timestamp" หลังจากนั้นสังเกตผลลัพธ์ที่ส่วนของ debug โดยแสดงดังรูป

_images/nodejupytercellexample10.png

เมื่อกำหนด schema สำหรับ Table สำเร็จ ขั้นตอนต่อมา คือ การทำให้ database มี Table ตรงกับที่ผู้ใช้กำหนดไว้ที่ schema หรือเรียกว่าการซิงค์ database โดยเริ่มต้นสร้าง cell ที่ 4 ของไฟล์ "postgresql.ipynb" โดยบรรทัดแรกของ cell ให้กำหนดเป็น comment "Sync_Database" เพื่อเกิดเป็นชื่อของ cell ซึ่งฝั่งโหนด "Jupyter Cell" จะเห็นเป็น "4. Sync_Database" และเพิ่มโค้ดลงที่อยู่ในรูปลงใน cell แล้วทดลองรัน cell นี้ด้วยการคลิกที่ cell แล้วกดปุ่ม shift+enter จะได้ผลลัพธ์แสดงดังรูป

_images/nodejupytercellexample11.png

ทดลองรัน cell "4. Sync_Database" ที่โหนด "Jupyter Cell" ด้วยการใช้ language เป็น "cpu_ram_postgresql" ที่สร้างไว้ก่อนหน้านี้ โดยกำหนด Filename เป็น "postgresql.ipynb" และเลือก Cell ที่มีชื่อว่า "4. Sync_Database" หลังจากนั้นเปลี่ยนชื่อของโหนดเป็น "sync_db" เพื่อให้ง่ายต่อการใช้งานมากขึ้น ซึ่งแสดงดังรูป

_images/nodejupytercellexample12.png

ลาก output ช่องที่ 3 ของโหนด "schema" มาเชื่อมต่อกับ input ของโหนด "sync_db" และ output ช่องที่ 1 ของ โหนด "sync_db" เชื่อมต่อกับโหนด "debug" ซึ่งเป็น text output โดยคลิก inject ที่โหนด "timestamp" หลังจากนั้นสังเกตผลลัพธ์ที่ส่วนของ debug โดยแสดงดังรูป

_images/nodejupytercellexample13.png

เมื่อทำการซิงค์ database สำเร็จ ขั้นตอนต่อมา คือ การสร้าง session เพื่อสื่อสารกับ database โดยเริ่มต้นสร้าง cell ที่ 5 ของไฟล์ "postgresql.ipynb" โดยบรรทัดแรกของ cell ให้กำหนดเป็น comment "Create_a_new_session" เพื่อเกิดเป็นชื่อของ cell ซึ่งฝั่งโหนด "Jupyter Cell" จะเห็นเป็น "5. Create_a_new_session" และเพิ่มโค้ดลงที่อยู่ในรูปลงใน cell แล้วทดลองรัน cell นี้ด้วยการคลิกที่ cell แล้วกดปุ่ม shift+enter จะได้ผลลัพธ์แสดงดังรูป

_images/nodejupytercellexample14.png

ทดลองรัน cell "5. Create_a_new_session" ที่โหนด "Jupyter Cell" ด้วยการใช้ language เป็น "cpu_ram_postgresql" ที่สร้างไว้ก่อนหน้านี้ โดยกำหนด Filename เป็น "postgresql.ipynb" และเลือก Cell ที่มีชื่อว่า "5. Create_a_new_session" หลังจากนั้นเปลี่ยนชื่อของโหนดเป็น "create_session" เพื่อให้ง่ายต่อการใช้งานมากขึ้น ซึ่งแสดงดังรูป

_images/nodejupytercellexample15.png

ลาก output ช่องที่ 3 ของโหนด "sync_db" มาเชื่อมต่อกับ input ของโหนด "create_session" และ output ช่องที่ 1 ของ โหนด "create_session" เชื่อมต่อกับโหนด "debug" ซึ่งเป็น text output โดยคลิก inject ที่โหนด "timestamp" หลังจากนั้นสังเกตผลลัพธ์ที่ส่วนของ debug โดยแสดงดังรูป

_images/nodejupytercellexample16.png

เมื่อสร้าง session สำเร็จ ผู้ใช้สามารถสร้างข้อมูล และเพิ่มข้อมูลลงใน database โดยเริ่มต้นสร้าง cell ที่ 6 ของไฟล์ "postgresql.ipynb" โดยบรรทัดแรกของ cell ให้กำหนดเป็น comment "Insert_Data" เพื่อเกิดเป็นชื่อของ cell ซึ่งฝั่งโหนด "Jupyter Cell" จะเห็นเป็น "6. Insert_Data" และเพิ่มโค้ดลงที่อยู่ในรูปลงใน cell แล้วทดลองรัน cell นี้ด้วยการคลิกที่ cell แล้วกดปุ่ม shift+enter จะได้ผลลัพธ์แสดงดังรูป

_images/nodejupytercellexample17.png

ทดลองรัน cell "6. Insert_Data" ที่โหนด "Jupyter Cell" ด้วยการใช้ language เป็น "cpu_ram_postgresql" ที่สร้างไว้ก่อนหน้านี้ โดยกำหนด Filename เป็น "postgresql.ipynb" และเลือก Cell ที่มีชื่อว่า "6. Insert_Data" หลังจากนั้นเปลี่ยนชื่อของโหนดเป็น "insert_data" เพื่อให้ง่ายต่อการใช้งานมากขึ้น ซึ่งแสดงดังรูป

_images/nodejupytercellexample18.png

ลาก output ช่องที่ 3 ของโหนด "create_session" มาเชื่อมต่อกับ input ของโหนด "insert_data" และ output ช่องที่ 1 ของ โหนด "insert_data" เชื่อมต่อกับโหนด "debug" ซึ่งเป็น text output โดยคลิก inject ที่โหนด "timestamp" หลังจากนั้นสังเกตผลลัพธ์ที่ส่วนของ debug โดยแสดงดังรูป

_images/nodejupytercellexample19.png

ก่อนที่ผู้ใช้จะไปสร้างกราฟแสดงผลบน Grafana ให้ผู้ใช้แก้ไขโหนด timestamp โดยกำหนดให้มีการทำซ้ำทุกๆ 10 วินาที ซึ่งแก้ไขที่หัวข้อ Repeat โดยเลือก interval และแก้ไขเวลาเป็น 10 แสดงดังรูป เพื่อให้โหนด "Jupyter Cell" ส่งข้อมูลไปเก็บใน database ทุกๆ 10 วินาที

_images/nodejupytercellexample20.png

เมื่อผู้ใช้สามารถส่งข้อมูลไปยัง database ได้แล้ว ขั้นตอนต่อมาคือ การสร้างกราฟแสดงผลที่ Grafana โดยเริ่มต้นจากคลิก Grafana แล้วเลือกที่เมนู และคลิก "Connections" ดังรูป เพื่อสร้างการเชื่อมต่อระหว่าง database ที่ใช้งานกับ Grafana

_images/nodejupytercellexample21.png

ขั้นตอนต่อมาคือค้นหา database โดยให้ผู้ใช้ค้นหา database ชื่อ "postgresql" แล้วเลือกที่ PostgreSQL หลังจากนั้นคลิก "Add new data source" ดังรูป

_images/nodejupytercellexample22.png

ขั้นตอนต่อมาคือกรอกรายละเอียดของ database ที่ต้องการเชื่อมต่อกับ grafana โดยให้ผู้ใช้กรอกรายละเอียดดังรูป ซึ่งข้อมูลต่างๆตรงกับข้อมูลที่ใช้ใน library SQLalchemy ที่ส่วนของ Analytic เมื่อผู้ใช้กรอกเสร็จแล้ว สามารถทดสอบการเชื่อมต่อได้ โดยกดปุ่ม Save & test ถ้าสำเร็จขึ้นข้อความ "Database Connection OK" ดังรูป

_images/nodejupytercellexample23.png

เมื่อสร้างการเชื่อมต่อกับ database สำเร็จแล้ว ขั้นตอนต่อมาคือการสร้าง dashboard โดยย้อนกลับไปคลิกที่ปุ่มเมนู แล้วเลือกหัวข้อ Dashboards หลังจากคลิกที่ New แล้วเลือก New dashboard จากนั้นจะขึ้นหน้าจอให้สร้าง dashboard ใหม่ โดยคลิกที่ปุ่ม Add visualization ดังรูป

_images/nodejupytercellexample24.png

ดำเนินการเลือก connection ที่ต้องการ ซึ่งผู้ใช้ได้สร้าง connection ไว้แล้ว โดยมีชื่อว่า "PostgreSQL" ซึ่งให้ผู้ใช้คลิก "PostgreSQL" หลังจากนั้นจะขึ้นหน้าจอให้สร้างกราฟ โดยเริ่มต้นจากการสร้างกราฟการใช้ CPU โดยผู้ใช้สามารถตั้งค่ารายละเอียดต่างๆได้ดังรูป ซึ่งเป็นการดึงข้อมูลจาก column cpu และ created_on จากตาราง ram_cpu_usage นอกจากนี้มีการตั้งค่าชื่อของกราฟเป็น "CPU_Usage"

_images/nodejupytercellexample25.png

เมื่อตั้งค่ารายละเอียดต่างๆของ dashboard สำเร็จแล้ว จะได้ผลลัพธ์ดังรูป

_images/nodejupytercellexample26.png

ขั้นตอนต่อมาเพิ่มกราฟการใช้ RAM ผู้ใช้สามารถตั้งค่ารายละเอียดต่างๆได้ดังรูป ซึ่งเป็นการดึงข้อมูลจาก column cpu และ created_on จากตาราง ram_cpu_usage นอกจากนี้มีการตั้งค่าชื่อของกราฟเป็น "CPU_Usage"

_images/nodejupytercellexample27.png

เมื่อเพิ่มกราฟการใช้ CPU และ RAM สำเร็จ ผู้ใช้จะได้ผลลัพธ์เป็นหน้า Dashboard ดังรูป

_images/nodejupytercellexample28.png