1

所以我试图将 Pandas DataFrames 存储在 HDF5 中并得到奇怪的错误,相当不一致。至少有一半的时间,读取-过程-移动-写入循环的某些部分失败,通常没有比“HDF5 读取错误”更清楚的解释。更糟糕的是,有时表格最终会出现无意义/损坏的数据,这些数据直到下游才会停止 - 要么值相差几个数量级(甚至与正确的值不相关),要么日期没有意义(最近的数据被错误标记为 1750 年代……等等)。

我想我会经历当前的过程,然后我怀疑可能会导致问题的事情可能会有所帮助。这是它的样子:

  1. 阅读一些表格(称它们为“QUERY1”和“QUERY2”),看看它们是否是最新的,如果不是,
  2. 将 HDF5 存储中的表作为“QUERY1”并将其存储为 HDF5 存储中的 QUERY1_YYYY_MM_DD”
  3. 对该表的外部数据库运行相关查询。每一个都是 100 到 1500 列的每日数据,可以追溯到 1980 年。
  4. 将查询 1 的结果作为新的“QUERY1”存储在 HDF5 存储中
  5. 计算一个或多个 QUERY1、QUERY2、...QUERYn 的多个转换,这些转换将具有分层(Pandas MultiIndex)列。用 HDF5 商店中的更新/替换覆盖项目“Derived_Frame1”...等
  6. 多个有权访问 Windows 网络驱动器上相关 .h5 文件的人运行此例程——有时可能会,但通常不会同时运行。

我怀疑有些事情可能是问题的一部分:

  • 使用默认格式(df.to_hdf(store, key))而不是坚持使用“表格”格式df.to_hdf(store, key, format='table'))。我这样做是因为根据 %timeit,默认格式在读取和写入方面都快 2 到 5 倍

  • 使用网络驱动器允许多个用户运行此例程并至少访问派生帧。对于这个要求,我无能为力,尤其是对于随时读取派生数据帧的访问。

  • 从文档中,听起来重复删除和重写 HDF5 存储中的项目会做一些奇怪的事情(至少逐渐增加文件大小,不知道还有什么)。也许我应该将查询档案存储在另一个文件中?也许我应该在更新时核对并替换整个主文件?

  • 首先在 HDF5 中存储具有 MultiIndex 列的数据帧——这似乎是让我在默认格式下发出“警告”的原因,尽管如果我使用format='table'.

  • 编辑:运行上述例程的不同用户也有可能/很可能使用不同版本的 Pandas 和不同版本的 PyTables。

有任何想法吗?

4

0 回答 0