【问题标题】:Use apply to segment time series pandas DataFrame?使用适用于分段时间序列 Pandas DataFrame?
【发布时间】:2019-06-29 15:50:01
【问题描述】:

我将时间序列输入到 Keras LSTM 模型中,并且我有所需的形状输入 (586075,30,8)。我现在的做法是:

# DataFrame input shape
print(train_features.shape)
(586105, 8)

x_train = []
y_train = []
t_steps = 30
# Segmenting Data
for i in range(t_steps, train_features.shape[0]):
    x_train.append(train_features[i-t_steps:i,:] )#upper bound in slice excluded
    y_train.append(train_targets[i-1,:] ) 
x_train, y_train = np.array(x_train), np.array(y_train)

print(x_train.shape, y_train.shape)
(586075,30,8) (586075,8)

对于大型数据集来说,速度非常慢,而且我知道在可以避免的情况下,您不应该在 pandas 中循环。有没有办法在 pandas 或 numpy 中使用 apply 或其他更有效的方法来做到这一点?

数据的最后一列是当天的分数。 我用它来屏蔽数据,所以每个样本的最后一个时间步长在两次之间:

# Filter for Times between 9:30 and 13:00
mask = np.where((x_train[:,-1,-1] > .3958) & (x_train[:,-1,-1] < .541667))
x_train = x_train[mask,:,:][0]
y_train = y_train[mask,:][0]

似乎这一切都可以一步完成,使用 apply 或数据生成器更有效。

【问题讨论】:

  • 您好 JHall651,我正在尝试理解第一部分代码中的循环。这个循环的目的是什么?您是否从数据框中定义目标和训练数据?很高兴能提供帮助,只是需要澄清一下。
  • @DouglasPearson 是的,我正在使用具有 8 列的连续时间序列的 DataFrame。在循环之前,我将 train_features 和 train_targets 分开,因此 train_targets 是具有类标签的连续时间序列,而 train_features 的长度相同,但具有数据特征。目标是获取 t_steps 长的时间序列样本。
  • 好的,所以您想要 x_train 的 3D 数据帧的输出并且循环创建 y_train 数据帧?还是您希望将 x_train 和 y_train 分成 30 行的块?
  • 对不起,我会澄清 train_features 和 train_targets 是 numpy 数组。不确定这是否会有所作为。目标是:输入一个 shape = (58105,8) 的数组。每一行都是一个时间观察。输出应该是一个 3 维数组。 new_array[i,:,:] 中的每个 i 应对应于原始输入数组的 30 行。所以 new_array[1,:,:] 将是 train_features 的第 1-30 行。 new_array[2,:,:] 将是 train_features 的第 2-31 行。没有必要同时执行 train_features 和 train_targets,因为我可以只对每个使用建议的方法一次。
  • 一切顺利! @Martin Valgur 击败了我!他的方法应该奏效。

标签: python pandas numpy keras time-series


【解决方案1】:

您可以预先分配输出 Numpy 数组并遍历较小的 t_steps 维度以加快速度。 Python 中的 for 循环如果保持较小,则不会那么糟糕。

def add_windowed_dim(arr, window_size):
    out = np.empty((window_size, arr.shape[0]-window_size, arr.shape[1]))        
    for i in range(window_size):                              
        out[i, :, :] = arr[i:-window_size+i, :]
    return np.rollaxis(out, 1)

x_train = add_windowed_dim(train_features, t_steps)
y_train = train_targets[t_steps-1:-1, :]

在您使用的大小相同的模拟数据集上,这将运行时间从 1350 毫秒提高到了 110 毫秒。

我觉得第二步很好。它的运行时间已经相对较短,为 77 毫秒。

【讨论】:

  • 感谢您的回复。我试图了解这是如何工作的。我注意到train_features 中的最后一行没有显示为x_train 的最后一行。 x_train[-1,:,:] == train_features[-2,:].
猜你喜欢
  • 1970-01-01
  • 2017-09-28
  • 2023-03-07
  • 2016-10-02
  • 2020-05-16
相关资源
最近更新 更多