PyTorch:用于时间序列任务的数据加载器

时间:2019-09-11 16:33:59

标签: python pandas pytorch torch

我有一个熊猫数据框,其中有 n 行和 k 列已加载到内存中。我想获得一个用于预测任务的批次,其中批次的第一个训练示例的形状应为(*q*,*k*),形状为q,是指原始数据帧中的行数(例如0:128)。下一个示例应该是(128:256, *k*),依此类推。因此,最终,一批应具有(32,*q*,*k*)的形状,其中32对应于批大小。

由于TensorDataset中的data_utils在这里不起作用,我想知道最好的方法是什么。为了编写自定义DataLoader,我尝试使用np.array_split()来获取 q 值的可能分割数作为第一维,但是由于并非所有数组都具有重整形,因此不能保证重塑相同的形状。

这里是一个使它更清晰的最小示例。在这种情况下,批量大小为3, q 为2:

import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.arange(0,30).reshape(10,3),columns=['A','B','C'])

数据集:

    A   B   C
0   0   1   2
1   3   4   5
2   6   7   8
3   9   10  11
4   12  13  14
5   15  16  17
6   18  19  20
7   21  22  23
8   24  25  26
9   27  28  29

在这种情况下,第一批应具有(3,2,3)形状,如下所示:

array([[[ 0.,  1.,  2.],
        [ 3.,  4.,  5.]],

       [[ 3.,  4.,  5.],
        [ 6.,  7.,  8.]],

       [[ 6.,  7.,  8.],
        [ 9., 10., 11.]]])

2 个答案:

答案 0 :(得分:3)

我最终也写了自定义数据集,尽管它与上面的答案有些不同:

class TimeseriesDataset(torch.utils.data.Dataset):   
    def __init__(self, X, y, seq_len=1):
        self.X = X
        self.y = y
        self.seq_len = seq_len

    def __len__(self):
        return self.X.__len__() - (self.seq_len-1)

    def __getitem__(self, index):
        return (self.X[index:index+self.seq_len], self.y[index+self.seq_len-1])

用法如下:

train_dataset = TimeseriesDataset(X_lstm, y_lstm, seq_len=4)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size = 3, shuffle = False)

for i, d in enumerate(train_loader):
    print(i, d[0].shape, d[1].shape)

>>>
# shape: tuple((batch_size, seq_len, n_features), (batch_size))
0 torch.Size([3, 4, 2]) torch.Size([3])

答案 1 :(得分:1)

您可以编写TensorDataset的类似物。为此,您需要从Dataset类继承。

from torch.utils.data import Dataset, DataLoader

class MyDataset(Dataset):
    def __init__(self, data_frame, q):
        self.data = data_frame.values
        self.q = q

    def __len__(self):
        return self.data.shape[0] // self.q

    def __getitem__(self, index):
        return self.data[index * self.q: (index+1) * self.q]