【发布时间】:2021-10-08 20:23:44
【问题描述】:
我正在尝试加快一些用于计算 pandas 时间索引数据帧滞后的代码。 数据框包含由 ID 列标识的约 200k 时间序列。 我尝试了 dask 但没有任何改进(比单独使用 pandas 需要更长的时间)。
这是一个生成具有可比大小的虚拟数据框的工作示例:
import itertools as it
import numpy as np
import pandas as pd
np.random.seed(1)
#Series for ID
ID_data = pd.Series(np.arange(0,200000), name='ID')
#Array of data - create pandas dataframe with datetime index
value_data = np.random.rand(52,1)
tidx = pd.date_range('2019-01-01', periods=len(value_data), freq='D')
#Cross join with ID to create test dataframe
df = pd.DataFrame(value_data, columns=['value'], index=tidx).reset_index().merge(ID_data,how="cross").set_index('index')
现在,我想为每个时间序列(由 ID 列标识)计算值列的滞后(在本例中为 1 天滞后):
%%time
df["value_lag1"] = df.groupby(['ID'])["value"].transform(lambda x: x.shift(1))
此代码需要 30 秒才能执行。你知道任何有效的加速方法吗?
谢谢 最好的问候
【问题讨论】:
-
示例脚本给了我:pandas.errors.MergeError: No common columns to perform merge on。
-
嗨,我有以下 pandas/numpy 版本:
print(pd.__version__) -> 1.3.1 print(np.__version__) -> 1.19.5 -
我在笔记本上的空白笔记本上做了一个测试,没问题(使用相同的 pandas 版本)
-
看起来我的有点旧(1.0.5 和 1.18.4)。我会更新并再试一次。
-
已更新,测试脚本有效。
标签: python pandas dataframe parallel-processing time-series