幾種張量數據的存儲方式:
主要講講高維的張量數據存儲:
1.excel中二維表+不同sheet
以之前的發動機的數據爲例:
一個文件中有多個sheet,sheet1、sheet2、…、sheetN
一個sheet中包含一個二維表
列是發動機的各項指標property1、property2、…、propertyN
行是發動機1、發動機2、…、發動機N
sheet1
Property1 | Property2 | |
---|---|---|
Engine1 | 10 | 12 |
Engine2 | 15 | 13 |
Engine3 | 11 | 14 |
2.用JSON格式存儲,然後存至MySQL數據庫,MySQL5.7.7版本已經開始原生支持JSON格式。
JSON是 JavaScript Object Notation的縮寫,但是和Javascript語言沒有多大關係。也是一種存儲數據的方式。
JSON語法的核心是Key-Value鍵值對,最外側的大括號開始表示JSON對象的起始,一直到末尾的大括號結束。
{#Json對象的開始
"price": 9999,
"country-of-origin" : "usa",
"system": "Linux"
"style" : {#JSON對象內部嵌套一個JSON對象,Style對應的JSON對象裏面由包含兩個鍵值對
"categorises" : [ "laptop", "Game notebook" ],#JSON數組
"color" : "black"
}
}
以發動機的張量數據爲例:
{
"meta": {"title": "Engine data"
"status":200
"company": "Air China"
}
"conent" : [{"date":"2019-12-15",
"Engine": [
{"name": "Engine1",
"Property1": "3",
"Property2": "4",
"Proerty3": " 5" },
{"name": "Engine2",
"Property1": "4",
"Property2": "3",
"Propety3": "5"},
{"name": "Engine2",
"Property1": "4",
"Property2": "3",
"Propety3": "5"}]
},
{"date":"2019-12-16",
"Engine": [
{"name": "Engine1",
"Property1": "3",
"Property2": "4",
"Property3": " 5" },
{"name": "Engine2",
"Property1": "4",
"Property2": "3",
"Property3": "5"},
{"name": "Engine2",
"Property1": "4",
"Property2": "3",
"Property3": "5"},
{"date":"2019-12-17",
"Engine": [
{"name": "Engine1",
"Property1": "3",
"Property2": "4",
"Property3": " 5" },
{"name": "Engine2",
"Property1": "4",
"Property2": "3",
"Property3": "5"},
{"name": "Engine2",
"Property1": "4",
"Property2": "3",
"Property3": "5"}]
}
conent鍵對應着一個JSON數組,這個JSON數組包含一個三個JSON對象,實際上就是一個時間上的維度,然後每個JSON對象下面的date鍵對應着他的時間,Engine鍵又對應着一個JSON數組,這其實就是發動機號碼的維度,在每個發動機JSON對象下面,又有三個發動機屬性鍵,對應着三個不同的屬性。
三.在Python的Numpy庫中通過Ndarray對象存儲:
Numpy數組類的名字叫做ndarray,經常簡稱爲array。在Numpy中,維度被稱爲‘軸’。
import numpy as np
engine_data =a = np.array([[[1,2],[2,4],[3,1]],
[[1,1],[2,3],[1,3]],
[[2,4],[4,5],[2,3]]])
print(engine_data)
三個維度,分別對應三個日期2019-12-15、2019-12-16、2019-12-17; 三臺發動機Engine1、Engine2、Engine3;兩個不同的發動機屬性p1、p2。
可用numpy.save()
方法將數據保存爲npy文件
import numpy as np
...
np.save('engine_data.npy', engine_data)
會在該項目的目錄下生成一個.npy文件
同時可以用numpy.load()
方法加載.npy文件
import np as numpy
engine_data =a = np.array([[[1,2],[2,4],[3,1]],
[[1,1],[2,3],[1,3]],
[[2,4],[4,5],[2,3]]])
np.save('engine_data.npy', engine_data)
new_engine_data = np.load('engine_data.npy')
# np.array.all()是與操作,所有元素爲True,輸出爲True。
print((engine_data == new_engine_data).all())
print(new_engine_data)
利用Python Pandas中的DataFrame構建三維的DataFrame來存儲張量
DataFrame是Pandas的核心數據結構,表示的是二維的矩陣數據表,但是發現可以通過二維矩陣表構建三維DateFrame來存儲張量。
創建DataFrame對象的方法有很多,最常用的是利用包含等長度列表或Numpy數組的字典來生成。
直接看例子
import pandas as pd
import numpy as np
df_example = pd.DataFrame([['100', '200', 'RR'],
['121', '210', 'CFM'],
['115', '101', 'GE']],
columns=['rotated_speed', 'vibration', 'company'],
index=['engine1', 'engine2', 'engine3'])
print(df_example)
輸出結果如下:
還是上面那個例子,若是把時間維度添加進來,想表示成三維張量,該如何表示?
Engine1 | Engine2 | Engine3 |
---|
Property1 | Property2 | Property1 | Property2 | Property1 | Property2 | |
---|---|---|---|---|---|---|
2019-12-15 | ||||||
2019-12-16 | ||||||
2019-12-17 |
直接上代碼:
import pandas as pd
import numpy as np
#Engine Columns
engine = np.array(["E1", "E1", "E2", "E2", "E3", "E3"])
engine_property = np.array(["p1", "p2"] * 3)
# 假設是一堆數據
engine_data = []
for i in range(6):
engine_data.append([np.random.randint(1,10,6]*6)
print(engine_data)
enginge_data = np.array(engine_data)
print(engine_data)
df_engine_data = pd.DataFrame(data=engine_data.T,
index = pd.date_range('20191215', periods=6),
columns = pd.MultiIndex.from_tuples(zip(A,B)))
print("the df_engine_data is :")
print(df_engine_data)
import pandas as pd
import numpy as np
#Engine Columns
engine = np.array(["E1", "E1", "E2", "E2", "E3", "E3"])
engine_property = np.array(["p1", "p2"] * 3)
# 假設是一堆數據
engine_data = []
for i in range(6):
engine_data.append([np.random.randint(1,10,6]*6)
print(engine_data)
enginge_data = np.array(engine_data)
print(engine_data)
df_engine_data = pd.DataFrame(data=engine_data.T,
index = pd.date_range('20191215', periods=6),
columns = pd.MultiIndex.from_tuples(zip(A,B)))
print("the df_engine_data is :")
print(df_engine_data)
# How to store? method 1 -> Write to excel
writer = pd.ExcelWriter('c:/Users/Flyer/Desktop/untitled1.xlsx')# Create the file
df.to_excel(writer, "Sheet1") # Writing
writer.save() # Close the file
# How to store? method 2 -> Write to HDF5
store = pd.HDFStore("engine_data.h5")
#HDFStore支持兩種工作模式,‘fixed’和‘table’。table的速度更慢,但支持一種類似數據庫SQL語言的查詢操作
store.put('obj1', df_engine_data, format = 'table')
print("The store['obj1'] is:")
print(store['obj1'])
a = store.select('obj1', where= ['index< 20191219'])
print("a is :")
print(a)
store.close() # 關閉文件
df_read_engine_data = pd.read_hdf("engine_data.hdf5", mode= "a")
print("the read engine data is:")
print(df_read_engine_data)
print("the df_read_enginge_data columns is:")
print(df_read_engine_data.columns)
生成文件:
HDF5是一個備受好評的文件格式,廣泛用於存儲大量的科學計算數組。很多數據分析的實際工作中困難都在於I/O密集,而不是CPU密集,使用HDF5這樣的工具可以大大加速你的應用。它以C庫的形式提供,並且具有許多其它語言的接口,包括Java、MATLAB和Python。。HDF5中的HDF代表分層數據格式。每個HDF5文件可以存儲多個數據集並且支持元數據。支持多種壓縮模式的即時壓縮,使得重複模式的數據可以更高效地存儲。
要注意的是HDF5並不是數據庫,它是一種適合一次寫入多次讀取的數據集。
HDFStore支持兩種工作模式,‘fixed’和‘table’。table的速度更慢,但支持一種類似數據庫SQL語言的查詢操作
多維數據庫(MDD)存儲
多維數據庫是指將數據存放在一個n維數組中,而不是像關係數據庫那樣以記錄的形式存放。因此它存在大量稀疏矩陣,人們可以通過多維視圖來觀察數據。多維數據庫增加了一個時間維,與關係數據庫相比,它的優勢在於可以提高數據處理速度,加快反應時間,提高查詢效率。
**主要有兩種MDD的OLAP產品:**基於多維數據庫的MOLAP和基於關係數據庫的ROLAP。