'如何利用python對物聯網平臺大數據進行分析與預測'

"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

如何利用python對物聯網平臺大數據進行分析與預測

1. 軟硬件系統

出於快速開發考慮,本項目物聯網系統使用了樹莓派硬件及阿里雲邊緣計算技術,通過modbus驅動進行數據採集與上傳,參見《利用阿里雲物聯網邊緣計算功能,快速實現智慧能源監控系統設備接入》。上傳到物聯網平臺的數據通過數據轉化存入RDS數據庫(也可直接通過api從物聯網平臺讀取,本文為提高數據採集效率,採取從數據庫讀入的方式實現。

本文采用了python的數據科學發行版Anaconda,利用Jupyter notebook進行數據分析。這也是數據分析中常用的組合形式。由於數據庫採用了MS SQL Server,因此需要安裝pymssql包進行數據採集。

待採集的數據主要為現場的能源數據,除了總能耗外,分別針對風機、照明、水泵等子系統用能情況進行監控,並對環境的溫溼度等參數進行實時監控與採集。本文僅對各子系統數據進行彙總與簡化分析,以供示範。

"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

如何利用python對物聯網平臺大數據進行分析與預測

1. 軟硬件系統

出於快速開發考慮,本項目物聯網系統使用了樹莓派硬件及阿里雲邊緣計算技術,通過modbus驅動進行數據採集與上傳,參見《利用阿里雲物聯網邊緣計算功能,快速實現智慧能源監控系統設備接入》。上傳到物聯網平臺的數據通過數據轉化存入RDS數據庫(也可直接通過api從物聯網平臺讀取,本文為提高數據採集效率,採取從數據庫讀入的方式實現。

本文采用了python的數據科學發行版Anaconda,利用Jupyter notebook進行數據分析。這也是數據分析中常用的組合形式。由於數據庫採用了MS SQL Server,因此需要安裝pymssql包進行數據採集。

待採集的數據主要為現場的能源數據,除了總能耗外,分別針對風機、照明、水泵等子系統用能情況進行監控,並對環境的溫溼度等參數進行實時監控與採集。本文僅對各子系統數據進行彙總與簡化分析,以供示範。

如何利用python對物聯網平臺大數據進行分析與預測

2. 數據採集與處理

2.1 數據導入

首先導入python針對ms sql server的pymysql包以及數據處理的pandas數據包,按照常規使用pd作為pandas別名。由於物聯網系統採用13位數字的時間戳來進行數據時間標示傳輸,因此需要導入time模塊進行數據轉換。

import pymssql
import pandas as pd
import pandas as pd
import time
conn = pymssql.connect(host=’****.aliyuncs.com:3433′,user=’****’,
password=’****’,database=’***’,charset=’utf8′)
powersql=’SELECT * FROM ***.dbo.***;’ powerdata = pd.read_sql_query(powersql, conn)
#讀取能耗數據
thsql=’SELECT * FROM ***.dbo.***;’ thdata = pd.read_sql_query(thsql, conn)
#讀取環境數據

原始數據的基本情況是這樣。

"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

如何利用python對物聯網平臺大數據進行分析與預測

1. 軟硬件系統

出於快速開發考慮,本項目物聯網系統使用了樹莓派硬件及阿里雲邊緣計算技術,通過modbus驅動進行數據採集與上傳,參見《利用阿里雲物聯網邊緣計算功能,快速實現智慧能源監控系統設備接入》。上傳到物聯網平臺的數據通過數據轉化存入RDS數據庫(也可直接通過api從物聯網平臺讀取,本文為提高數據採集效率,採取從數據庫讀入的方式實現。

本文采用了python的數據科學發行版Anaconda,利用Jupyter notebook進行數據分析。這也是數據分析中常用的組合形式。由於數據庫採用了MS SQL Server,因此需要安裝pymssql包進行數據採集。

待採集的數據主要為現場的能源數據,除了總能耗外,分別針對風機、照明、水泵等子系統用能情況進行監控,並對環境的溫溼度等參數進行實時監控與採集。本文僅對各子系統數據進行彙總與簡化分析,以供示範。

如何利用python對物聯網平臺大數據進行分析與預測

2. 數據採集與處理

2.1 數據導入

首先導入python針對ms sql server的pymysql包以及數據處理的pandas數據包,按照常規使用pd作為pandas別名。由於物聯網系統採用13位數字的時間戳來進行數據時間標示傳輸,因此需要導入time模塊進行數據轉換。

import pymssql
import pandas as pd
import pandas as pd
import time
conn = pymssql.connect(host=’****.aliyuncs.com:3433′,user=’****’,
password=’****’,database=’***’,charset=’utf8′)
powersql=’SELECT * FROM ***.dbo.***;’ powerdata = pd.read_sql_query(powersql, conn)
#讀取能耗數據
thsql=’SELECT * FROM ***.dbo.***;’ thdata = pd.read_sql_query(thsql, conn)
#讀取環境數據

原始數據的基本情況是這樣。

如何利用python對物聯網平臺大數據進行分析與預測

"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

如何利用python對物聯網平臺大數據進行分析與預測

1. 軟硬件系統

出於快速開發考慮,本項目物聯網系統使用了樹莓派硬件及阿里雲邊緣計算技術,通過modbus驅動進行數據採集與上傳,參見《利用阿里雲物聯網邊緣計算功能,快速實現智慧能源監控系統設備接入》。上傳到物聯網平臺的數據通過數據轉化存入RDS數據庫(也可直接通過api從物聯網平臺讀取,本文為提高數據採集效率,採取從數據庫讀入的方式實現。

本文采用了python的數據科學發行版Anaconda,利用Jupyter notebook進行數據分析。這也是數據分析中常用的組合形式。由於數據庫採用了MS SQL Server,因此需要安裝pymssql包進行數據採集。

待採集的數據主要為現場的能源數據,除了總能耗外,分別針對風機、照明、水泵等子系統用能情況進行監控,並對環境的溫溼度等參數進行實時監控與採集。本文僅對各子系統數據進行彙總與簡化分析,以供示範。

如何利用python對物聯網平臺大數據進行分析與預測

2. 數據採集與處理

2.1 數據導入

首先導入python針對ms sql server的pymysql包以及數據處理的pandas數據包,按照常規使用pd作為pandas別名。由於物聯網系統採用13位數字的時間戳來進行數據時間標示傳輸,因此需要導入time模塊進行數據轉換。

import pymssql
import pandas as pd
import pandas as pd
import time
conn = pymssql.connect(host=’****.aliyuncs.com:3433′,user=’****’,
password=’****’,database=’***’,charset=’utf8′)
powersql=’SELECT * FROM ***.dbo.***;’ powerdata = pd.read_sql_query(powersql, conn)
#讀取能耗數據
thsql=’SELECT * FROM ***.dbo.***;’ thdata = pd.read_sql_query(thsql, conn)
#讀取環境數據

原始數據的基本情況是這樣。

如何利用python對物聯網平臺大數據進行分析與預測

如何利用python對物聯網平臺大數據進行分析與預測

2.2 時間戳轉換及數據本地保存

要將13位時間戳數據轉換為date time的數據格式,需要使用python time庫中幾個函數,需要注意的是,這裡轉換的時間格式,對pandas來說仍然只是時間形式的字符串,要真正當作日期時間使用,在後續需要再處理加工一次。

  • time.localtime(x*0.001) 將13位數據時間戳(除以1000以轉換為以秒為單位)轉換為本地時間。
  • 通過time.strftime(“%Y-%m-%d %H:%M:%S”, x)將時間格式化為易讀的格式
  • 在本例子中,使用了python中的lambda匿名函數用於數據的快速處理
  • 為了對整列數據進行處理,使用了python中的map函數,針對pandas整列數據進行處理。
  • 由於部分原始數據缺失,使用了fillna函數進行了簡單的補0處理,當然也可以採用棄用或者其他形式。
  • 使用了pandas的 to_csv函數進行了數據的本地化保存,以免每次處理都需要進行數據庫讀取。
powerdata[‘gmtCreate’] = powerdata[‘gmtCreate’].\\
map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
thdata[‘gmtCreate’] = thdata[‘gmtCreate’].map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
powerdata.fillna(0, inplace=True) #將缺值替換為0,以供數據處理
thdata.fillna(0,inplace=True) #將缺值替換為0,以供數據處理
powerdata.to_csv(“powerdata.csv”) thdata.to_csv(“thdata.csv”)

2.3 數據處理與彙總

#與數據計算相關常量參數 
voltage=0.23
phases=3
dayscycle=7

為了簡化處理,本案例讀取本日之前7天(一週)能耗進行分析,並簡化針對每個設備的分析,而是將數據分類彙總。

  • 採用df.loc[filter]結合過濾器的方式對數據進行切片
  • 過濾器為(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)
#取得今天的時間
today=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()))
#取得七天前的時間
startday=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()-dayscycle*3600*24))
#截取前後段之間的數據 powerdata=powerdata.loc[(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)]
thdata=thdata.loc[(thdata[‘gmtCreate’]>=startday) & (thdata[‘gmtCreate’]<=today)]

上述採取的方法比較簡單粗糙,主要用於說明,在後文中會採用一種更優雅的方式處理數據。即先將時間字符串轉換為pandas的dataframe中日期時間然後之間選擇操作。在時間截取後對數據進行彙總和整理。

  • 利用了列直接相加的方式生成新的列
  • 利用drop方法棄用廢棄列以優化數據
  • 利用pandas的to_datetime方法將時間字符串轉換為日期時間格式
  • 利用set_index方法將默認的數字編號索引修改為以日期時間為索引
powerdata[‘totalpower’]=(powerdata[‘h47’]+powerdata[‘h48’]+powerdata[‘h49’])*voltage #實時總功率
powerdata[‘maintain’]=(powerdata[‘h35’]+powerdata[‘h36’]+powerdata[‘h37’])*voltage*phases #檢修系統實時功率
#…省略其他類似內容
powerdata=powerdata.drop([‘iotId’,’h32′,’h33′,’h34′,’h35′, ‘h36′,’h37′,
’h38′,’h39’, ‘h3A’,’h3B’,’h3C’,’h3D’,’h3E’,’h3F’,’h40′,’h41′,’h42′,
‘h43′,’h44′,’h45′,’h46’, ‘h47′,’h48′,’h49’], axis=1)
powerdata[‘gmtCreate’] = pd.to_datetime(powerdata[‘gmtCreate’])
thdata[‘gmtCreate’] = pd.to_datetime(thdata[‘gmtCreate’])
powerdata.set_index(“gmtCreate”, inplace=True)
thdata.set_index(“gmtCreate”, inplace=True)

整理後的數據示意如下:

"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

如何利用python對物聯網平臺大數據進行分析與預測

1. 軟硬件系統

出於快速開發考慮,本項目物聯網系統使用了樹莓派硬件及阿里雲邊緣計算技術,通過modbus驅動進行數據採集與上傳,參見《利用阿里雲物聯網邊緣計算功能,快速實現智慧能源監控系統設備接入》。上傳到物聯網平臺的數據通過數據轉化存入RDS數據庫(也可直接通過api從物聯網平臺讀取,本文為提高數據採集效率,採取從數據庫讀入的方式實現。

本文采用了python的數據科學發行版Anaconda,利用Jupyter notebook進行數據分析。這也是數據分析中常用的組合形式。由於數據庫採用了MS SQL Server,因此需要安裝pymssql包進行數據採集。

待採集的數據主要為現場的能源數據,除了總能耗外,分別針對風機、照明、水泵等子系統用能情況進行監控,並對環境的溫溼度等參數進行實時監控與採集。本文僅對各子系統數據進行彙總與簡化分析,以供示範。

如何利用python對物聯網平臺大數據進行分析與預測

2. 數據採集與處理

2.1 數據導入

首先導入python針對ms sql server的pymysql包以及數據處理的pandas數據包,按照常規使用pd作為pandas別名。由於物聯網系統採用13位數字的時間戳來進行數據時間標示傳輸,因此需要導入time模塊進行數據轉換。

import pymssql
import pandas as pd
import pandas as pd
import time
conn = pymssql.connect(host=’****.aliyuncs.com:3433′,user=’****’,
password=’****’,database=’***’,charset=’utf8′)
powersql=’SELECT * FROM ***.dbo.***;’ powerdata = pd.read_sql_query(powersql, conn)
#讀取能耗數據
thsql=’SELECT * FROM ***.dbo.***;’ thdata = pd.read_sql_query(thsql, conn)
#讀取環境數據

原始數據的基本情況是這樣。

如何利用python對物聯網平臺大數據進行分析與預測

如何利用python對物聯網平臺大數據進行分析與預測

2.2 時間戳轉換及數據本地保存

要將13位時間戳數據轉換為date time的數據格式,需要使用python time庫中幾個函數,需要注意的是,這裡轉換的時間格式,對pandas來說仍然只是時間形式的字符串,要真正當作日期時間使用,在後續需要再處理加工一次。

  • time.localtime(x*0.001) 將13位數據時間戳(除以1000以轉換為以秒為單位)轉換為本地時間。
  • 通過time.strftime(“%Y-%m-%d %H:%M:%S”, x)將時間格式化為易讀的格式
  • 在本例子中,使用了python中的lambda匿名函數用於數據的快速處理
  • 為了對整列數據進行處理,使用了python中的map函數,針對pandas整列數據進行處理。
  • 由於部分原始數據缺失,使用了fillna函數進行了簡單的補0處理,當然也可以採用棄用或者其他形式。
  • 使用了pandas的 to_csv函數進行了數據的本地化保存,以免每次處理都需要進行數據庫讀取。
powerdata[‘gmtCreate’] = powerdata[‘gmtCreate’].\\
map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
thdata[‘gmtCreate’] = thdata[‘gmtCreate’].map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
powerdata.fillna(0, inplace=True) #將缺值替換為0,以供數據處理
thdata.fillna(0,inplace=True) #將缺值替換為0,以供數據處理
powerdata.to_csv(“powerdata.csv”) thdata.to_csv(“thdata.csv”)

2.3 數據處理與彙總

#與數據計算相關常量參數 
voltage=0.23
phases=3
dayscycle=7

為了簡化處理,本案例讀取本日之前7天(一週)能耗進行分析,並簡化針對每個設備的分析,而是將數據分類彙總。

  • 採用df.loc[filter]結合過濾器的方式對數據進行切片
  • 過濾器為(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)
#取得今天的時間
today=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()))
#取得七天前的時間
startday=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()-dayscycle*3600*24))
#截取前後段之間的數據 powerdata=powerdata.loc[(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)]
thdata=thdata.loc[(thdata[‘gmtCreate’]>=startday) & (thdata[‘gmtCreate’]<=today)]

上述採取的方法比較簡單粗糙,主要用於說明,在後文中會採用一種更優雅的方式處理數據。即先將時間字符串轉換為pandas的dataframe中日期時間然後之間選擇操作。在時間截取後對數據進行彙總和整理。

  • 利用了列直接相加的方式生成新的列
  • 利用drop方法棄用廢棄列以優化數據
  • 利用pandas的to_datetime方法將時間字符串轉換為日期時間格式
  • 利用set_index方法將默認的數字編號索引修改為以日期時間為索引
powerdata[‘totalpower’]=(powerdata[‘h47’]+powerdata[‘h48’]+powerdata[‘h49’])*voltage #實時總功率
powerdata[‘maintain’]=(powerdata[‘h35’]+powerdata[‘h36’]+powerdata[‘h37’])*voltage*phases #檢修系統實時功率
#…省略其他類似內容
powerdata=powerdata.drop([‘iotId’,’h32′,’h33′,’h34′,’h35′, ‘h36′,’h37′,
’h38′,’h39’, ‘h3A’,’h3B’,’h3C’,’h3D’,’h3E’,’h3F’,’h40′,’h41′,’h42′,
‘h43′,’h44′,’h45′,’h46’, ‘h47′,’h48′,’h49’], axis=1)
powerdata[‘gmtCreate’] = pd.to_datetime(powerdata[‘gmtCreate’])
thdata[‘gmtCreate’] = pd.to_datetime(thdata[‘gmtCreate’])
powerdata.set_index(“gmtCreate”, inplace=True)
thdata.set_index(“gmtCreate”, inplace=True)

整理後的數據示意如下:

如何利用python對物聯網平臺大數據進行分析與預測

3. 數據分析與可視化

在整理之後對數據進行簡單的分析與可視化。

  • 採用matplotlib的pyplot來畫圖
  • 採用Jupyter notebook的魔術方法%matplotlib inline 在文件內畫圖
  • 在將日期時間格式化後,採用了powerdata.index.floor(‘H’)方法快速按照小時取平均值,將H改為M,D等可以切換單位
  • 採用groupby方式分類彙總並通過mean快速取每小時平均值,進一步簡化數據,如果要求和則用sum
import matplotlib.pyplot as plt
%matplotlib inline powerdata=powerdata.groupby(powerdata.index.floor(‘H’)).mean()
thdata=thdata.groupby(thdata.index.floor(‘H’)).mean()

實時能耗圖說明。可以看出,用戶用能具備明顯規律性,出現顯著的典型用能尖峰,這是由於用戶目前各子系統運行為人工開啟,運維人員同時開啟各個子系統導致的用能尖峰。

  • – totalpower 實時總功耗
  • – maintain 檢修系統功耗
  • – pumps 水泵系統功耗
  • – lights 照明系統功耗
  • – fans 排風系統功耗
  • – others 其他(消防,控制等系統功耗)
powerdata.plot.line(figsize=(16,12),title=’Real Time Energy Cost’)
plt.show()

通過figsize參數指定畫布大小,通過title指定表名。

"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

如何利用python對物聯網平臺大數據進行分析與預測

1. 軟硬件系統

出於快速開發考慮,本項目物聯網系統使用了樹莓派硬件及阿里雲邊緣計算技術,通過modbus驅動進行數據採集與上傳,參見《利用阿里雲物聯網邊緣計算功能,快速實現智慧能源監控系統設備接入》。上傳到物聯網平臺的數據通過數據轉化存入RDS數據庫(也可直接通過api從物聯網平臺讀取,本文為提高數據採集效率,採取從數據庫讀入的方式實現。

本文采用了python的數據科學發行版Anaconda,利用Jupyter notebook進行數據分析。這也是數據分析中常用的組合形式。由於數據庫採用了MS SQL Server,因此需要安裝pymssql包進行數據採集。

待採集的數據主要為現場的能源數據,除了總能耗外,分別針對風機、照明、水泵等子系統用能情況進行監控,並對環境的溫溼度等參數進行實時監控與採集。本文僅對各子系統數據進行彙總與簡化分析,以供示範。

如何利用python對物聯網平臺大數據進行分析與預測

2. 數據採集與處理

2.1 數據導入

首先導入python針對ms sql server的pymysql包以及數據處理的pandas數據包,按照常規使用pd作為pandas別名。由於物聯網系統採用13位數字的時間戳來進行數據時間標示傳輸,因此需要導入time模塊進行數據轉換。

import pymssql
import pandas as pd
import pandas as pd
import time
conn = pymssql.connect(host=’****.aliyuncs.com:3433′,user=’****’,
password=’****’,database=’***’,charset=’utf8′)
powersql=’SELECT * FROM ***.dbo.***;’ powerdata = pd.read_sql_query(powersql, conn)
#讀取能耗數據
thsql=’SELECT * FROM ***.dbo.***;’ thdata = pd.read_sql_query(thsql, conn)
#讀取環境數據

原始數據的基本情況是這樣。

如何利用python對物聯網平臺大數據進行分析與預測

如何利用python對物聯網平臺大數據進行分析與預測

2.2 時間戳轉換及數據本地保存

要將13位時間戳數據轉換為date time的數據格式,需要使用python time庫中幾個函數,需要注意的是,這裡轉換的時間格式,對pandas來說仍然只是時間形式的字符串,要真正當作日期時間使用,在後續需要再處理加工一次。

  • time.localtime(x*0.001) 將13位數據時間戳(除以1000以轉換為以秒為單位)轉換為本地時間。
  • 通過time.strftime(“%Y-%m-%d %H:%M:%S”, x)將時間格式化為易讀的格式
  • 在本例子中,使用了python中的lambda匿名函數用於數據的快速處理
  • 為了對整列數據進行處理,使用了python中的map函數,針對pandas整列數據進行處理。
  • 由於部分原始數據缺失,使用了fillna函數進行了簡單的補0處理,當然也可以採用棄用或者其他形式。
  • 使用了pandas的 to_csv函數進行了數據的本地化保存,以免每次處理都需要進行數據庫讀取。
powerdata[‘gmtCreate’] = powerdata[‘gmtCreate’].\\
map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
thdata[‘gmtCreate’] = thdata[‘gmtCreate’].map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
powerdata.fillna(0, inplace=True) #將缺值替換為0,以供數據處理
thdata.fillna(0,inplace=True) #將缺值替換為0,以供數據處理
powerdata.to_csv(“powerdata.csv”) thdata.to_csv(“thdata.csv”)

2.3 數據處理與彙總

#與數據計算相關常量參數 
voltage=0.23
phases=3
dayscycle=7

為了簡化處理,本案例讀取本日之前7天(一週)能耗進行分析,並簡化針對每個設備的分析,而是將數據分類彙總。

  • 採用df.loc[filter]結合過濾器的方式對數據進行切片
  • 過濾器為(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)
#取得今天的時間
today=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()))
#取得七天前的時間
startday=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()-dayscycle*3600*24))
#截取前後段之間的數據 powerdata=powerdata.loc[(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)]
thdata=thdata.loc[(thdata[‘gmtCreate’]>=startday) & (thdata[‘gmtCreate’]<=today)]

上述採取的方法比較簡單粗糙,主要用於說明,在後文中會採用一種更優雅的方式處理數據。即先將時間字符串轉換為pandas的dataframe中日期時間然後之間選擇操作。在時間截取後對數據進行彙總和整理。

  • 利用了列直接相加的方式生成新的列
  • 利用drop方法棄用廢棄列以優化數據
  • 利用pandas的to_datetime方法將時間字符串轉換為日期時間格式
  • 利用set_index方法將默認的數字編號索引修改為以日期時間為索引
powerdata[‘totalpower’]=(powerdata[‘h47’]+powerdata[‘h48’]+powerdata[‘h49’])*voltage #實時總功率
powerdata[‘maintain’]=(powerdata[‘h35’]+powerdata[‘h36’]+powerdata[‘h37’])*voltage*phases #檢修系統實時功率
#…省略其他類似內容
powerdata=powerdata.drop([‘iotId’,’h32′,’h33′,’h34′,’h35′, ‘h36′,’h37′,
’h38′,’h39’, ‘h3A’,’h3B’,’h3C’,’h3D’,’h3E’,’h3F’,’h40′,’h41′,’h42′,
‘h43′,’h44′,’h45′,’h46’, ‘h47′,’h48′,’h49’], axis=1)
powerdata[‘gmtCreate’] = pd.to_datetime(powerdata[‘gmtCreate’])
thdata[‘gmtCreate’] = pd.to_datetime(thdata[‘gmtCreate’])
powerdata.set_index(“gmtCreate”, inplace=True)
thdata.set_index(“gmtCreate”, inplace=True)

整理後的數據示意如下:

如何利用python對物聯網平臺大數據進行分析與預測

3. 數據分析與可視化

在整理之後對數據進行簡單的分析與可視化。

  • 採用matplotlib的pyplot來畫圖
  • 採用Jupyter notebook的魔術方法%matplotlib inline 在文件內畫圖
  • 在將日期時間格式化後,採用了powerdata.index.floor(‘H’)方法快速按照小時取平均值,將H改為M,D等可以切換單位
  • 採用groupby方式分類彙總並通過mean快速取每小時平均值,進一步簡化數據,如果要求和則用sum
import matplotlib.pyplot as plt
%matplotlib inline powerdata=powerdata.groupby(powerdata.index.floor(‘H’)).mean()
thdata=thdata.groupby(thdata.index.floor(‘H’)).mean()

實時能耗圖說明。可以看出,用戶用能具備明顯規律性,出現顯著的典型用能尖峰,這是由於用戶目前各子系統運行為人工開啟,運維人員同時開啟各個子系統導致的用能尖峰。

  • – totalpower 實時總功耗
  • – maintain 檢修系統功耗
  • – pumps 水泵系統功耗
  • – lights 照明系統功耗
  • – fans 排風系統功耗
  • – others 其他(消防,控制等系統功耗)
powerdata.plot.line(figsize=(16,12),title=’Real Time Energy Cost’)
plt.show()

通過figsize參數指定畫布大小,通過title指定表名。

如何利用python對物聯網平臺大數據進行分析與預測

作為補充,截取一天的用能數據生成典型日用能詳圖。

powerdata.loc[(powerdata.index>=’2019-08-06 00:00:00′)&(powerdata.\\
index<=’2019-08-06 23:59:59′)].plot.line(figsize=(16,12),title=’Typical Day’)
plt.show()
"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

如何利用python對物聯網平臺大數據進行分析與預測

1. 軟硬件系統

出於快速開發考慮,本項目物聯網系統使用了樹莓派硬件及阿里雲邊緣計算技術,通過modbus驅動進行數據採集與上傳,參見《利用阿里雲物聯網邊緣計算功能,快速實現智慧能源監控系統設備接入》。上傳到物聯網平臺的數據通過數據轉化存入RDS數據庫(也可直接通過api從物聯網平臺讀取,本文為提高數據採集效率,採取從數據庫讀入的方式實現。

本文采用了python的數據科學發行版Anaconda,利用Jupyter notebook進行數據分析。這也是數據分析中常用的組合形式。由於數據庫採用了MS SQL Server,因此需要安裝pymssql包進行數據採集。

待採集的數據主要為現場的能源數據,除了總能耗外,分別針對風機、照明、水泵等子系統用能情況進行監控,並對環境的溫溼度等參數進行實時監控與採集。本文僅對各子系統數據進行彙總與簡化分析,以供示範。

如何利用python對物聯網平臺大數據進行分析與預測

2. 數據採集與處理

2.1 數據導入

首先導入python針對ms sql server的pymysql包以及數據處理的pandas數據包,按照常規使用pd作為pandas別名。由於物聯網系統採用13位數字的時間戳來進行數據時間標示傳輸,因此需要導入time模塊進行數據轉換。

import pymssql
import pandas as pd
import pandas as pd
import time
conn = pymssql.connect(host=’****.aliyuncs.com:3433′,user=’****’,
password=’****’,database=’***’,charset=’utf8′)
powersql=’SELECT * FROM ***.dbo.***;’ powerdata = pd.read_sql_query(powersql, conn)
#讀取能耗數據
thsql=’SELECT * FROM ***.dbo.***;’ thdata = pd.read_sql_query(thsql, conn)
#讀取環境數據

原始數據的基本情況是這樣。

如何利用python對物聯網平臺大數據進行分析與預測

如何利用python對物聯網平臺大數據進行分析與預測

2.2 時間戳轉換及數據本地保存

要將13位時間戳數據轉換為date time的數據格式,需要使用python time庫中幾個函數,需要注意的是,這裡轉換的時間格式,對pandas來說仍然只是時間形式的字符串,要真正當作日期時間使用,在後續需要再處理加工一次。

  • time.localtime(x*0.001) 將13位數據時間戳(除以1000以轉換為以秒為單位)轉換為本地時間。
  • 通過time.strftime(“%Y-%m-%d %H:%M:%S”, x)將時間格式化為易讀的格式
  • 在本例子中,使用了python中的lambda匿名函數用於數據的快速處理
  • 為了對整列數據進行處理,使用了python中的map函數,針對pandas整列數據進行處理。
  • 由於部分原始數據缺失,使用了fillna函數進行了簡單的補0處理,當然也可以採用棄用或者其他形式。
  • 使用了pandas的 to_csv函數進行了數據的本地化保存,以免每次處理都需要進行數據庫讀取。
powerdata[‘gmtCreate’] = powerdata[‘gmtCreate’].\\
map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
thdata[‘gmtCreate’] = thdata[‘gmtCreate’].map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
powerdata.fillna(0, inplace=True) #將缺值替換為0,以供數據處理
thdata.fillna(0,inplace=True) #將缺值替換為0,以供數據處理
powerdata.to_csv(“powerdata.csv”) thdata.to_csv(“thdata.csv”)

2.3 數據處理與彙總

#與數據計算相關常量參數 
voltage=0.23
phases=3
dayscycle=7

為了簡化處理,本案例讀取本日之前7天(一週)能耗進行分析,並簡化針對每個設備的分析,而是將數據分類彙總。

  • 採用df.loc[filter]結合過濾器的方式對數據進行切片
  • 過濾器為(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)
#取得今天的時間
today=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()))
#取得七天前的時間
startday=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()-dayscycle*3600*24))
#截取前後段之間的數據 powerdata=powerdata.loc[(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)]
thdata=thdata.loc[(thdata[‘gmtCreate’]>=startday) & (thdata[‘gmtCreate’]<=today)]

上述採取的方法比較簡單粗糙,主要用於說明,在後文中會採用一種更優雅的方式處理數據。即先將時間字符串轉換為pandas的dataframe中日期時間然後之間選擇操作。在時間截取後對數據進行彙總和整理。

  • 利用了列直接相加的方式生成新的列
  • 利用drop方法棄用廢棄列以優化數據
  • 利用pandas的to_datetime方法將時間字符串轉換為日期時間格式
  • 利用set_index方法將默認的數字編號索引修改為以日期時間為索引
powerdata[‘totalpower’]=(powerdata[‘h47’]+powerdata[‘h48’]+powerdata[‘h49’])*voltage #實時總功率
powerdata[‘maintain’]=(powerdata[‘h35’]+powerdata[‘h36’]+powerdata[‘h37’])*voltage*phases #檢修系統實時功率
#…省略其他類似內容
powerdata=powerdata.drop([‘iotId’,’h32′,’h33′,’h34′,’h35′, ‘h36′,’h37′,
’h38′,’h39’, ‘h3A’,’h3B’,’h3C’,’h3D’,’h3E’,’h3F’,’h40′,’h41′,’h42′,
‘h43′,’h44′,’h45′,’h46’, ‘h47′,’h48′,’h49’], axis=1)
powerdata[‘gmtCreate’] = pd.to_datetime(powerdata[‘gmtCreate’])
thdata[‘gmtCreate’] = pd.to_datetime(thdata[‘gmtCreate’])
powerdata.set_index(“gmtCreate”, inplace=True)
thdata.set_index(“gmtCreate”, inplace=True)

整理後的數據示意如下:

如何利用python對物聯網平臺大數據進行分析與預測

3. 數據分析與可視化

在整理之後對數據進行簡單的分析與可視化。

  • 採用matplotlib的pyplot來畫圖
  • 採用Jupyter notebook的魔術方法%matplotlib inline 在文件內畫圖
  • 在將日期時間格式化後,採用了powerdata.index.floor(‘H’)方法快速按照小時取平均值,將H改為M,D等可以切換單位
  • 採用groupby方式分類彙總並通過mean快速取每小時平均值,進一步簡化數據,如果要求和則用sum
import matplotlib.pyplot as plt
%matplotlib inline powerdata=powerdata.groupby(powerdata.index.floor(‘H’)).mean()
thdata=thdata.groupby(thdata.index.floor(‘H’)).mean()

實時能耗圖說明。可以看出,用戶用能具備明顯規律性,出現顯著的典型用能尖峰,這是由於用戶目前各子系統運行為人工開啟,運維人員同時開啟各個子系統導致的用能尖峰。

  • – totalpower 實時總功耗
  • – maintain 檢修系統功耗
  • – pumps 水泵系統功耗
  • – lights 照明系統功耗
  • – fans 排風系統功耗
  • – others 其他(消防,控制等系統功耗)
powerdata.plot.line(figsize=(16,12),title=’Real Time Energy Cost’)
plt.show()

通過figsize參數指定畫布大小,通過title指定表名。

如何利用python對物聯網平臺大數據進行分析與預測

作為補充,截取一天的用能數據生成典型日用能詳圖。

powerdata.loc[(powerdata.index>=’2019-08-06 00:00:00′)&(powerdata.\\
index<=’2019-08-06 23:59:59′)].plot.line(figsize=(16,12),title=’Typical Day’)
plt.show()
如何利用python對物聯網平臺大數據進行分析與預測

常用的曲線除了曲線圖外,還有柱狀圖,以下兩張分別為按日和彙總的用能分類圖。

powerdata.groupby(powerdata.index.floor(‘D’)).sum().plot.bar(figsize=(16,12),title=’Daily Energy Cost’) plt.show() 
"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

如何利用python對物聯網平臺大數據進行分析與預測

1. 軟硬件系統

出於快速開發考慮,本項目物聯網系統使用了樹莓派硬件及阿里雲邊緣計算技術,通過modbus驅動進行數據採集與上傳,參見《利用阿里雲物聯網邊緣計算功能,快速實現智慧能源監控系統設備接入》。上傳到物聯網平臺的數據通過數據轉化存入RDS數據庫(也可直接通過api從物聯網平臺讀取,本文為提高數據採集效率,採取從數據庫讀入的方式實現。

本文采用了python的數據科學發行版Anaconda,利用Jupyter notebook進行數據分析。這也是數據分析中常用的組合形式。由於數據庫採用了MS SQL Server,因此需要安裝pymssql包進行數據採集。

待採集的數據主要為現場的能源數據,除了總能耗外,分別針對風機、照明、水泵等子系統用能情況進行監控,並對環境的溫溼度等參數進行實時監控與採集。本文僅對各子系統數據進行彙總與簡化分析,以供示範。

如何利用python對物聯網平臺大數據進行分析與預測

2. 數據採集與處理

2.1 數據導入

首先導入python針對ms sql server的pymysql包以及數據處理的pandas數據包,按照常規使用pd作為pandas別名。由於物聯網系統採用13位數字的時間戳來進行數據時間標示傳輸,因此需要導入time模塊進行數據轉換。

import pymssql
import pandas as pd
import pandas as pd
import time
conn = pymssql.connect(host=’****.aliyuncs.com:3433′,user=’****’,
password=’****’,database=’***’,charset=’utf8′)
powersql=’SELECT * FROM ***.dbo.***;’ powerdata = pd.read_sql_query(powersql, conn)
#讀取能耗數據
thsql=’SELECT * FROM ***.dbo.***;’ thdata = pd.read_sql_query(thsql, conn)
#讀取環境數據

原始數據的基本情況是這樣。

如何利用python對物聯網平臺大數據進行分析與預測

如何利用python對物聯網平臺大數據進行分析與預測

2.2 時間戳轉換及數據本地保存

要將13位時間戳數據轉換為date time的數據格式,需要使用python time庫中幾個函數,需要注意的是,這裡轉換的時間格式,對pandas來說仍然只是時間形式的字符串,要真正當作日期時間使用,在後續需要再處理加工一次。

  • time.localtime(x*0.001) 將13位數據時間戳(除以1000以轉換為以秒為單位)轉換為本地時間。
  • 通過time.strftime(“%Y-%m-%d %H:%M:%S”, x)將時間格式化為易讀的格式
  • 在本例子中,使用了python中的lambda匿名函數用於數據的快速處理
  • 為了對整列數據進行處理,使用了python中的map函數,針對pandas整列數據進行處理。
  • 由於部分原始數據缺失,使用了fillna函數進行了簡單的補0處理,當然也可以採用棄用或者其他形式。
  • 使用了pandas的 to_csv函數進行了數據的本地化保存,以免每次處理都需要進行數據庫讀取。
powerdata[‘gmtCreate’] = powerdata[‘gmtCreate’].\\
map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
thdata[‘gmtCreate’] = thdata[‘gmtCreate’].map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
powerdata.fillna(0, inplace=True) #將缺值替換為0,以供數據處理
thdata.fillna(0,inplace=True) #將缺值替換為0,以供數據處理
powerdata.to_csv(“powerdata.csv”) thdata.to_csv(“thdata.csv”)

2.3 數據處理與彙總

#與數據計算相關常量參數 
voltage=0.23
phases=3
dayscycle=7

為了簡化處理,本案例讀取本日之前7天(一週)能耗進行分析,並簡化針對每個設備的分析,而是將數據分類彙總。

  • 採用df.loc[filter]結合過濾器的方式對數據進行切片
  • 過濾器為(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)
#取得今天的時間
today=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()))
#取得七天前的時間
startday=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()-dayscycle*3600*24))
#截取前後段之間的數據 powerdata=powerdata.loc[(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)]
thdata=thdata.loc[(thdata[‘gmtCreate’]>=startday) & (thdata[‘gmtCreate’]<=today)]

上述採取的方法比較簡單粗糙,主要用於說明,在後文中會採用一種更優雅的方式處理數據。即先將時間字符串轉換為pandas的dataframe中日期時間然後之間選擇操作。在時間截取後對數據進行彙總和整理。

  • 利用了列直接相加的方式生成新的列
  • 利用drop方法棄用廢棄列以優化數據
  • 利用pandas的to_datetime方法將時間字符串轉換為日期時間格式
  • 利用set_index方法將默認的數字編號索引修改為以日期時間為索引
powerdata[‘totalpower’]=(powerdata[‘h47’]+powerdata[‘h48’]+powerdata[‘h49’])*voltage #實時總功率
powerdata[‘maintain’]=(powerdata[‘h35’]+powerdata[‘h36’]+powerdata[‘h37’])*voltage*phases #檢修系統實時功率
#…省略其他類似內容
powerdata=powerdata.drop([‘iotId’,’h32′,’h33′,’h34′,’h35′, ‘h36′,’h37′,
’h38′,’h39’, ‘h3A’,’h3B’,’h3C’,’h3D’,’h3E’,’h3F’,’h40′,’h41′,’h42′,
‘h43′,’h44′,’h45′,’h46’, ‘h47′,’h48′,’h49’], axis=1)
powerdata[‘gmtCreate’] = pd.to_datetime(powerdata[‘gmtCreate’])
thdata[‘gmtCreate’] = pd.to_datetime(thdata[‘gmtCreate’])
powerdata.set_index(“gmtCreate”, inplace=True)
thdata.set_index(“gmtCreate”, inplace=True)

整理後的數據示意如下:

如何利用python對物聯網平臺大數據進行分析與預測

3. 數據分析與可視化

在整理之後對數據進行簡單的分析與可視化。

  • 採用matplotlib的pyplot來畫圖
  • 採用Jupyter notebook的魔術方法%matplotlib inline 在文件內畫圖
  • 在將日期時間格式化後,採用了powerdata.index.floor(‘H’)方法快速按照小時取平均值,將H改為M,D等可以切換單位
  • 採用groupby方式分類彙總並通過mean快速取每小時平均值,進一步簡化數據,如果要求和則用sum
import matplotlib.pyplot as plt
%matplotlib inline powerdata=powerdata.groupby(powerdata.index.floor(‘H’)).mean()
thdata=thdata.groupby(thdata.index.floor(‘H’)).mean()

實時能耗圖說明。可以看出,用戶用能具備明顯規律性,出現顯著的典型用能尖峰,這是由於用戶目前各子系統運行為人工開啟,運維人員同時開啟各個子系統導致的用能尖峰。

  • – totalpower 實時總功耗
  • – maintain 檢修系統功耗
  • – pumps 水泵系統功耗
  • – lights 照明系統功耗
  • – fans 排風系統功耗
  • – others 其他(消防,控制等系統功耗)
powerdata.plot.line(figsize=(16,12),title=’Real Time Energy Cost’)
plt.show()

通過figsize參數指定畫布大小,通過title指定表名。

如何利用python對物聯網平臺大數據進行分析與預測

作為補充,截取一天的用能數據生成典型日用能詳圖。

powerdata.loc[(powerdata.index>=’2019-08-06 00:00:00′)&(powerdata.\\
index<=’2019-08-06 23:59:59′)].plot.line(figsize=(16,12),title=’Typical Day’)
plt.show()
如何利用python對物聯網平臺大數據進行分析與預測

常用的曲線除了曲線圖外,還有柱狀圖,以下兩張分別為按日和彙總的用能分類圖。

powerdata.groupby(powerdata.index.floor(‘D’)).sum().plot.bar(figsize=(16,12),title=’Daily Energy Cost’) plt.show() 
如何利用python對物聯網平臺大數據進行分析與預測

powerdata.sum().plot.bar(figsize=(16,12),title=’Total Energy Cost’) plt.show()

"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

如何利用python對物聯網平臺大數據進行分析與預測

1. 軟硬件系統

出於快速開發考慮,本項目物聯網系統使用了樹莓派硬件及阿里雲邊緣計算技術,通過modbus驅動進行數據採集與上傳,參見《利用阿里雲物聯網邊緣計算功能,快速實現智慧能源監控系統設備接入》。上傳到物聯網平臺的數據通過數據轉化存入RDS數據庫(也可直接通過api從物聯網平臺讀取,本文為提高數據採集效率,採取從數據庫讀入的方式實現。

本文采用了python的數據科學發行版Anaconda,利用Jupyter notebook進行數據分析。這也是數據分析中常用的組合形式。由於數據庫採用了MS SQL Server,因此需要安裝pymssql包進行數據採集。

待採集的數據主要為現場的能源數據,除了總能耗外,分別針對風機、照明、水泵等子系統用能情況進行監控,並對環境的溫溼度等參數進行實時監控與採集。本文僅對各子系統數據進行彙總與簡化分析,以供示範。

如何利用python對物聯網平臺大數據進行分析與預測

2. 數據採集與處理

2.1 數據導入

首先導入python針對ms sql server的pymysql包以及數據處理的pandas數據包,按照常規使用pd作為pandas別名。由於物聯網系統採用13位數字的時間戳來進行數據時間標示傳輸,因此需要導入time模塊進行數據轉換。

import pymssql
import pandas as pd
import pandas as pd
import time
conn = pymssql.connect(host=’****.aliyuncs.com:3433′,user=’****’,
password=’****’,database=’***’,charset=’utf8′)
powersql=’SELECT * FROM ***.dbo.***;’ powerdata = pd.read_sql_query(powersql, conn)
#讀取能耗數據
thsql=’SELECT * FROM ***.dbo.***;’ thdata = pd.read_sql_query(thsql, conn)
#讀取環境數據

原始數據的基本情況是這樣。

如何利用python對物聯網平臺大數據進行分析與預測

如何利用python對物聯網平臺大數據進行分析與預測

2.2 時間戳轉換及數據本地保存

要將13位時間戳數據轉換為date time的數據格式,需要使用python time庫中幾個函數,需要注意的是,這裡轉換的時間格式,對pandas來說仍然只是時間形式的字符串,要真正當作日期時間使用,在後續需要再處理加工一次。

  • time.localtime(x*0.001) 將13位數據時間戳(除以1000以轉換為以秒為單位)轉換為本地時間。
  • 通過time.strftime(“%Y-%m-%d %H:%M:%S”, x)將時間格式化為易讀的格式
  • 在本例子中,使用了python中的lambda匿名函數用於數據的快速處理
  • 為了對整列數據進行處理,使用了python中的map函數,針對pandas整列數據進行處理。
  • 由於部分原始數據缺失,使用了fillna函數進行了簡單的補0處理,當然也可以採用棄用或者其他形式。
  • 使用了pandas的 to_csv函數進行了數據的本地化保存,以免每次處理都需要進行數據庫讀取。
powerdata[‘gmtCreate’] = powerdata[‘gmtCreate’].\\
map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
thdata[‘gmtCreate’] = thdata[‘gmtCreate’].map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
powerdata.fillna(0, inplace=True) #將缺值替換為0,以供數據處理
thdata.fillna(0,inplace=True) #將缺值替換為0,以供數據處理
powerdata.to_csv(“powerdata.csv”) thdata.to_csv(“thdata.csv”)

2.3 數據處理與彙總

#與數據計算相關常量參數 
voltage=0.23
phases=3
dayscycle=7

為了簡化處理,本案例讀取本日之前7天(一週)能耗進行分析,並簡化針對每個設備的分析,而是將數據分類彙總。

  • 採用df.loc[filter]結合過濾器的方式對數據進行切片
  • 過濾器為(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)
#取得今天的時間
today=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()))
#取得七天前的時間
startday=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()-dayscycle*3600*24))
#截取前後段之間的數據 powerdata=powerdata.loc[(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)]
thdata=thdata.loc[(thdata[‘gmtCreate’]>=startday) & (thdata[‘gmtCreate’]<=today)]

上述採取的方法比較簡單粗糙,主要用於說明,在後文中會採用一種更優雅的方式處理數據。即先將時間字符串轉換為pandas的dataframe中日期時間然後之間選擇操作。在時間截取後對數據進行彙總和整理。

  • 利用了列直接相加的方式生成新的列
  • 利用drop方法棄用廢棄列以優化數據
  • 利用pandas的to_datetime方法將時間字符串轉換為日期時間格式
  • 利用set_index方法將默認的數字編號索引修改為以日期時間為索引
powerdata[‘totalpower’]=(powerdata[‘h47’]+powerdata[‘h48’]+powerdata[‘h49’])*voltage #實時總功率
powerdata[‘maintain’]=(powerdata[‘h35’]+powerdata[‘h36’]+powerdata[‘h37’])*voltage*phases #檢修系統實時功率
#…省略其他類似內容
powerdata=powerdata.drop([‘iotId’,’h32′,’h33′,’h34′,’h35′, ‘h36′,’h37′,
’h38′,’h39’, ‘h3A’,’h3B’,’h3C’,’h3D’,’h3E’,’h3F’,’h40′,’h41′,’h42′,
‘h43′,’h44′,’h45′,’h46’, ‘h47′,’h48′,’h49’], axis=1)
powerdata[‘gmtCreate’] = pd.to_datetime(powerdata[‘gmtCreate’])
thdata[‘gmtCreate’] = pd.to_datetime(thdata[‘gmtCreate’])
powerdata.set_index(“gmtCreate”, inplace=True)
thdata.set_index(“gmtCreate”, inplace=True)

整理後的數據示意如下:

如何利用python對物聯網平臺大數據進行分析與預測

3. 數據分析與可視化

在整理之後對數據進行簡單的分析與可視化。

  • 採用matplotlib的pyplot來畫圖
  • 採用Jupyter notebook的魔術方法%matplotlib inline 在文件內畫圖
  • 在將日期時間格式化後,採用了powerdata.index.floor(‘H’)方法快速按照小時取平均值,將H改為M,D等可以切換單位
  • 採用groupby方式分類彙總並通過mean快速取每小時平均值,進一步簡化數據,如果要求和則用sum
import matplotlib.pyplot as plt
%matplotlib inline powerdata=powerdata.groupby(powerdata.index.floor(‘H’)).mean()
thdata=thdata.groupby(thdata.index.floor(‘H’)).mean()

實時能耗圖說明。可以看出,用戶用能具備明顯規律性,出現顯著的典型用能尖峰,這是由於用戶目前各子系統運行為人工開啟,運維人員同時開啟各個子系統導致的用能尖峰。

  • – totalpower 實時總功耗
  • – maintain 檢修系統功耗
  • – pumps 水泵系統功耗
  • – lights 照明系統功耗
  • – fans 排風系統功耗
  • – others 其他(消防,控制等系統功耗)
powerdata.plot.line(figsize=(16,12),title=’Real Time Energy Cost’)
plt.show()

通過figsize參數指定畫布大小,通過title指定表名。

如何利用python對物聯網平臺大數據進行分析與預測

作為補充,截取一天的用能數據生成典型日用能詳圖。

powerdata.loc[(powerdata.index>=’2019-08-06 00:00:00′)&(powerdata.\\
index<=’2019-08-06 23:59:59′)].plot.line(figsize=(16,12),title=’Typical Day’)
plt.show()
如何利用python對物聯網平臺大數據進行分析與預測

常用的曲線除了曲線圖外,還有柱狀圖,以下兩張分別為按日和彙總的用能分類圖。

powerdata.groupby(powerdata.index.floor(‘D’)).sum().plot.bar(figsize=(16,12),title=’Daily Energy Cost’) plt.show() 
如何利用python對物聯網平臺大數據進行分析與預測

powerdata.sum().plot.bar(figsize=(16,12),title=’Total Energy Cost’) plt.show()

如何利用python對物聯網平臺大數據進行分析與預測

最後,對用戶用能的具體數據進行簡單彙總。

print(‘上週總用能約為 %.2f kWh.’%powerdata[‘totalpower’].sum())
print(‘其中:’) print(‘檢修子系統用能約 %.2f kWh,’%powerdata[‘maintain’].sum())
print(‘水泵子系統用能約 %.2f kWh,’%powerdata[‘pumps’].sum())
print(‘照明子系統用能約 %.2f kWh,’%powerdata[‘lights’].sum())
print(‘通風子系統用能約 %.2f kWh,’%powerdata[‘fans’].sum())
print(‘消防等其他用能約 %.2f kWh,’%powerdata[‘others’].sum())

此外,pandas也內置了簡單方便而全面的統計函數describe。

powerdata.describe() 
"

物聯網技術讓萬物互聯的同時,也為我們帶來海量的數據,但是,如何對這些海量數據進行整理、分析,使數據切實產生價值,就成了迫切需要解決的問題。海量數據可以為用戶帶來的益處包括提高效率、降低成本、提高安全性等等,但這些益處都需要通過數據科學和人工智能技術進行發掘,才能進行應用。本文以一套應用於城市能源監控的物聯網系統數據為例,通過python數據分析平臺對數據進行基礎的分析與預測。

如何利用python對物聯網平臺大數據進行分析與預測

1. 軟硬件系統

出於快速開發考慮,本項目物聯網系統使用了樹莓派硬件及阿里雲邊緣計算技術,通過modbus驅動進行數據採集與上傳,參見《利用阿里雲物聯網邊緣計算功能,快速實現智慧能源監控系統設備接入》。上傳到物聯網平臺的數據通過數據轉化存入RDS數據庫(也可直接通過api從物聯網平臺讀取,本文為提高數據採集效率,採取從數據庫讀入的方式實現。

本文采用了python的數據科學發行版Anaconda,利用Jupyter notebook進行數據分析。這也是數據分析中常用的組合形式。由於數據庫採用了MS SQL Server,因此需要安裝pymssql包進行數據採集。

待採集的數據主要為現場的能源數據,除了總能耗外,分別針對風機、照明、水泵等子系統用能情況進行監控,並對環境的溫溼度等參數進行實時監控與採集。本文僅對各子系統數據進行彙總與簡化分析,以供示範。

如何利用python對物聯網平臺大數據進行分析與預測

2. 數據採集與處理

2.1 數據導入

首先導入python針對ms sql server的pymysql包以及數據處理的pandas數據包,按照常規使用pd作為pandas別名。由於物聯網系統採用13位數字的時間戳來進行數據時間標示傳輸,因此需要導入time模塊進行數據轉換。

import pymssql
import pandas as pd
import pandas as pd
import time
conn = pymssql.connect(host=’****.aliyuncs.com:3433′,user=’****’,
password=’****’,database=’***’,charset=’utf8′)
powersql=’SELECT * FROM ***.dbo.***;’ powerdata = pd.read_sql_query(powersql, conn)
#讀取能耗數據
thsql=’SELECT * FROM ***.dbo.***;’ thdata = pd.read_sql_query(thsql, conn)
#讀取環境數據

原始數據的基本情況是這樣。

如何利用python對物聯網平臺大數據進行分析與預測

如何利用python對物聯網平臺大數據進行分析與預測

2.2 時間戳轉換及數據本地保存

要將13位時間戳數據轉換為date time的數據格式,需要使用python time庫中幾個函數,需要注意的是,這裡轉換的時間格式,對pandas來說仍然只是時間形式的字符串,要真正當作日期時間使用,在後續需要再處理加工一次。

  • time.localtime(x*0.001) 將13位數據時間戳(除以1000以轉換為以秒為單位)轉換為本地時間。
  • 通過time.strftime(“%Y-%m-%d %H:%M:%S”, x)將時間格式化為易讀的格式
  • 在本例子中,使用了python中的lambda匿名函數用於數據的快速處理
  • 為了對整列數據進行處理,使用了python中的map函數,針對pandas整列數據進行處理。
  • 由於部分原始數據缺失,使用了fillna函數進行了簡單的補0處理,當然也可以採用棄用或者其他形式。
  • 使用了pandas的 to_csv函數進行了數據的本地化保存,以免每次處理都需要進行數據庫讀取。
powerdata[‘gmtCreate’] = powerdata[‘gmtCreate’].\\
map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
thdata[‘gmtCreate’] = thdata[‘gmtCreate’].map(lambda x: time.strftime(“%Y-%m-%d %H:%M:%S”,time.localtime(x*0.001)))
powerdata.fillna(0, inplace=True) #將缺值替換為0,以供數據處理
thdata.fillna(0,inplace=True) #將缺值替換為0,以供數據處理
powerdata.to_csv(“powerdata.csv”) thdata.to_csv(“thdata.csv”)

2.3 數據處理與彙總

#與數據計算相關常量參數 
voltage=0.23
phases=3
dayscycle=7

為了簡化處理,本案例讀取本日之前7天(一週)能耗進行分析,並簡化針對每個設備的分析,而是將數據分類彙總。

  • 採用df.loc[filter]結合過濾器的方式對數據進行切片
  • 過濾器為(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)
#取得今天的時間
today=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()))
#取得七天前的時間
startday=time.strftime(“%Y-%m-%d 00:00:00”,time.localtime(time.time()-dayscycle*3600*24))
#截取前後段之間的數據 powerdata=powerdata.loc[(powerdata[‘gmtCreate’]>=startday) & (powerdata[‘gmtCreate’]<=today)]
thdata=thdata.loc[(thdata[‘gmtCreate’]>=startday) & (thdata[‘gmtCreate’]<=today)]

上述採取的方法比較簡單粗糙,主要用於說明,在後文中會採用一種更優雅的方式處理數據。即先將時間字符串轉換為pandas的dataframe中日期時間然後之間選擇操作。在時間截取後對數據進行彙總和整理。

  • 利用了列直接相加的方式生成新的列
  • 利用drop方法棄用廢棄列以優化數據
  • 利用pandas的to_datetime方法將時間字符串轉換為日期時間格式
  • 利用set_index方法將默認的數字編號索引修改為以日期時間為索引
powerdata[‘totalpower’]=(powerdata[‘h47’]+powerdata[‘h48’]+powerdata[‘h49’])*voltage #實時總功率
powerdata[‘maintain’]=(powerdata[‘h35’]+powerdata[‘h36’]+powerdata[‘h37’])*voltage*phases #檢修系統實時功率
#…省略其他類似內容
powerdata=powerdata.drop([‘iotId’,’h32′,’h33′,’h34′,’h35′, ‘h36′,’h37′,
’h38′,’h39’, ‘h3A’,’h3B’,’h3C’,’h3D’,’h3E’,’h3F’,’h40′,’h41′,’h42′,
‘h43′,’h44′,’h45′,’h46’, ‘h47′,’h48′,’h49’], axis=1)
powerdata[‘gmtCreate’] = pd.to_datetime(powerdata[‘gmtCreate’])
thdata[‘gmtCreate’] = pd.to_datetime(thdata[‘gmtCreate’])
powerdata.set_index(“gmtCreate”, inplace=True)
thdata.set_index(“gmtCreate”, inplace=True)

整理後的數據示意如下:

如何利用python對物聯網平臺大數據進行分析與預測

3. 數據分析與可視化

在整理之後對數據進行簡單的分析與可視化。

  • 採用matplotlib的pyplot來畫圖
  • 採用Jupyter notebook的魔術方法%matplotlib inline 在文件內畫圖
  • 在將日期時間格式化後,採用了powerdata.index.floor(‘H’)方法快速按照小時取平均值,將H改為M,D等可以切換單位
  • 採用groupby方式分類彙總並通過mean快速取每小時平均值,進一步簡化數據,如果要求和則用sum
import matplotlib.pyplot as plt
%matplotlib inline powerdata=powerdata.groupby(powerdata.index.floor(‘H’)).mean()
thdata=thdata.groupby(thdata.index.floor(‘H’)).mean()

實時能耗圖說明。可以看出,用戶用能具備明顯規律性,出現顯著的典型用能尖峰,這是由於用戶目前各子系統運行為人工開啟,運維人員同時開啟各個子系統導致的用能尖峰。

  • – totalpower 實時總功耗
  • – maintain 檢修系統功耗
  • – pumps 水泵系統功耗
  • – lights 照明系統功耗
  • – fans 排風系統功耗
  • – others 其他(消防,控制等系統功耗)
powerdata.plot.line(figsize=(16,12),title=’Real Time Energy Cost’)
plt.show()

通過figsize參數指定畫布大小,通過title指定表名。

如何利用python對物聯網平臺大數據進行分析與預測

作為補充,截取一天的用能數據生成典型日用能詳圖。

powerdata.loc[(powerdata.index>=’2019-08-06 00:00:00′)&(powerdata.\\
index<=’2019-08-06 23:59:59′)].plot.line(figsize=(16,12),title=’Typical Day’)
plt.show()
如何利用python對物聯網平臺大數據進行分析與預測

常用的曲線除了曲線圖外,還有柱狀圖,以下兩張分別為按日和彙總的用能分類圖。

powerdata.groupby(powerdata.index.floor(‘D’)).sum().plot.bar(figsize=(16,12),title=’Daily Energy Cost’) plt.show() 
如何利用python對物聯網平臺大數據進行分析與預測

powerdata.sum().plot.bar(figsize=(16,12),title=’Total Energy Cost’) plt.show()

如何利用python對物聯網平臺大數據進行分析與預測

最後,對用戶用能的具體數據進行簡單彙總。

print(‘上週總用能約為 %.2f kWh.’%powerdata[‘totalpower’].sum())
print(‘其中:’) print(‘檢修子系統用能約 %.2f kWh,’%powerdata[‘maintain’].sum())
print(‘水泵子系統用能約 %.2f kWh,’%powerdata[‘pumps’].sum())
print(‘照明子系統用能約 %.2f kWh,’%powerdata[‘lights’].sum())
print(‘通風子系統用能約 %.2f kWh,’%powerdata[‘fans’].sum())
print(‘消防等其他用能約 %.2f kWh,’%powerdata[‘others’].sum())

此外,pandas也內置了簡單方便而全面的統計函數describe。

powerdata.describe() 
如何利用python對物聯網平臺大數據進行分析與預測

4. 結論與展望

從上述案例可以看出python在數據科學中的一些使用。本案例中使用了約25萬條記錄的數據量。但對pandas來說,無論是讀取、寫入和分析都是相當迅速的,最長在幾秒鐘內即可完成工作,這是使用傳統的office套件等完全無法實現的,對海量數據的分析與處理,只能通過數據分析工具才更有效率。

當然,為了簡化分析過程,本案例對數據進行了大量的歸集與簡化,和大部分數據科學工作相似,大部分工作都用於數據的獲取、清洗和處理,而在數據規範後可快速進行可視化與進一步處理。當然,本案例的大量簡化,在相當程度上導致數據價值的缺失,如果只是做簡單的數據可視化處理,更稀疏的數據即可滿足使用要求。但如果要進行深度學習與更詳細的應用,就需要對數據進行更細緻精確的分析與處理,而不止本文的彙總與歸集。

本案例可為後續進行機器學習的工作提供基礎的數據,通過機器學習的方式,本案例中的數據至少可以起到幾方面的作用:

  • 結合環境參數,實時能源價格等為系統提供更優化更節約費用的運行方案
  • 通過模式學習,自動識別系統中無法通過人工手段發現的隱患與事故並及時報警
  • 通過時間序列,對未來的用能情況,系統安全等狀況進行預測
  • 通過不斷的優化,為類似項目建立可供參考的成熟模型
  • ……
"

相關推薦

推薦中...