【发布时间】:2018-08-30 06:51:14
【问题描述】:
我对 pandas 的 HDFStore 速度太慢有一些问题,不幸的是我无法从这里的其他问题中找到令人满意的解决方案。
情况
我有一个大 DataFrame,主要包含浮点数,有时包含整数列,这些列经过多个处理步骤(重命名、删除错误条目、聚合 30 分钟)。每行都有一个与之关联的时间戳。我想将一些中间步骤保存到 HDF 文件中,以便用户可以迭代地执行单个步骤,而无需每次都从头开始。
此外,用户应该能够从这些保存中绘制某些列,以便选择不良数据。因此,我想只检索列名而不读取 HDFStore 中的数据。 具体来说,用户应该获得存储在 HDF 中的所有数据帧的所有列的列表,然后他们应该选择他们想要查看的列,然后我使用 matplotlib 向他们展示相应的数据。
数据shape == (5730000, 339) 看起来一点也不大,这就是我感到困惑的原因......(随着时间的推移可能会有更多的行,列应该保持固定)
在第一步中,我迭代地追加行和列(运行正常),但一旦完成,我总是一次处理整个 DataFrame,只对数据进行分组或删除。
我的方法
- 我在内存中进行所有操作,因为 pandas 似乎相当快而 I/O 速度较慢(我认为 HDF 位于不同的物理服务器上)
- 我使用日期时间索引并自动选择浮点或整数列
- 我使用
hdf.put('/name', df, format='fixed')保存步骤,因为hdf.put('/name'.format(grp), df, format='table', data_columns=True)似乎太慢了。 - 我使用例如
df.groupby(df.index).first()和df.groupby(pd.Grouper(freq='30Min')).agg(agg_dict)处理数据,其中 agg_dict 是每列一个函数的字典。这也非常慢。 - 为了绘图,我必须读入整个数据框,然后获取列:
hdfstore.get('/name').columns
问题
- 如何在不从 HDFStore 读取任何数据的情况下检索所有列?
- 存储数据最有效的方法是什么? HDF 是正确的选择吗?桌子还是固定的?
- 如果索引是日期时间索引,在效率方面是否重要?一般是否存在更有效的格式(例如,所有列都相同、固定 dtype?)
- 有没有比
groupby(df.groupby(pd.Grouper(freq='30Min')).agg(agg_dict)) 更快的聚合方式
类似问题
How to access single columns using .select
我发现我只能使用它来检索某些列,但我认为只有在我知道列名之后才能检索。
感谢您的建议!
【问题讨论】:
-
关于更快的聚合方式:既然您有
DatetimeIndex,您是否尝试过df.resample('30T').agg(agg_dict)? -
感谢您的意见!它的速度似乎大致相同,但
.groupby似乎更灵活(例如,我也可以使用.apply而不是.agg以获得更进化的聚合)。 -
没问题。在
pandas的最新版本中,当您拥有DatetimeIndex时,.resample()方法的工作方式更像groupby;你甚至可以做df.resample().apply()。请参阅docs 了解更多信息。
标签: python pandas dataframe hdfstore