标签: pytables

什么是存储和查询大气象数据数据集的更好方法

我正在寻找一种方便的方式来存储和查询大量的气象数据(几TB).有关问题中间数据类型的更多信息.

以前我一直在寻找MongoDB的方向(我在之前的许多项目中使用它并且觉得很舒服),但最近我发现了HDF5数据格式.读到它,我发现与Mongo有一些相似之处:

HDF5简化了文件结构,只包括两种主要类型的对象:数据集,它是同类型组的多维数组,它们是容器结构,可以容纳数据集和其他组.这导致真正的分层,类文件系统数据格式.元数据以附加到组和数据集的用户定义的命名属性的形式存储.

它看起来像Mongo中的数组和嵌入对象,并且它还支持用于查询数据的索引.

因为它使用B树来索引表对象,所以HDF5适用于时间序列数据,例如股票价格序列,网络监控数据和3D气象数据.

数据:

特定区域分为较小的方块.在每个传感器的交叉点上(一个点).

在此输入图像描述

该传感器每隔X分钟收集以下信息:

  • 太阳光度
  • 风的位置和速度
  • 湿度
  • 等等(此信息大致相同,有时传感器不收集所有信息)

它还收集不同高度(0米,10米,25米).并不总是高度相同.此外,每个传感器都有某种元信息:

  • 名称
  • lat,lng
  • 它是在水中,还有许多其他的

给出这个,我不希望一个元素的大小大于1Mb.此外,我在一个地方有足够的存储空间来保存所有数据(据我所知,不需要分片)

对数据的操作. 我将通过以下几种方式与数据进行交互:

  • 转换为商店大量的数据:在netcdf格式的某些时间点,我会给我很少的TB数据,我需要存储它们(并且将它转换为相对容易的HDF5).然后,将提供周期性较小的数据部分(每周1 Gb),我必须将它们添加到存储中.只是为了强调:我有足够的存储空间来将所有这些数据保存在一台机器上.

  • 查询数据.通常需要实时查询数据.通常的查询大多数是:告诉我特定时间内特定区域的传感器温度,向我显示特定时间内特定传感器的数据,并显示给定时间范围内某些区域的风.汇总查询(过去两个月的平均温度)是不太可能的.在这里我认为Mongo非常合适,但hdf5 + pytables是另一种选择.

  • 进行一些统计分析.目前我不知道究竟是什么,但我知道这不应该是实时的.因此我认为使用带有mongo的hadoop可能是一个不错的主意但是带有R的 hdf5 是一个合理的选择.

我知道不鼓励有关更好方法的问题,但我正在寻找有经验的用户的建议.如果您有任何问题,我很乐意回答他们,并感谢您的帮助.

PS我回顾了一些有趣的讨论,类似于我的:hdf-forum,在hdf5中搜索,存储气象数据

hadoop hdf5 mongodb pytables

4
推荐指数
1
解决办法
6030
查看次数

将几个 hdf5 文件合并到一个 pytable 中

我有几个hdf5文件,每个文件都具有相同的结构。我想pytable通过某种方式合并hdf5文件来创建一个。

我的意思是,如果文件 1 中的数组大小为 x,文件 2 中的数组大小为 y,则结果数组pytable的大小将为 x+y,首先包含文件 1 中的所有条目,然后包含文件 2 中的所有条目。

hdf5 pytables

4
推荐指数
1
解决办法
1739
查看次数

防止 PyTables(在 Pandas 中)打印“正在关闭剩余的打开文件...”

有没有办法防止 PyTables 打印出来 Closing remaining open files:path/to/store.h5...done

我想摆脱它只是因为它阻塞了终端。

pandas.HDFStore如果这很重要,我正在使用。

python pytables pandas

4
推荐指数
1
解决办法
931
查看次数

将通过 pandas/pytables 编写的大型 hdf5 数据集转换为 vaex

我有一个非常大的数据集,我通过 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 …

python hdf5 pytables pandas vaex

4
推荐指数
1
解决办法
1766
查看次数

PyTables问题 - 迭代表的子集时会产生不同的结果

我是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)

python numpy pytables

3
推荐指数
1
解决办法
733
查看次数

如何使用正则表达式删除python字符串中的十六进制值?

我在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)

有关如何处理这个的任何建议?

python string matlab hdf5 pytables

3
推荐指数
1
解决办法
2万
查看次数

查询PyTables嵌套列

我有一个带有嵌套表列的表,路由.在其下面是另外两种嵌套数据类型,master和slave都有一个整数id和字符串类型字段.

我想运行像table.readWhere('route/master/id == 0')之类的东西,但我得到"变量route指的是嵌套列,不允许在条件中"

有没有一种方法来查询pytables中的嵌套数据类型?

python pytables

3
推荐指数
1
解决办法
564
查看次数

pandas HDFStore按日期时间索引选择行

我确定这可能非常简单,但我无法弄清楚如何通过其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日我得到了所有东西,但是我看不出如何增加时间.

pytables pandas

3
推荐指数
1
解决办法
1773
查看次数

将数据集转换为HDF5数据集

我有一个数据集,我想转换为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文件?

python hdf5 pytables h5py

3
推荐指数
1
解决办法
5259
查看次数

使用HDF5和Pandas通过分块读取数据

当在内存中查询数据形成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查询,但为了这个目的,我想尝试这种方式)

python hdf5 pytables python-2.7 pandas

3
推荐指数
1
解决办法
3391
查看次数

标签 统计

pytables ×10

python ×7

hdf5 ×6

pandas ×4

h5py ×1

hadoop ×1

matlab ×1

mongodb ×1

numpy ×1

python-2.7 ×1

string ×1

vaex ×1