2.深度学习时序建模库PaddleTS教程之TSDataset数据集

TSDataset

TSDataset 是 PaddleTS 中一个主要的类结构,用于表示绝大多数的时序样本数据,并作为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()

2.深度学习时序建模库PaddleTS教程之TSDataset数据集_第1张图片

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

2.深度学习时序建模库PaddleTS教程之TSDataset数据集_第2张图片
方法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'])

2.深度学习时序建模库PaddleTS教程之TSDataset数据集_第3张图片

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

2.深度学习时序建模库PaddleTS教程之TSDataset数据集_第4张图片

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

2.深度学习时序建模库PaddleTS教程之TSDataset数据集_第5张图片

通过调用 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])

2.深度学习时序建模库PaddleTS教程之TSDataset数据集_第6张图片

增加列

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

你可能感兴趣的:(数据分析与建模,深度学习,python,人工智能)