【发布时间】: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