为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯7119047 2022-05-24 16:42:52
我有一个 Pandas 数据框,其中n行和k列加载到内存中。我想为预测任务获取批次,其中批次的第一个训练示例应该具有(q, k)参考q原始数据帧中的行数(例如 0:128)的形状。下一个例子应该是(128:256, k)等等。因此,最终,一批应该具有(32, q, k)与批量大小相对应的 32 形状。由于TensorDatasetfromdata_utils在这里不起作用,我想知道最好的方法是什么。我尝试使用将qnp.array_split()值的可能拆分数作为第一维,以便编写自定义 DataLoader,但由于并非所有数组都具有相同的形状,因此不能保证重新整形。这是一个更清楚的最小示例。在这种情况下,批量大小为 3,q为 2:import pandas as pdimport numpy as npdf = pd.DataFrame(data=np.arange(0,30).reshape(10,3),columns=['A','B','C'])数据集:    A   B   C0   0   1   21   3   4   52   6   7   83   9   10  114   12  13  145   15  16  176   18  19  207   21  22  238   24  25  269   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.]]])
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

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


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])


查看完整回答
反对 回复 2022-05-24
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

您可以编写 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]


查看完整回答
反对 回复 2022-05-24
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

另一种方法是使用开源库 pytorch_forecasting。

时间序列数据集的链接可以在这里找到

使用此数据集的摘录:
该数据集自动执行常见任务,例如

  1. 变量的缩放和编码

  2. 标准化目标变量

  3. 有效地将 pandas 数据帧中的时间序列转换为火炬张量

  4. 持有关于未来已知和未知的静态和时变变量的信息

  5. 持有相关类别的信息(如假期)

  6. 数据增强的下采样

  7. 生成推理、验证和测试数据集


查看完整回答
反对 回复 2022-05-24
  • 3 回答
  • 0 关注
  • 255 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信