淺談張量數據的存儲

幾種張量數據的存儲方式:

主要講講高維的張量數據存儲:

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章