PyTorch:时间序列任务的数据加载器
PyTorch: Dataloader for time series task
我有一个 Pandas 数据框,其中 n
行和 k
列加载到内存中。我想为预测任务获取批次,其中批次的第一个训练示例的形状应为 (q, k)
,其中 q
指的是原始数据帧中的行数(例如 0:128) .下一个例子应该是 (128:256, k)
等等。因此,最终,一批的形状应为 (32, q, k)
,其中 32 对应于批大小。
由于 data_utils
中的 TensorDataset
在这里不起作用,我想知道最好的方法是什么。我尝试使用 np.array_split()
来获取 q 值的可能拆分数作为第一维,以便编写自定义 DataLoader 但是不能保证重塑工作,因为并非所有数组具有相同的形状。
这里是一个最小的例子,以使其更清楚。在这种情况下,批量大小为 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.]]])
您可以编写 TensorDataset 的模拟程序。为此,您需要从数据集 class.
继承
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]
我最终也编写了自定义数据集,尽管它与上面的答案有点不同:
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])
另一种方法是使用开源库 pytorch_forecasting。
Link到时间序列数据集可以查到here
关于此数据集使用的摘录:
数据集自动执行常见任务,例如
- 变量的缩放和编码
- 标准化目标变量
- 有效地将 pandas 数据帧中的时间序列转换为 torch
张量
- 持有关于静态和time-varying已知变量的信息
未来未知
- 持有相关类别(例如假期)的信息
- 用于数据扩充的下采样
- 生成推理、验证和测试数据集
教程here
我有一个 Pandas 数据框,其中 n
行和 k
列加载到内存中。我想为预测任务获取批次,其中批次的第一个训练示例的形状应为 (q, k)
,其中 q
指的是原始数据帧中的行数(例如 0:128) .下一个例子应该是 (128:256, k)
等等。因此,最终,一批的形状应为 (32, q, k)
,其中 32 对应于批大小。
由于 data_utils
中的 TensorDataset
在这里不起作用,我想知道最好的方法是什么。我尝试使用 np.array_split()
来获取 q 值的可能拆分数作为第一维,以便编写自定义 DataLoader 但是不能保证重塑工作,因为并非所有数组具有相同的形状。
这里是一个最小的例子,以使其更清楚。在这种情况下,批量大小为 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.]]])
您可以编写 TensorDataset 的模拟程序。为此,您需要从数据集 class.
继承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]
我最终也编写了自定义数据集,尽管它与上面的答案有点不同:
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])
另一种方法是使用开源库 pytorch_forecasting。
Link到时间序列数据集可以查到here
关于此数据集使用的摘录:
数据集自动执行常见任务,例如
- 变量的缩放和编码
- 标准化目标变量
- 有效地将 pandas 数据帧中的时间序列转换为 torch 张量
- 持有关于静态和time-varying已知变量的信息 未来未知
- 持有相关类别(例如假期)的信息
- 用于数据扩充的下采样
- 生成推理、验证和测试数据集
教程here