【发布时间】:2019-08-19 09:35:35
【问题描述】:
我的问题
我在重采样功能与 groupby 结合使用时遇到问题。我正在做的操作目前对 5000 行的数据样本需要 8 秒以上的时间,这完全不符合我的要求。
样本数据(500 行)
将数据作为字典的粘贴箱:https://pastebin.com/RPNdhXsy
逻辑
我有一个季度间隔日期的数据,我想按列分组,然后每月对组内的日期重新采样。
Input:
isin report_date val
SE001 2018-12-31 1
SE001 2018-09-30 2
SE001 2018-06-31 3
US001 2018-10-31 4
US001 2018-07-31 5
Output:
isin report_date val
SE001 2018-12-31 1
2018-11-30 NaN
2018-10-31 NaN
2018-09-30 2
2018-08-31 NaN
2018-07-31 NaN
2018-06-30 3
US001 2018-10-30 4
2018-09-31 NaN
2018-08-31 NaN
2018-07-31 5
我曾经有过这样的操作:
df.groupby('isin').resample('M', on="report_date").first()[::-1]
由于asfreq() 的性能似乎比在resample 中使用on= 稍好,所以我目前改为执行以下操作。不过还是很慢。
我反转了,因为resample 似乎非可选地对日期进行降序排序。
df.set_index('report_date').groupby('isin').resample('M').asfreq()[::-1]
如上所述,有 5000 行和大约 16 列,这需要 15 秒才能运行,因为我需要在两个单独的数据帧上执行此操作。 使用 pastebin 中的示例数据(500 行),操作需要 0.7 秒,这对我来说太长了,因为我的最终数据将有 800k 行。
编辑:不同操作的时间
当前方式
setindex --- 0.001055002212524414 seconds ---
groupby --- 0.00033092498779296875 seconds ---
resample --- 0.004662036895751953 seconds ---
asfreq --- 0.8990700244903564 seconds ---
[::-1] --- 0.0013098716735839844 seconds ---
= 0.9056s
老办法
groupby --- 0.0005779266357421875 seconds ---
resample --- 0.0044629573822021484 seconds ---
first --- 1.6829369068145752 seconds ---
[::-1] --- 0.001600027084350586 seconds ---
= 1.6894s
由此判断,从pandas.core.resample.DatetimeIndexResamplerGroupby 转换为 df 似乎需要很长时间。现在呢?
EDIT2:使用重新索引
df.set_index('report_date').groupby('isin').apply(lambda x: x.reindex(pd.date_range(x.index.min(), x.index.max(), freq='M'), fill_value=0))[::-1]
这需要 0.28 秒,这是一个巨大的改进。不过还是不太好。
如何加快速度?有没有其他方法可以做同样的事情?
【问题讨论】:
-
这听起来有点慢。运行 groupby 并在单独的行上重新采样需要多长时间?通过分解它,您可以确定瓶颈是在 groupby 还是 resample 调用中?
-
@tnknepp 查看我的编辑
-
我认为你是对的,数据框的创建是瓶颈。我唯一的建议是也许不要重新采样到 1M 分辨率。您从季度数据开始,因此具有更高分辨率的所有内容都只有 NaN……尽管您可能有这样做的理由。
-
@tnknepp 我稍后执行操作,用正确的数据填充 NaN。我需要每个月成为它的单独行,因为在完成所有数据转换和计算后它们会进入数据库。
-
您的示例数据集已过期。
标签: python pandas pandas-groupby