【问题标题】:How to speed up resample procedure in Pandas?如何加快 Pandas 中的重采样过程?
【发布时间】:2016-08-26 13:14:23
【问题描述】:

假设您有一个包含 1 分钟时间序列的数据框,其中包含索引、4 列和 400 万行。当您尝试执行以下操作时:

 conversion = {'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'}
 df1 = df.resample('5Min', how=conversion)

这需要很长的时间(20-30 分钟)。我怎样才能加快这个过程?

熊猫 18,Python 2.7

【问题讨论】:

  • 随机生成的数据(4 列 400 万行)对我来说需要 247 毫秒。
  • @ayhan 你能发布你用来生成数据的代码吗?
  • @ayhan,你生成了什么dtypes?你能发布你的代码吗?
  • 索引:idx = pd.date_range('1/1/2010', periods=4000000, freq='T'),数据:df = pd.DataFrame(np.random.rand(4000000, 4), columns = ["Open", "High", "Low", "Close"], index = idx) 测试:%timeit df.resample("5Min").agg(conversion)(您的代码也差不多)
  • @ayhan,我想你可以发布你的 prove snippet 作为答案 - 它表明 resample() 不是罪魁祸首,IMO 回答了这个问题

标签: python python-2.7 pandas dataframe resampling


【解决方案1】:

重采样似乎在大小为 (4000000, 4) 的数据集上运行得非常快:

idx = pd.date_range('1/1/2010', periods=4000000, freq='T')
df = pd.DataFrame(np.random.rand(4000000, 4), columns = ["Open", "High", "Low", "Close"], index = idx)
%timeit df.resample("5Min").agg(conversion)
1 loop, best of 3: 253 ms per loop

带有不规则索引和一些 nan 的:

idx1 = pd.date_range('1/1/1900', periods=10000000, freq='Min')
idx2 = pd.date_range('1/1/1940', periods=10000000, freq='Min')
idx3 = pd.date_range('1/1/1980', periods=10000000, freq='Min')
idx4 = pd.date_range('1/1/2020', periods=10000000, freq='Min')
idx = np.array([np.random.choice(idx1, 1000000), np.random.choice(idx2, 1000000), np.random.choice(idx3, 1000000), 
                np.random.choice(idx4, 1000000)]).flatten()
np.random.shuffle(idx)
df = pd.DataFrame(np.random.randint(100, size=(4000000, 4)), columns = ["Open", "High", "Low", "Close"], index = idx)
df.loc[np.random.choice(idx, 100000), "Open"] = np.nan
df.loc[np.random.choice(idx, 50000), "High"] = np.nan
df.loc[np.random.choice(idx, 500000), "Low"] = np.nan
df.loc[np.random.choice(idx, 20000), "Close"] = np.nan
%timeit df.resample("5Min").agg(conversion)
1 loop, best of 3: 5.06 s per loop

因此,对于您的案例,似乎除了重新采样之外的其他事情需要时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2019-04-15
    • 2013-06-09
    • 2019-05-25
    • 2022-11-13
    • 2018-02-24
    • 2023-03-24
    相关资源
    最近更新 更多