Использовать применить к сегменту временного ряда панды DataFrame? - PullRequest
0 голосов
/ 05 февраля 2019

Я вписываю временные ряды в модель 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)

Это невероятно медленно для больших наборов данных, и я знаю, что вы не должны зацикливаться на пандах, когда этого можно избежать.Есть ли способ сделать это, используя apply или другие более эффективные методы с пандами или numpy?

Последний столбец данных - это доля дня.Я использую это, чтобы замаскировать данные, чтобы последний временной шаг в каждой выборке составлял два раза:

# 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 голосов
/ 05 февраля 2019

Вы можете предварительно выделить выходной массив Numpy и выполнить итерацию по меньшему измерению t_steps, чтобы немного ускорить процесс.Циклы for в 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 мс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...