使用适用于分段时间序列的熊猫DataFrame吗?

时间:2019-02-05 18:38:17

标签: python pandas numpy keras time-series

我正在将时间序列加入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或数据生成器可以更高效地完成。

1 个答案:

答案 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毫秒。