我正在寻找一种方便的方式来存储和查询大量的气象数据(几TB).有关问题中间数据类型的更多信息.
以前我一直在寻找MongoDB的方向(我在之前的许多项目中使用它并且觉得很舒服),但最近我发现了HDF5数据格式.读到它,我发现与Mongo有一些相似之处:
HDF5简化了文件结构,只包括两种主要类型的对象:数据集,它是同类型组的多维数组,它们是容器结构,可以容纳数据集和其他组.这导致真正的分层,类文件系统数据格式.元数据以附加到组和数据集的用户定义的命名属性的形式存储.
它看起来像Mongo中的数组和嵌入对象,并且它还支持用于查询数据的索引.
因为它使用B树来索引表对象,所以HDF5适用于时间序列数据,例如股票价格序列,网络监控数据和3D气象数据.
数据:
特定区域分为较小的方块.在每个传感器的交叉点上(一个点).

该传感器每隔X分钟收集以下信息:
它还收集不同高度(0米,10米,25米).并不总是高度相同.此外,每个传感器都有某种元信息:
给出这个,我不希望一个元素的大小大于1Mb.此外,我在一个地方有足够的存储空间来保存所有数据(据我所知,不需要分片)
对数据的操作. 我将通过以下几种方式与数据进行交互:
转换为商店大量的数据:在netcdf格式的某些时间点,我会给我很少的TB数据,我需要存储它们(并且将它转换为相对容易的HDF5).然后,将提供周期性较小的数据部分(每周1 Gb),我必须将它们添加到存储中.只是为了强调:我有足够的存储空间来将所有这些数据保存在一台机器上.
查询数据.通常需要实时查询数据.通常的查询大多数是:告诉我特定时间内特定区域的传感器温度,向我显示特定时间内特定传感器的数据,并显示给定时间范围内某些区域的风.汇总查询(过去两个月的平均温度)是不太可能的.在这里我认为Mongo非常合适,但hdf5 + pytables是另一种选择.
进行一些统计分析.目前我不知道究竟是什么,但我知道这不应该是实时的.因此我认为使用带有mongo的hadoop可能是一个不错的主意但是带有R的 hdf5 是一个合理的选择.
我知道不鼓励有关更好方法的问题,但我正在寻找有经验的用户的建议.如果您有任何问题,我很乐意回答他们,并感谢您的帮助.
我有几个hdf5文件,每个文件都具有相同的结构。我想pytable通过某种方式合并hdf5文件来创建一个。
我的意思是,如果文件 1 中的数组大小为 x,文件 2 中的数组大小为 y,则结果数组pytable的大小将为 x+y,首先包含文件 1 中的所有条目,然后包含文件 2 中的所有条目。
有没有办法防止 PyTables 打印出来
Closing remaining open files:path/to/store.h5...done?
我想摆脱它只是因为它阻塞了终端。
pandas.HDFStore如果这很重要,我正在使用。
我有一个非常大的数据集,我通过 append 以块的形式写入 hdf5,如下所示:
with pd.HDFStore(self.train_store_path) as train_store:
for filepath in tqdm(filepaths):
with open(filepath, 'rb') as file:
frame = pickle.load(file)
if frame.empty:
os.remove(filepath)
continue
try:
train_store.append(
key='dataset', value=frame,
min_itemsize=itemsize_dict)
os.remove(filepath)
except KeyError as e:
print(e)
except ValueError as e:
print(frame)
print(e)
except Exception as e:
print(e)
Run Code Online (Sandbox Code Playgroud)
数据太大而无法加载到一个 DataFrame 中,因此我想尝试使用 vaex 进行进一步处理。不过有几件事我真的不明白。
由于 vaex 在 hdf5 中使用与 pandas/pytables (VOTable) 不同的表示形式,我想知道如何在这两种格式之间进行转换。我尝试将数据分块加载到 Pandas 中,将其转换为 vaex DataFrame 然后存储它,但似乎无法将数据附加到现有的 vaex hdf5 文件中,至少我找不到。
真的没有办法从 vaex 内部创建大型 hdf5 数据集吗?是将现有数据集转换为 vaex 表示的唯一选择(通过 python 脚本或 TOPCAT 构建文件)吗?
与我之前的问题相关,如果我在 vaex …
我是PyTables的新手,我正在考虑使用它处理基于代理的建模仿真生成的数据并存储在HDF5中.我正在使用39 MB的测试文件,并且遇到了一些奇怪的问题.这是表格的布局:
/example/agt_coords (Table(2000000,)) ''
description := {
"agent": Int32Col(shape=(), dflt=0, pos=0),
"x": Float64Col(shape=(), dflt=0.0, pos=1),
"y": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := 'little'
chunkshape := (20000,)
Run Code Online (Sandbox Code Playgroud)
这是我在Python中访问它的方式:
from tables import *
>>> h5file = openFile("alternate_hose_test.h5", "a")
h5file.root.example.agt_coords
/example/agt_coords (Table(2000000,)) ''
description := {
"agent": Int32Col(shape=(), dflt=0, pos=0),
"x": Float64Col(shape=(), dflt=0.0, pos=1),
"y": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := 'little'
chunkshape := (20000,)
>>> coords = h5file.root.example.agt_coords
Run Code Online (Sandbox Code Playgroud)
现在这里的事情变得奇怪了.
[x for x in coords[1:100] if x['agent'] == 1]
[(1, 25.0, 78.0), (1, 25.0, …Run Code Online (Sandbox Code Playgroud) 我在matlab中有一个单元格数组
columns = {'MagX', 'MagY', 'MagZ', ...
'AccelerationX', 'AccelerationX', 'AccelerationX', ...
'AngularRateX', 'AngularRateX', 'AngularRateX', ...
'Temperature'}
Run Code Online (Sandbox Code Playgroud)
我使用这些脚本,利用matlab的hdf5write函数将数组保存为hdf5格式.
然后我使用pytables将hdf5文件读入python.单元格数组作为一个numpy字符串数组.我转换为列表,这是输出:
>>>columns
['MagX\x00\x00\x00\x08\x01\x008\xe6\x7f',
'MagY\x00\x7f\x00\x00\x00\xee\x0b9\xe6\x7f',
'MagZ\x00\x00\x00\x00\x001',
'AccelerationX',
'AccelerationY',
'AccelerationZ',
'AngularRateX',
'AngularRateY',
'AngularRateZ',
'Temperature']
Run Code Online (Sandbox Code Playgroud)
这些十六进制值从某处弹出到字符串中,我想删除它们.它们并不总是出现在列表的前三项中,我需要一种很好的方式来处理它们或者首先找出它们为什么存在.
>>>print columns[0]
Mag8?
>>>columns[0]
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f'
>>>repr(columns[0])
"'MagX\\x00\\x00\\x00\\x08\\x01\\x008\\xe6\\x7f'"
>>>print repr(columns[0])
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f'
Run Code Online (Sandbox Code Playgroud)
我尝试使用正则表达式删除十六进制值,但运气不佳.
>>>re.sub('(\w*)\\\\x.*', '\1', columns[0])
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f'
>>>re.sub('(\w*)\\\\x.*', r'\1', columns[0])
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f'
>>>re.sub(r'(\w*)\\x.*', '\1', columns[0])
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f'
>>>re.sub('([A-Za-z]*)\x00', r'\1', columns[0])
'MagX\x08\x018\xe6\x7f'
>>>re.sub('(\w*?)', '\1', columns[0])
'\x01M\x01a\x01g\x01X\x01\x00\x01\x00\x01\x00\x01\x08\x01\x01\x01\x00\x018\x01\xe6\x01\x7f\x01'
Run Code Online (Sandbox Code Playgroud)
有关如何处理这个的任何建议?
我有一个带有嵌套表列的表,路由.在其下面是另外两种嵌套数据类型,master和slave都有一个整数id和字符串类型字段.
我想运行像table.readWhere('route/master/id == 0')之类的东西,但我得到"变量route指的是嵌套列,不允许在条件中"
有没有一种方法来查询pytables中的嵌套数据类型?
我确定这可能非常简单,但我无法弄清楚如何通过其datetime索引切片pandas HDFStore表来获取特定的行范围.
我有一个看起来像这样的表:
mdstore = pd.HDFStore(store.h5)
histTable = '/ES_USD20120615_MIDPOINT30s'
print(mdstore[histTable])
open high low close volume WAP \
date
2011-12-04 23:00:00 1266.000 1266.000 1266.000 1266.000 -1 -1
2011-12-04 23:00:30 1266.000 1272.375 1240.625 1240.875 -1 -1
2011-12-04 23:01:00 1240.875 1242.250 1240.500 1242.125 -1 -1
...
[488000 rows x 7 columns]
Run Code Online (Sandbox Code Playgroud)
例如,我想从2012-01-11 23:00:00到2012-01-12 22:30:00获取范围.如果它是在df我只会使用日期时间来切片索引,但我无法弄清楚如何直接从存储表中执行此操作,因此我不必将整个内容加载到内存中.我尝试了,mdstore.select(histTable, where='index>20120111')并且在11日和12日我得到了所有东西,但是我看不出如何增加时间.
我有一个数据集,我想转换为HDF5格式.它是NOAA的数据集.目录结构类似于:
NOAA
??? code
??? ghcnd_all
??? ghcnd_all.tar.gz
??? ghcnd-stations.txt
??? ghcnd-version.txt
??? readme.txt
??? status.txt
Run Code Online (Sandbox Code Playgroud)
我正在与熊猫一起进行数据分析.我感兴趣的主要原因是为了节省空间,数据集大约为25Gb.
如何将此数据集转换为单个.hdf5文件?
当在内存中查询数据形成CSV的子集时,我总是这样做:
df = pd.read_csv('data.csv', chunksize=10**3)
chunk1 = df.get_chunk()
chunk1 = chunk1[chunk1['Col1'] > someval]
for chunk in df:
chunk1.append(chunk[chunk['Col1'] >someval])
Run Code Online (Sandbox Code Playgroud)
我最近开始玩HDF5,因为TableIterator对象没有get_chunk()方法或接受,所以无法做到这一点next().
df = pd.read_hdf('data.h5', chunksize=10**3)
df.get_chunk()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-19-xxxxxxxx> in <module>()
----> 1 df.get_chunk()
AttributeError: 'TableIterator' object has no attribute 'get_chunk'
Run Code Online (Sandbox Code Playgroud)
任何解决方法的想法?(我知道我可以使用pandas从磁盘上的hdf5查询,但为了这个目的,我想尝试这种方式)