# 梅竹黑客松 ## ML on GCP https://cloud.google.com/blog/products/data-analytics/ml-inference-in-dataflow-pipelines https://cloud.google.com/dataflow/docs/samples/molecules-walkthrough ## Data Studio * [新手教學](https://datastudio.google.com/u/0/reporting/0B5FF6JBKbNJxOWItcWo2SVVVeGc/page/KjD) * [Auto refresh](https://chrome.google.com/webstore/detail/data-studio-auto-refresh/inkgahcdacjcejipadnndepfllmbgoag/related?hl=en) * 1 MWh = 1000 度 * 左上 bending, 右上 robot_welter, 左下 laser_cutting, 右下 laser_shaping 工業用電 1 度約 2.5 元 ### Presentation tips * 把 publish rate 調高,讓 data studio 更新的頻率高一點 ### Moving Average * 在圖中加入參考線,當成是 threshold ```sql= WITH sub AS ( SELECT time_stamp, power_consumption, AVG(power_consumption) OVER( ORDER BY time_stamp ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING ) AS moving_average FROM `duckbubi.machine_power_consumption.realtime` ORDER BY time_stamp DESC LIMIT 100 ) SELECT * FROM sub ORDER BY time_stamp ASC; ``` ### Data Aggregation * 依照小時,將同一個小時的 data aggregate 起來 * 減少 data 的量,就可以呈現歷史紀錄 ```sql= SELECT DATETIME_TRUNC(time_stamp, HOUR) AS hour , SUM(power_consumption) AS power_consumption FROM `duckbubi.machine_power_consumption.bending_raw` GROUP BY hour; ``` ### Threshold ```sql= SELECT power_consumption Median FROM (SELECT a1.time_stamp, a1.power_consumption, COUNT(a1.power_consumption) Rank FROM `duckbubi.machine_power_consumption.realtime` a1, `duckbubi.machine_power_consumption.realtime` a2 WHERE a1.power_consumption < a2.power_consumption OR (a1.power_consumption=a2.power_consumption AND a1.time_stamp <= a2.time_stamp) GROUP BY a1.time_stamp, a1.power_consumption ORDER BY a1.power_consumption desc) a3 WHERE Rank = (SELECT DIV( (COUNT(*)+1)*1 ,4) FROM `duckbubi.machine_power_consumption.realtime`); ``` ### Total Factory Power Consumption by hour ```sql= SELECT DATETIME_TRUNC(`duckbubi.machine_power_consumption.bending_raw`.time_stamp, HOUR) AS hour, SUM(`duckbubi.machine_power_consumption.bending_raw`.power_consumption) AS power_consumption FROM (((`duckbubi.machine_power_consumption.bending_raw` INNER JOIN `duckbubi.machine_power_consumption.laser_cutting_raw` ON `duckbubi.machine_power_consumption.bending_raw`.time_stamp = `duckbubi.machine_power_consumption.laser_cutting_raw`.time_stamp) INNER JOIN `duckbubi.machine_power_consumption.laser_shaping_raw` ON `duckbubi.machine_power_consumption.bending_raw`.time_stamp = `duckbubi.machine_power_consumption.laser_shaping_raw`.time_stamp) INNER JOIN `duckbubi.machine_power_consumption.robot_welter_raw` ON `duckbubi.machine_power_consumption.bending_raw`.time_stamp = `duckbubi.machine_power_consumption.robot_welter_raw`.time_stamp) GROUP BY hour ORDER BY hour; ``` ### Total Factory electricity cost by month ```sql= SELECT DATETIME_TRUNC(`duckbubi.machine_power_consumption.bending_raw`.time_stamp, MONTH) AS month, SUM(`duckbubi.machine_power_consumption.bending_raw`.power_consumption)*1000*2.5 AS power_consumption FROM (((`duckbubi.machine_power_consumption.bending_raw` INNER JOIN `duckbubi.machine_power_consumption.laser_cutting_raw` ON `duckbubi.machine_power_consumption.bending_raw`.time_stamp = `duckbubi.machine_power_consumption.laser_cutting_raw`.time_stamp) INNER JOIN `duckbubi.machine_power_consumption.laser_shaping_raw` ON `duckbubi.machine_power_consumption.bending_raw`.time_stamp = `duckbubi.machine_power_consumption.laser_shaping_raw`.time_stamp) INNER JOIN `duckbubi.machine_power_consumption.robot_welter_raw` ON `duckbubi.machine_power_consumption.bending_raw`.time_stamp = `duckbubi.machine_power_consumption.robot_welter_raw`.time_stamp) GROUP BY month ORDER BY month; ``` ## BigQuery ``` dataset ID : machine_power_consumption ``` schema ``` time_stamp:string, power_consumption:float ``` ```json= { "time_stamp": , "power_consumption": } ``` ### Console command ```shell= bq mk \ --schema time_stamp:DATETIME,power_consumption:float -t machine_power_consumption.bending_raw bq mk \ --schema time_stamp:DATETIME,power_consumption:float -t machine_power_consumption.laser_cutting_raw bq mk \ --schema time_stamp:DATETIME,power_consumption:float -t machine_power_consumption.laser_shaping_raw bq mk \ --schema time_stamp:DATETIME,power_consumption:float -t machine_power_consumption.robot_welter_raw ``` ## Select closest time https://stackoverflow.com/questions/14023145/find-closest-date-in-sql-server ## DataFlow ```shell= gcloud dataflow jobs run fetch-bending --gcs-location gs://dataflow-templates-asia-east1/latest/PubSub_to_BigQuery --region asia-east1 --staging-location gs://duckbubi/bending/ --parameters inputTopic=projects/duckbubi/topics/bending,outputTableSpec=duckbubi:machine_power_consumption.realtime --enable-streaming-engine ``` ### bending ```shell= gcloud dataflow jobs run fetch-bending --gcs-location gs://dataflow-templates-asia-east1/latest/PubSub_to_BigQuery --region asia-east1 --staging-location gs://duckbubi/bending/ --parameters inputTopic=projects/duckbubi/topics/bending,outputTableSpec=duckbubi:machine_power_consumption.bending_raw --enable-streaming-engine ``` ### laser_cutting ```shell= gcloud dataflow jobs run fetch-laser_cutting --gcs-location gs://dataflow-templates-asia-east1/latest/PubSub_to_BigQuery --region asia-east1 --staging-location gs://duckbubi/laser_cutting/ --parameters inputTopic=projects/duckbubi/topics/laser_cutting,outputTableSpec=duckbubi:machine_power_consumption.laser_cutting_raw --enable-streaming-engine ``` ### laser_shaping ```shell= gcloud dataflow jobs run fetch-laser_shaping --gcs-location gs://dataflow-templates-asia-east1/latest/PubSub_to_BigQuery --region asia-east1 --staging-location gs://duckbubi/laser_shaping/ --parameters inputTopic=projects/duckbubi/topics/laser_shaping,outputTableSpec=duckbubi:machine_power_consumption.laser_shaping_raw --enable-streaming-engine ``` ### robot_welter ```shell= gcloud dataflow jobs run fetch-robot_welter --gcs-location gs://dataflow-templates-asia-east1/latest/PubSub_to_BigQuery --region asia-east1 --staging-location gs://duckbubi/robot_welter/ --parameters inputTopic=projects/duckbubi/topics/robot_welter,outputTableSpec=duckbubi:machine_power_consumption.robot_welter_raw --enable-streaming-engine ``` ### enable streaming engine ``` --enable-streaming-engine ```