浅谈张量数据的存储

三世轮回 提交于 2019-12-22 20:44:46

几种张量数据的存储方式:

主要讲讲高维的张量数据存储:

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)
#engine_data = [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 = [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。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!