数据集定义, 加载以及操作

TSDataset

TSDatasetPaddleTS 中一个主要的类结构,用于表示绝大多数的时序样本数据,并作为PaddleTS其他算子的输入以及输出对象。TSDataset 包涵两类时序数据:

  1. 待预测目标:表示希望被预测的时序序列

  2. 协变量:无需被预测的时间序列,协变量的加入通常用于辅助提高模型预测的效果

TSDataset支持的时序样本数据可以分为:

  1. 单变量数据,只包含单列的预测目标,同时可以包涵单列或者多列协变量

  2. 多变量数据,包涵多列预测目标,同时可以包涵单列或者多列协变量

我们将非预测目标变量定义为协变量,在时序数据中,协变量可分为以下三种:

  1. 观测协变量 (observed_cov):

    指只能在历史中观察到的变量数据,例如测量的温度

  2. 可预知协变量 (known_cov):

    指可在预测未来时间已知的变量,例如天气预报

  3. 静态协变量 (static_cov):

    指整个时间范围内保持不变的变量

一个 TSDataset 对象由一个或者多个 TimeSeries 对象构成,每个 TimeSeries 可分别代表target(待预测目标), observed_covariate(观测协变量)以及known_covariate(可预知协变量)。

TimeSeries

TimeSeries 是用于表示时序数据的最小粒度;可以分别代表target, observed_covariate 或者known_covariate 其中一种类型。TimeSeries本身可以是单变量或者多变量。

TimeSeries 需要转换成 TSDataset 对象才能在 PaddleTS 中使用

使用示例

构建TSDataset

基于 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()

CUS_DATASET_2

构建一个既包含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'])

V_K2_O

方法2:

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

T_K2L_O

方法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'])

T_K2L_O

如果提供的原始样本数据存在缺失值,我们可以通过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'])

CUS_DATASET_2

通过调用 TSDataset.summary 方法即可实现对数据统计信息的查看。

target_cov_dataset.summary()

ALL_SUMMARY

构建训练、验证以及测试数据集

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

T_V_T_2

增加列

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'}