我正在处理大量数据集,每个数据集都是pandas数据帧,由于它们的大小,我需要从磁盘访问它们。从我读到的内容来看,hdf似乎是一种很好的处理它们的方法,但是我对构造数据的最佳方式有点困惑,因为每个数据帧都有不同的元数据位。如果我将数据存储在内存中,我可能会使用类似namedtuple的东西(尽管这不允许简单的查询):

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

data是包含实际数据帧的属性,其他字段是文本。但是,我现在需要包含一系列结果字段,这可能是在内存中使用数据帧的dict来实现的。如果我将此转储到MongoDB,我可能会得到如下内容:
[{
    model: 'mir',
    method: 'rfl_max',
    id: 's0001',
    data: <DataFrame>,
    results: [
        {
            option_r: 10,
            window: 30,
            data: <DataFrame>
        },
        ...
    ]
},
....
]

我的基本问题是我能有效地将这种结构应用到hdf中吗?明确地:
HDF支持这种嵌套吗?如果支持,我该怎么做?
在mongo中查找这样的数据是有效的,因为它使用索引。对于hdf也是如此,例如,我是否可以有效地找到与特定方法和选项匹配的所有结果?
我对hdf的有限经验是通过pandas,它似乎只允许存储面板上的序列数据帧。这是一个真正的限制,还是我只是做错了什么?
或者,是否有人知道基于文件的mongodb实现可能满足我的目的?

最佳答案

HDFStore支持分层索引,请参见here
可以存储附加到特定节点的属性,请参见here。这通常仅限于少量元数据。
hdf5在存储/搜索实际数据(如数据帧)方面非常有效。这个结构比你高2倍,但它不是用来竞争的,而是可以补充mongodb。mongo擅长保持/搜索这些类似json的嵌套结构。
您始终可以保留对数据的实际位置(dataframe/series)的引用,而不是mongo db中的实际数据。
HDF5对于存储/搜索实际数据(非常小的数据集除外)的速度要快几个数量级。

关于python - 在HDF存储中构建数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22243753/

10-12 22:29
查看更多