gpt4 book ai didi

python - HDFStore 获取列名称

转载 作者:行者123 更新时间:2023-12-02 20:28:08 27 4
gpt4 key购买 nike

我对 pandas' HDFStore 有一些问题速度太慢了,不幸的是我无法从这里的其他问题中找到令人满意的解决方案。

情况

我有一个很大的 DataFrame,其中大部分包含 float ,有时包含整数列,这些列经历多个处理步骤(重命名、删除坏条目、聚合 30 分钟)。每行都有一个与其关联的时间戳。我想将一些中间步骤保存到 HDF 文件中,以便用户可以迭代执行单个步骤,而不必每次都从头开始。

此外,用户应该能够从这些保存中绘制某些列,以便选择错误数据。因此我想只检索列名而不读取 HDFStore 中的数据。具体来说,用户应该获得存储在 HDF 中的所有数据帧的所有列的列表,然后他们应该选择他们想要查看的列,然后我使用 matplotlib 向他们呈现相应的数据。

数据

shape == (5730000, 339)看起来一点也不大,这就是我感到困惑的原因......(随着时间的推移可能会获得更多的行,列应该保持固定)在第一步中,我迭代地追加行和列(运行正常),但一旦完成,我总是立即处理整个 DataFrame,仅分组或删除数据。

我的方法

  1. 我在内存中进行所有操作,因为 pandas 似乎相当快而 I/O 较慢(我认为 HDF 位于不同的物理服务器上)
  2. 我使用日期时间索引并自动选择浮点或整数列
  3. 我用 hdf.put('/name', df, format='fixed') 保存步骤自 hdf.put('/name'.format(grp), df, format='table', data_columns=True)似乎太慢了。
  4. 我使用例如df.groupby(df.index).first()df.groupby(pd.Grouper(freq='30Min')).agg(agg_dict)处理数据,其中 agg_dict 是一个字典,每列一个函数。这也非常慢。
  5. 为了绘图,我必须读入整个数据框,然后获取列:hdfstore.get('/name').columns

问题

  • 如何在不从 HDFStore 读取任何数据的情况下检索所有列?
  • 存储数据最有效的方式是什么? HDF 是正确的选择吗?台式还是固定式?
  • 如果索引是日期时间索引,那么效率重要吗?一般来说是否存在更有效的格式(例如所有列都相同,固定数据类型?)
  • 有没有比 groupby 更快的聚合方法? (df.groupby(pd.Grouper(freq='30Min')).agg(agg_dict))

类似问题

How to access single columns using .select 我认为我可以使用它来仅检索某些列,但前提是我知道列名称。

感谢您的建议!

最佳答案

您可以通过指定相同的 startstop 属性来简单地加载 DataFrame 的 0 行。并将所有内部索引/列处理留给 pandas 本身:

idx = pd.MultiIndex.from_product([('A', 'B'), range(2)], names=('Alpha', 'Int'))
df = pd.DataFrame(np.random.randn(len(idx), 3), index=idx, columns=('I', 'II', 'III'))
df

>>> I II III
>>> Alpha Int
>>> A 0 -0.472412 0.436486 0.354592
>>> 1 -0.095776 -0.598585 -0.847514
>>> B 0 0.107897 1.236039 -0.196927
>>> 1 -0.154014 0.821511 0.092220

以下内容适用于固定表格格式:

with pd.HDFStore('test.h5') as store:
store.put('df', df, format='f')
meta = store.select('df', start=1, stop=1)
meta
meta.index
meta.columns

>>> I II III
>>> Alpha Int
>>>
>>> MultiIndex(levels=[[], []],
>>> codes=[[], []],
>>> names=['Alpha', 'Int'])
>>>
>>> Index(['I', 'II', 'III'], dtype='object')

至于其他问题:

  1. 只要您的数据大部分是同质的(几乎是您提到的 float 列),并且您能够将其存储在单个文件中,而不需要跨计算机分发数据 - HDF 是首先要尝试的方法。
  2. 如果您需要追加/删除/查询数据 - 您必须使用table格式。如果您只需要写入一次并读取多次 - fixed 将提高性能。
  3. 对于日期时间索引,我认为这里我们可以使用与1子句中相同的想法。如果您能够将所有数据转换为单一类型,它应该会提高您的性能。
  4. 我没有想到在评论您的问题时提出的其他建议。

关于python - HDFStore 获取列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49401464/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com