gpt4 book ai didi

python - 应用滚动窗口并将堆叠的特征向量作为 DataFrame 返回

转载 作者:行者123 更新时间:2023-12-04 03:09:59 25 4
gpt4 key购买 nike

是否可以通过应用滚动窗口将序列转换为数据框,计算特征向量并将其作为结果数据框的一行?

对于下面的示例,如果我使用 apply(),我只能返回一个 float,这将导致另一个转换后的系列。但是,我想计算例如fft 并将每个 fft 结果堆叠到一个数据帧,用于我移动滚动窗口的每个时间步长。

import numpy as np
import pandas as pd
import seaborn as sns

N = 1000
ls = np.linspace(0, 2*np.pi, N)
s = np.sin(10*ls) + np.sin(2*ls) + np.sin(6*ls) + 0.2*np.random.rand(N)

df = pd.DataFrame(s, columns=['signal'])

def my_fft(s):
return np.abs(np.fft.fft(s))[:int(len(s)/2)]

# This works but it feels like a hack ..
l = list()

def test(x):
l.append(my_fft(x.copy()))
return np.sum(x)

df.signal.rolling(100).apply(lambda x: test(x))

df_fft = pd.DataFrame(l).T

sns.heatmap(df_fft)

df_fft 在每一行中都有相应窗口的 F​​FT 结果。有更好的方法吗?

最佳答案

这在我看来是pandas的不足。问题是 DataFrame.rolling.apply

func 参数

Must produce a single value from an ndarray input

下面的 NumPy 实现将通过扩展输入数组 a 的维度来让您滚动窗口。如果您传递具有形状 (1000,) 的 df.signal,并指定一个 100 的窗口,您将得到一个形状为 (901,100) 或 901 个长度为 100 的窗口的结果。它已经在 Stack Overflow 上流传了一段时间,我在下面做了一些细微的修改。

def rolling_windows(a, window):    
if window > a.shape[0]:
raise ValueError('Specified `window` length of {0} exceeds length of'
' `a`, {1}.'.format(window, a.shape[0]))
if isinstance(a, (Series, DataFrame)):
a = a.values
if a.ndim == 1:
a = a.reshape(-1, 1)
shape = (a.shape[0] - window + 1, window) + a.shape[1:]
strides = (a.strides[0],) + a.strides
windows = np.squeeze(np.lib.stride_tricks.as_strided(a, shape=shape,
strides=strides))
# In cases where window == len(a), we actually want to "unsqueeze" to 2d.
# I.e., we still want a "windowed" structure with 1 window.
if windows.ndim == 1:
windows = np.atleast_2d(windows)
return windows

然后您可以在结果上使用 np.apply_along_axis。全面披露,从技术上讲,您可以将其称为美化的 for 循环,但它往往非常快。

以你的例子:

# np.random.seed(123)
df_fft = np.apply_along_axis(my_fft, 1, rolling_windows(df.signal, window=100))
df_fft = pd.DataFrame(df_fft, index=df.index[100-1:])
# df_fft.shape == (901, 50)

关于python - 应用滚动窗口并将堆叠的特征向量作为 DataFrame 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46037217/

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