将数据加载到 sktime 中#
本教程概述了与时间序列相关的文件格式以及如何将数据加载到 sktime 中。
用户可以通过两种主要方式加载数据或将其转换为与 sktime 兼容的格式
途径 1:直接从时间序列格式加载。可以从定制的时间序列存储格式(例如
.ts
(参见 用 .ts 文件表示数据))或其他支持的文件格式(例如 WekaARFF
和.tsv
(参见 其他现有数据源))直接加载数据。途径 2:在内存中加载,然后进行转换。sktime 提供了在常见内存表示形式之间转换的功能,请参阅
AA_datatypes_and_datasets
教程。因此,可以先通过任何加载工具(例如pandas.read_csv
)加载数据,然后手动将其转换为一种 sktime 兼容的规范,再使用 sktime 的convert
或convert_to
工具在规范之间进行转换。
本教程的其余部分介绍了途径 1,即如何从支持的文件格式加载数据。
## .ts 文件格式 一个常见的用例是加载本地存储的数据。为了便于操作,创建了 .ts
文件格式,用于以标准格式表示问题,以便与 sktime 一起使用。
用 .ts 文件表示数据#
.ts 文件包含两个主要部分
头部信息
数据
头部信息用于通过包含关于问题结构的元数据来促进数据的简单表示。头部包含以下内容
@problemName <problem name>
@timeStamps <true/false>
@univariate <true/false>
@classLabel <true/false> <space delimited list of possible class values>
@data
问题数据应在 @data 标签之后开始。在最简单的情况下,如果 @timestamps 为假,序列的值以逗号分隔列表表示,每个值的索引相对于其在列表中的位置 (0, 1, …, m)。一个 实例 可以包含 1 到多个维度,其中实例之间用换行符分隔,实例内的维度用冒号 (:) 分隔。例如
2,3,2,4:4,3,2,2
13,12,32,12:22,23,12,32
4,4,5,4:3,2,3,2
此示例数据有 3 个 实例,对应于上面显示的三行。每个实例有 2 个 维度,每个维度有 4 个观测值。例如,初始实例的第一个维度的时间点值是 2、3、2、4,第二个维度的时间点值是 4、3、2、2。
缺失读数可以使用 ? 表示。例如,
2,?,2,4:4,3,2,2
13,12,32,12:22,23,12,32
4,4,5,4:3,2,3,2
表示初始实例的第一个维度的第二个时间点值缺失。
另外,对于稀疏数据集,可以通过在头部将 @timestamps 设置为 true 来指定读数,并仅针对观测值使用 (时间戳, 值) 形式的元组表示数据。例如,上面示例中的第一个实例可以用这种表示形式指定为
(0,2),(1,3)(2,2)(3,4):(0,4),(1,3),(2,2),(3,2)
同样,更稀疏的示例
2,5,?,?,?,?,?,5,?,?,?,?,4
可以仅使用非缺失的时间戳表示为
(0,2),(1,5),(7,5),(12,4)
在使用 .ts 文件格式存储时间序列分类问题的数据时,实例的类标签应在最后一个维度中指定,并且应在头部信息中将 @classLabel 设置为 true,后跟可能的类值集合。例如,如果一个案例包含一个维度且类值为 1,则可以指定为
1,4,23,34:1
从 .ts 文件加载到 pandas DataFrame#
可以使用 sktime.datasets 中的以下方法从 .ts 文件加载数据集
load_from_tsfile(full_file_path_and_name, replace_missing_vals_with='NaN')
这可以通过使用 sktime 中 sktime/datasets/data 下包含的 Arrow Head 问题来演示
[1]:
import os
import sktime
from sktime.datasets import load_from_tsfile
DATA_PATH = os.path.join(os.path.dirname(sktime.__file__), "datasets/data")
train_x, train_y = load_from_tsfile(
os.path.join(DATA_PATH, "ArrowHead/ArrowHead_TRAIN.ts")
)
test_x, test_y = load_from_tsfile(
os.path.join(DATA_PATH, "ArrowHead/ArrowHead_TEST.ts")
)
ArrowHead 问题的训练集和测试集已加载到嵌套数据框中(面板数据的 nested_univ
格式),并附带一个类值数组。例如,下面是 train_x 和 train_y 的前 5 行
[2]:
train_x.head()
[2]:
dim_0 | |
---|---|
0 | 0 -1.963009 1 -1.957825 2 -1.95614... |
1 | 0 -1.774571 1 -1.774036 2 -1.77658... |
2 | 0 -1.866021 1 -1.841991 2 -1.83502... |
3 | 0 -2.073758 1 -2.073301 2 -2.04460... |
4 | 0 -1.746255 1 -1.741263 2 -1.72274... |
[3]:
train_y[0:5]
[3]:
array(['0', '1', '2', '0', '1'], dtype='<U1')
加载数据的格式可以通过 return_data_type
参数控制。
允许的字符串是与 sktime 兼容的 Panel
mtypes 的标识符字符串,如“数据类型和数据集”教程(AA_datatypes_and_datasets
)中介绍的。
如果提供,加载的内存中数据容器将符合该类型规范。
[4]:
train_x, train_y = load_from_tsfile(
os.path.join(DATA_PATH, "ArrowHead/ArrowHead_TRAIN.ts"), return_data_type="numpy3d"
)
[5]:
train_x
[5]:
array([[[-1.9630089, -1.9578249, -1.9561449, ..., -1.9053929,
-1.9239049, -1.9091529]],
[[-1.7745713, -1.7740359, -1.7765863, ..., -1.7292269,
-1.7756704, -1.7893245]],
[[-1.8660211, -1.8419912, -1.8350253, ..., -1.8625124,
-1.8633682, -1.8464925]],
...,
[[-2.1308119, -2.1044297, -2.0747549, ..., -2.0340977,
-2.0800313, -2.103448 ]],
[[-1.8803376, -1.8626622, -1.8496866, ..., -1.8485336,
-1.8640342, -1.8798851]],
[[-1.80105 , -1.7989155, -1.7783754, ..., -1.7965491,
-1.7985443, -1.80105 ]]])
## 加载其他文件格式 提供时间序列数据的研究人员还使用了另外两种常见格式,包括
Weka ARFF 文件
UCR .tsv 文件
从 Weka ARFF 文件加载#
也可以从 Weka 的属性-关系文件格式 (ARFF) 文件加载数据。东安格利亚大学(及其他机构)的研究人员在 www.timeseriesclassification.com 提供了采用此格式的时间序列问题数据。sktime.datasets
中的 load_from_arff_to_dataframe
方法支持读取单变量和多变量时间序列问题的数据。
下面再次使用 ArrowHead 问题的数据演示了单变量功能(这次从 ARFF 文件加载)。
[4]:
from sktime.datasets import load_from_arff_to_dataframe
X, y = load_from_arff_to_dataframe(
os.path.join(DATA_PATH, "ArrowHead/ArrowHead_TRAIN.arff")
)
X.head()
[4]:
dim_0 | |
---|---|
0 | 0 -1.963009 1 -1.957825 2 -1.95614... |
1 | 0 -1.774571 1 -1.774036 2 -1.77658... |
2 | 0 -1.866021 1 -1.841991 2 -1.83502... |
3 | 0 -2.073758 1 -2.073301 2 -2.04460... |
4 | 0 -1.746255 1 -1.741263 2 -1.72274... |
下面使用多变量 BasicMotions 问题来说明从 ARFF 文件将多变量时间序列数据读取到 sktime 格式的能力。
[5]:
X, y = load_from_arff_to_dataframe(
os.path.join(DATA_PATH, "BasicMotions/BasicMotions_TRAIN.arff")
)
X.head()
[5]:
dim_0 | dim_1 | dim_2 | dim_3 | dim_4 | dim_5 | |
---|---|---|---|---|---|---|
0 | 0 0.079106 1 0.079106 2 -0.903497 3... | 0 0.394032 1 0.394032 2 -3.666397 3... | 0 0.551444 1 0.551444 2 -0.282844 3... | 0 0.351565 1 0.351565 2 -0.095881 3... | 0 0.023970 1 0.023970 2 -0.319605 3... | 0 0.633883 1 0.633883 2 0.972131 3... |
1 | 0 0.377751 1 0.377751 2 2.952965 3... | 0 -0.610850 1 -0.610850 2 0.970717 3... | 0 -0.147376 1 -0.147376 2 -5.962515 3... | 0 -0.103872 1 -0.103872 2 -7.593275 3... | 0 -0.109198 1 -0.109198 2 -0.697804 3... | 0 -0.037287 1 -0.037287 2 -2.865789 3... |
2 | 0 -0.813905 1 -0.813905 2 -0.424628 3... | 0 0.825666 1 0.825666 2 -1.305033 3... | 0 0.032712 1 0.032712 2 0.826170 3... | 0 0.021307 1 0.021307 2 -0.372872 3... | 0 0.122515 1 0.122515 2 -0.045277 3... | 0 0.775041 1 0.775041 2 0.383526 3... |
3 | 0 0.289855 1 0.289855 2 -0.669185 3... | 0 0.284130 1 0.284130 2 -0.210466 3... | 0 0.213680 1 0.213680 2 0.252267 3... | 0 -0.314278 1 -0.314278 2 0.018644 3... | 0 0.074574 1 0.074574 2 0.007990 3... | 0 -0.079901 1 -0.079901 2 0.237040 3... |
4 | 0 -0.123238 1 -0.123238 2 -0.249547 3... | 0 0.379341 1 0.379341 2 0.541501 3... | 0 -0.286006 1 -0.286006 2 0.208420 3... | 0 -0.098545 1 -0.098545 2 -0.023970 3... | 0 0.058594 1 0.058594 2 0.175783 3... | 0 -0.074574 1 -0.074574 2 0.114525 3... |
从 UCR .tsv 格式文件加载#
另一种选择是从制表符分隔值 (.tsv) 文件将数据加载到 sktime 中。加州大学河滨分校的研究人员在此格式下提供了各种时间序列数据,网址为 https://www.cs.ucr.edu/~eamonn/time_series_data_2018。
sktime.datasets
中的 load_from_ucr_tsv_to_dataframe
方法支持读取[6]:
from sktime.datasets import load_from_ucr_tsv_to_dataframe
X, y = load_from_ucr_tsv_to_dataframe(
os.path.join(DATA_PATH, "ArrowHead/ArrowHead_TRAIN.tsv")
)
X.head()
[6]:
dim_0 | |
---|---|
0 | 0 -1.963009 1 -1.957825 2 -1.95614... |
1 | 0 -1.774571 1 -1.774036 2 -1.77658... |
2 | 0 -1.866021 1 -1.841991 2 -1.83502... |
3 | 0 -2.073758 1 -2.073301 2 -2.04460... |
4 | 0 -1.746255 1 -1.741263 2 -1.72274... |
## 在其他 NumPy 和 pandas 格式之间转换
要将加载的格式转换为其他 sktime 内部格式,请使用 sktime.datatypes
模块中的 convert
或 convert_to
工具。有关更多详细信息,请参阅教程 AA_datatypes_and_datasets
。