几种张量数据的存储方式:
主要讲讲高维的张量数据存储:
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。
来源:CSDN
作者:weixin_41660414
链接:https://blog.csdn.net/weixin_41660414/article/details/103616134