Python 是否使用“应用于分段时间序列数据帧”?

Python 是否使用“应用于分段时间序列数据帧”?,python,pandas,numpy,keras,time-series,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(

我正在将时间序列输入到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]
#过滤9:30到13:00之间的时间
掩码=np.式中((x_列[:,-1,-1]>0.3958)和(x_列[:,-1,-1]<0.541667))
x_-train=x_-train[mask,:,:][0]
y_train=y_train[mask,:][0]

看起来这一切都可以在一个步骤中完成,使用apply或数据生成器效率更高

您可以预先分配输出Numpy数组,并迭代较小的
t_步数
维度,以加快速度。因为Python中的循环如果保持很小,就不会那么糟糕

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

您可以预先分配输出Numpy数组,并在较小的
t_步数
维度上迭代,以加快速度。因为Python中的循环如果保持很小,就不会那么糟糕

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

Hi JHall651,我正在试图理解代码第一部分中的循环。这个循环的目的是什么?您是否从数据帧定义目标和训练数据?很乐意帮助您,只是需要澄清。@DouglasPearson是的,我使用的是一个数据帧,它具有8列的连续时间序列。在循环之前,我将其分为train_特征和train_目标,因此train_目标是一个具有类标签的连续时间序列,train_特征长度相同,但具有数据特征。目标是获取t_步长的时间序列样本。好的,那么您想要x_列的3D数据帧输出,循环创建y_列数据帧?或者您希望将x_列和y_列分成30行的块?抱歉,我将澄清,train_功能和train_目标是numpy数组。我不确定这是否有区别。目标是:让数组以shape=(58105,8)输入。每一行都是一个时间观察。输出应该是一个三维数组。新_数组[i,:,:]中的每个i应该对应于原始输入数组的30行。所以新的_数组[1,:,:]将是train_特性的第1-30行。新的_数组[2,:,:]将是train_特性的第2-31行。没有必要同时做train_特性和train_目标,因为我可以只使用建议的方法一次。很好@马丁·瓦尔格击败了我!他的方法应该行得通。嗨,JHall651,我正在试图理解代码第一部分中的循环。这个循环的目的是什么?您是否从数据帧定义目标和训练数据?很乐意帮助您,只是需要澄清。@DouglasPearson是的,我使用的是一个数据帧,它具有8列的连续时间序列。在循环之前,我将其分为train_特征和train_目标,因此train_目标是一个具有类标签的连续时间序列,train_特征长度相同,但具有数据特征。目标是获取t_步长的时间序列样本。好的,那么您想要x_列的3D数据帧输出,循环创建y_列数据帧?或者您希望将x_列和y_列分成30行的块?抱歉,我将澄清,train_功能和train_目标是numpy数组。我不确定这是否有区别。目标是:让数组以shape=(58105,8)输入。每一行都是一个时间观察。输出应该是一个三维数组。新_数组[i,:,:]中的每个i应该对应于原始输入数组的30行。所以新的_数组[1,:,:]将是train_特性的第1-30行。新的_数组[2,:,:]将是train_特性的第2-31行。没有必要同时做train_特性和train_目标,因为我可以只使用建议的方法一次。很好@马丁·瓦尔格击败了我!他的方法应该行得通。谢谢你的回复。我正在努力理解这是如何工作的。我注意到
train\u功能中的最后一行
并没有显示为
x\u train
的最后一行<代码>x_系列[-1,:,:]==系列功能[-2,:]。感谢您的回复。我正在努力理解这是如何工作的。我注意到
train\u功能中的最后一行
并没有显示为
x\u train
的最后一行<代码>x列[-1,:,:]==列特征[-2,:]。