我正在处理大量数据集,每个数据集都是 pandas DataFrame,由于它们的大小,我需要从磁盘访问它们。据我所知,HDF 似乎是使用它们的好方法,但我对构建数据的最佳方法有点困惑,因为每个 DataFrame 都有各种元数据。如果我要将数据存储在内存中,我可能可以使用类似命名元组的东西(尽管这不允许简单的查询):
DataSet = namedtuple('DataSet', 'model method id data')
data
是保存实际数据帧的属性,其他字段是文本。但是,我现在需要包含一系列结果字段,我可能会使用 DataFrame 字典在内存中执行此操作。如果我将其转储到 mongodb,我可能会得到如下所示的内容:
[{
model: 'mir',
method: 'rfl_max',
id: 's0001',
data: <DataFrame>,
results: [
{
option_r: 10,
window: 30,
data: <DataFrame>
},
...
]
},
....
]
我的基本问题是我可以有效地将这种结构应用于 HDF 吗?具体来说:
- HDF 支持这种嵌套吗?如果支持,我该怎么做?
- 在 mongo 中查找这样的数据非常高效,因为它使用索引。 HDF 也是如此,例如我可以有效地找到与特定方法和 option_r 匹配的所有结果吗?
- 我对 HDF 的有限经验是通过 pandas 实现的,它似乎只允许存储面板上的系列、数据帧。这真的是一个限制吗,还是我只是做错了什么?
或者,有人知道基于文件的 mongodb 实现可以满足我的目的吗?
最佳答案
HDFStore
支持分层索引,请参阅here .
您可以存储附加到特定节点的属性,请参阅 here 。这通常仅限于少量元数据。
HDF5 在存储/搜索实际数据方面非常高效,例如一个数据框。结构比你高了2个,但它并不是为了竞争,而是可以补充mongodb
。 mongo 擅长保存/搜索这些“类似 json”的嵌套结构。
您始终可以保留对数据实际位置(DataFrame/Series)的引用,而不是 mongo 数据库中的实际数据。
HDF5 存储/搜索实际数据的速度将快几个数量级(非常小的数据集除外)。
关于python - 在 HDF 存储中构建数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22243753/