TSDataset
是 PaddleTS 中一个主要的类结构,用于表示绝大多数的时序样本数据,并作为PaddleTS其他算子的输入以及输出对象。TSDataset 包涵两类时序数据:
- 待预测目标:表示希望被预测的时序序列
- 协变量:无需被预测的时间序列,协变量的加入通常用于辅助提高模型预测的效果
TSDataset支持的时序样本数据可以分为:
- 单变量数据,只包含单列的预测目标,同时可以包涵单列或者多列协变量
- 多变量数据,包涵多列预测目标,同时可以包涵单列或者多列协变量
我们将非预测目标变量定义为协变量,在时序数据中,协变量可分为以下三种:
观测协变量 (observed_cov):
指只能在历史中观察到的变量数据,例如测量的温度
可预知协变量 (known_cov):
指可在预测未来时间已知的变量,例如天气预报
静态协变量 (static_cov):
指整个时间范围内保持不变的变量
一个 TSDataset
对象由一个或者多个 TimeSeries
对象构成,每个 TimeSeries
可分别代表target(待预测目标), observed_covariate(观测协变量)以及known_covariate(可预知协变量)。
TimeSeries 是用于表示时序数据的最小粒度;可以分别代表target, observed_covariate 或者known_covariate 其中一种类型。TimeSeries本身可以是单变量或者多变量。
TimeSeries
需要转换成 TSDataset
对象才能在 PaddleTS
中使用
基于 pandas.DataFrame
或者CSV文件构建一个只包含 tareget
序列的TSDataset:
import pandas as pd
import numpy as np
from paddlets import TSDataset
x = np.linspace(-np.pi, np.pi, 200)
sinx = np.sin(x) * 4 + np.random.randn(200)
df = pd.DataFrame(
{
'time_col': pd.date_range('2022-01-01', periods=200, freq='1h'),
'value': sinx
}
)
target_dataset = TSDataset.load_from_dataframe(
df, #Also can be path to the CSV file
time_col='time_col',
target_cols='value',
freq='1h'
)
target_dataset.plot()
构建一个既包含target序列,也包含协变量序列的TSDataset:
方法1:
import pandas as pd
from paddlets import TSDataset
df = pd.DataFrame(
{
'time_col': pd.date_range('2022-01-01', periods=200, freq='1h'),
'value': sinx,
'known_cov_1': sinx + 4,
'known_cov_2': sinx + 5,
'observed_cov': sinx + 8,
'static_cov': [1 for i in range(200)],
}
)
target_cov_dataset = TSDataset.load_from_dataframe(
df,
time_col='time_col',
target_cols='value',
known_cov_cols=['known_cov_1', 'known_cov_2'],
observed_cov_cols='observed_cov',
static_cov_cols='static_cov',
freq='1h'
)
target_cov_dataset.plot(['value', 'known_cov_1', 'known_cov_2', 'observed_cov'])
import pandas as pd
from paddlets import TSDataset
x_l = np.linspace(-np.pi, np.pi, 300)
sinx_l = np.sin(x_l) * 4 + np.random.randn(300)
df = pd.DataFrame(
{
'time_col': pd.date_range('2022-01-01', periods=300, freq='1h'),
'known_cov_1': sinx_l + 4,
'known_cov_2': sinx_l + 5
}
)
known_cov_dataset = TSDataset.load_from_dataframe(
df,
time_col='time_col',
known_cov_cols=['known_cov_1', 'known_cov_2'],
freq='1h'
)
df = pd.DataFrame(
{
'time_col': pd.date_range('2022-01-01', periods=200, freq='1h'),
'observed_cov': sinx + 8
}
)
observed_cov_dataset = TSDataset.load_from_dataframe(
df,
time_col='time_col',
observed_cov_cols='observed_cov',
freq='1h'
)
target_cov_dataset = TSDataset.concat([target_dataset, known_cov_dataset, observed_cov_dataset])
target_cov_dataset.plot(['value', 'known_cov_1', 'known_cov_2', 'observed_cov'])
方法3:
import pandas as pd
from paddlets import TSDataset
from paddlets import TimeSeries
df = pd.DataFrame(
{
'time_col': pd.date_range('2022-01-01', periods=300, freq='1h'),
'known_cov_1': sinx_l + 4,
'known_cov_2': sinx_l + 5,
}
)
known_cov_dataset = TimeSeries.load_from_dataframe(
df,
time_col='time_col',
value_cols=['known_cov_1', 'known_cov_2'],
freq='1h'
)
df = pd.DataFrame(
{
'time_col': pd.date_range('2022-01-01', periods=200, freq='1h'),
'observed_cov': sinx + 8
}
)
observed_cov_dataset = TimeSeries.load_from_dataframe(
df,
time_col='time_col',
value_cols='observed_cov',
freq='1h'
)
target_cov_dataset = target_dataset.copy()
target_cov_dataset.known_cov = known_cov_dataset
target_cov_dataset.observed_cov = observed_cov_dataset
target_cov_dataset.plot(['value', 'known_cov_1', 'known_cov_2', 'observed_cov'])
如果提供的原始样本数据存在缺失值,我们可以通过TSDataset构建时的自动填充功能实现缺失值的填充,目前支持7种填充方式。
import pandas as pd
import numpy as np
from paddlets import TSDataset
df = pd.DataFrame(
{
'time_col': pd.date_range('2022-01-01', periods=200, freq='1h'),
'value': sinx,
'known_cov_1': sinx + 4,
'known_cov_2': sinx + 5,
'observed_cov': sinx + 8,
'static_cov': [1 for i in range(200)],
}
)
df.loc[1, 'value'] = np.nan
target_cov_dataset = TSDataset.load_from_dataframe(
df,
time_col='time_col',
target_cols='value',
known_cov_cols=['known_cov_1', 'known_cov_2'],
observed_cov_cols='observed_cov',
static_cov_cols='static_cov',
freq='1h',
fill_missing_dates=True,
fillna_method='pre' #max, min, avg, median, pre, back, zero
)
print(target_cov_dataset['value'][1])
#0.0
数据画图展示
target_cov_dataset.plot(['value'])
通过调用 TSDataset.summary
方法即可实现对数据统计信息的查看。
target_cov_dataset.summary()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vwxzdkwH-1668671295243)(2.PaddleTS之TS.assets/ALL_SUMMARY.png)]
train_dataset, val_test_dataset = target_cov_dataset.split(0.8)
val_dataset, test_dataset = val_test_dataset.split(0.5)
train_dataset.plot(add_data=[val_dataset,test_dataset])
train_dataset
new_line = pd.Series(
np.array(range(200)),
index=pd.date_range('2022-01-01', periods=200, freq='1D')
)
## option 1:
## The name of new column which need not to exists in TSDataset`s columns
## The type of value is pd.Series
## type represent the TimeSeries where to put the new column, konw_cov by default
## The index of value must be same as the index of the TSDataset object
target_cov_dataset.set_column(
column='new_b',
value=new_line,
type='observed_cov'
)
## option 2:
## The option is equal to option 1 which type is default
target_cov_dataset['new_b'] = new_line
## option 1:
## The name of new column which need to exists in TSDataset`s columns
## The type of value is pd.Series
## The index of value must be same as the index of the TSDataset object
target_cov_dataset.set_column(
column='observed_cov',
value=new_line
)
## Option 2:
## No different from option 1
target_cov_dataset['observed_cov'] = new_line
## Delete column
target_cov_dataset.drop('new_b')
## Delete columns
target_cov_dataset.drop(['known_cov_1', 'new_b'])
## Get column
column = target_cov_dataset['known_cov_2'] # The type of column is pd.Serie
## Get columns
columns = target_cov_dataset[['known_cov_2', 'observed_cov']] # The type of columns is pd.DataFrame
dtypes = target_cov_dataset.dtypes
print(dtypes)
value int64
known_cov_1 int64
known_cov_2 int64
observed_cov int64
dtype: object
target_cov_dataset.astype('float32')
dtypes = target_cov_dataset.dtypes
print(dtypes)
value float32
known_cov_1 float32
known_cov_2 float32
observed_cov float32
dtype: object
columns = target_cov_dataset.columns
print(columns)
#{'value': 'target', 'known_cov_1': 'known_cov', 'known_cov_2': 'known_cov', 'observed_cov': 'observed_cov'}
导入自己的csv文件并转成TSDataset数据集同时打印summary信息
## 加载源数据集
def load_datasets_src(file_path):
# 文件路径
# file_path = '../Data/Minute2022-01-11-15-01-00-0733.csv'
# 1 prepare the data
# 相关变量可以是known也可以是observed,区别是未来预测期是否可知~observed,顾名思义基于观测而得知的变量,历史可知,未来不可知
datasets = TSDataset.load_from_csv(file_path, time_col='Date',
target_cols=['L#SVR4_VAR226_A'],
observed_cov_cols=None,
known_cov_cols=['L#SVR4_VAR893_A', 'L#SVR4_VAR892_A', 'L#SVR4_VAR786_A',
'L#SVR4_VAR224_A'],
static_cov_cols=None,
freq=None,
fill_missing_dates=False,
fillna_method=None,
fillna_window_size=10,
drop_tail_nan=True
)
print(datasets.summary())
return datasets
导入自己的CSV文件转成TSDataset数据集并使用Ksigma方法对数据完成异常值检测以及修正
## 加载处理后的数据集
def load_datasets_pross(file_path,
time_col='Date',
# target_cols=['L#SVR4_VAR530_A'],
target_cols=['L#SVR4_VAR226_A'],
observed_cov_cols=None,
# known_cov_cols = ['L#SVR4_VAR527_A','L#SVR4_VAR226_A','L#SVR4_VAR224_A','L#SVR4_VAR14_A'],
known_cov_cols=['L#SVR4_VAR893_A', 'L#SVR4_VAR892_A', 'L#SVR4_VAR786_A'],
static_cov_cols=None,
freq=None,
fill_missing_dates=True,
fillna_method='pre',
fillna_window_size=60,
drop_tail_nan=True):
# 文件路径
# file_path = '../Data/Minute2022-01-11-15-01-00-0733.csv'
# 1 prepare the data
# 相关变量可以是known也可以是observed,区别是未来预测期是否可知~observed,顾名思义基于观测而得知的变量,历史可知,未来不可知
datasets = TSDataset.load_from_csv(file_path, time_col=time_col,
target_cols=target_cols,
observed_cov_cols=observed_cov_cols,
known_cov_cols=known_cov_cols,
static_cov_cols=static_cov_cols,
freq='1T', # 1Y-一年,1M-一个月,1D-一天,1H-一小时,1T/1min-一分钟,1s-一秒
fill_missing_dates=fill_missing_dates,
fillna_method=fillna_method,
fillna_window_size=fillna_window_size,
drop_tail_nan=drop_tail_nan
)
print(datasets.summary())
# 利用ksima方法对数据完成异常值检测以及修正:https://paddlets.readthedocs.io/zh_CN/latest/source/api/paddlets.transform.ksigma.html
ksigma = KSigma(['L#SVR4_VAR226_A', 'L#SVR4_VAR893_A', 'L#SVR4_VAR892_A', 'L#SVR4_VAR786_A'], 1.0)
datasets = ksigma.fit_transform(datasets)
print(datasets.summary())
# datasets.target.data.index.name == None
return datasets