我正在将时间序列加入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)
对于大型数据集,它的运行速度极其慢,而且我知道,在可以避免的情况下,您不应该在熊猫中循环播放。有没有办法使用大熊猫或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或数据生成器可以更高效地完成。
答案 0 :(得分: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 ms改进为110 ms。
第二步对我来说很好。它的运行时间已经相对较短,为77毫秒。