在HDF存储中构建数据

时间:2014-03-07 07:07:55

标签: python mongodb data-structures pandas hdf5

我正在处理大量数据集,每个数据集都是一个pandas DataFrame,由于它们的大小,我需要从磁盘访问它。从我的阅读,看起来HDF将是一个很好的方式与他们合作,但我有点困惑的结构数据的最佳方式,因为每个DataFrame的各种元数据。如果我要将数据存储在内存中,我可能会使用像namedtuple这样的东西(虽然这样不容易查询):

DataSet = namedtuple('DataSet', 'model method id data')

data是保存实际数据帧的属性,其他字段是文本。但是,我现在需要包含一系列结果字段,我可能会在内存中使用DataFrames的字典。如果我把它转移到一个mongodb,我可能会有这样的东西:

[{
    model: 'mir',
    method: 'rfl_max',
    id: 's0001',
    data: <DataFrame>,
    results: [
        {
            option_r: 10,
            window: 30,
            data: <DataFrame>
        },
        ...
    ]
},
....
]

我的基本问题是我可以有效地将此结构应用于HDF吗?具体做法是:

  1. HDF是否支持这种嵌套,如果是,我该怎么做?
  2. 在mongo中查找这样的数据是有效的,因为它使用索引。 HDF也是如此,例如:我能否有效地找到与特定方法和option_r匹配的所有结果?
  3. 我对HDF的有限经验是通过pandas,它似乎只允许存储Panel上的Series,DataFrames。这是一个真正的限制,还是我只是做错了什么?
  4. 或者,是否有人知道基于文件的mongodb实现可能会出于我的目的?

1 个答案:

答案 0 :(得分:3)

HDFStore支持分层索引,请参阅here

您可以存储附加到特定节点的属性,请参阅here。这通常仅限于少量的元数据。

HDF5在存储/搜索实际数据方面非常有效,例如一个DataFrame。结构是你的2,但它并不意味着竞争,而是它可以补充mongodb。 mongo非常善于保持/搜索这些'类似json'的嵌套结构。

您始终可以引用数据的实际位置(DataFrame / Series),而不是mongo db中的实际数据。

HDF5在存储/搜索实际数据方面的速度要快几个数量级(非常小的数据集除外)。