gpt4 book ai didi

python - 如何滞后 pandas 系列并创建新的时间滞后数据框?

转载 作者:行者123 更新时间:2023-12-01 08:38:46 24 4
gpt4 key购买 nike

我想从 pandas 系列创建一个时间滞后的 pandas 数据框。

给定 pandas 系列:

X = pd.Series(range(5))

预期输出:

    0   1   2
0 0 1 2.0
1 1 2 3.0
2 2 3 4.0
3 3 4 0.0

我已经实现了以下函数(具有步长),但它在大型数据集上需要很长时间

def creat_time_lagged(x, shift, step):
df = pd.DataFrame()
for i in range(0, len(x), step):
if i + shift - 1 < len(x):
df['{}'.format(i)] = x.iloc[i : i + shift].values
else:
df['{}'.format(i)] = np.append(x.iloc[i:].values, np.zeros(shift - len(x.iloc[i:].values)))
break
return df

我该如何改进它?

最佳答案

方法#1

我们可以利用np.lib.stride_tricks.as_strided基于scikit-image's view_as_windows获得滑动 window 。 More info on use of as_strided based view_as_windows .

from skimage.util.shape import view_as_windows

def create_time_lagged_viewaswindows(X, shift, step):
a_ext = np.r_[X.values,np.zeros(shift-1,dtype=X.dtype)]
windows_ar = view_as_windows(a_ext,shift)[:len(X)-shift+step+1:step].T
return pd.DataFrame(windows_ar)

一些解释:基本思想是我们在尾部填充零,然后创建滑动窗口。为了创建窗口,我们使用np.lib.stride_tricks.as_stridedskimage.util.view_as_windows

示例运行 -

In [166]: X = pd.Series(range(5))

In [167]: create_time_lagged_viewaswindows(X, shift=4, step=1)
Out[167]:
0 1 2
0 0 1 2
1 1 2 3
2 2 3 4
3 3 4 0

In [168]: create_time_lagged_viewaswindows(X, shift=4, step=2)
Out[168]:
0 1
0 0 2
1 1 3
2 2 4
3 3 0

方法#2

我们还可以使用np.lib.stride_tricks.as_strided,这需要我们手动设置步幅和形状参数,但我们会避免使用早期方法中使用的转置,并且这可能值得额外的性能提升。实现看起来像这样 -

def create_time_lagged_asstrided(X, shift, step):  
a_ext = np.r_[X.values,np.zeros(shift-1,dtype=X.dtype)]
strided = np.lib.stride_tricks.as_strided
s = a_ext.strides[0]
ncols = (len(X)-shift+2*step)//step
windows_ar = strided(a_ext, shape=(shift,ncols), strides=(s,step*s))
return pd.DataFrame(windows_ar)

大型数组的计时 -

In [215]: X = pd.Series(range(10000))

# Original solution
In [216]: %timeit creat_time_lagged(X, shift=10, step=5)
1 loop, best of 3: 608 ms per loop

# Approach #1
In [217]: %timeit create_time_lagged_viewaswindows(X, shift=10, step=5)
10000 loops, best of 3: 146 µs per loop

# Approach #2
In [218]: %timeit create_time_lagged_asstrided(X, shift=10, step=5)
10000 loops, best of 3: 104 µs per loop

关于python - 如何滞后 pandas 系列并创建新的时间滞后数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53581431/

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