與sktime一起使用的數據應該存儲在pandas DataFrame對象中,用行和每個問題的系列數據的序列數據表示的情況存儲在列中(數據結構的細節將在下面的部分中詳細描述)。可以通過各種方式將數據加載到sktime格式中,例如直接從定製的sktime文件格式(.ts)或其他現有數據源提供的受支持文件格式(例如ARFF和.tsv)加載。此外,還可以通過其他方式將數據加載爲長表格式,然後使用提供的方法將其轉換爲sktime格式。
以下是.ts文件格式的簡要說明,介紹瞭如何將數據存儲在sktime的數據幀中,以及從各種文件格式加載數據的示例。
用.ts文件表示數據
最典型的用例是從本地存儲的.ts文件加載數據。已創建.ts文件格式,以標準格式表示問題,以與sktime一起使用。這些文件包括兩個主要部分:*標頭信息*數據
標頭信息用於通過包含有關問題結構的元數據來促進數據的簡單表示。標頭包含以下內容:
@problemName <problem name> @timeStamps <true/false> @univariate <true/false> @classLabel <true/false> <space delimted list of possible class values> @data
問題的數據應在@data標記之後開始。在最簡單的情況下,@timestamps爲false時,一系列值用逗號分隔的列表表示,並且每個值的索引都相對於其在列表中的位置(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個觀察值。可以使用?來指定缺少的讀數,或者對於稀疏的數據集,可以通過將@timestamps設置爲true並使用(timestamp,value)形式的元組表示數據來指定讀數。例如,以上示例中的第一種情況可以在此表示形式中指定爲:
(0,2),(1,3)(2,2)(3,4):(0,4),(1,3),(2,2),(3,2)
等效地,
2,5,?,?,?,?,?,5,?,?,?,?,4
可以用時間戳表示爲:
(0,2),(0,5),(7,5),(12,4)
對於分類問題,應在最後一個維度中指定案例的類標籤,並在標頭信息中使用@classLabel來指定可能的類值集。例如,如果一個案例由一個維度組成,並且類別值爲1,則它將指定爲:
1,4,23,34:1
在Pandas DataFrame中存儲數據
在sktime中存儲數據集的核心數據結構是pandas DataFrame,其中數據幀的行對應案例,而列則對應於問題的維度。數據框各列中的讀數存儲爲pandas Series對象;使用Series可以簡化稀疏數據或帶有非整數時間戳(例如日期)的Series的簡單存儲。此外,如果加載的問題是分類問題,則sktime中的標準加載功能將在單獨的索引對齊的numpy數組中返回類值(可以選擇將X和Y組合爲單個數據幀以進行高級任務構建) 。例如,對於n個案例的問題,每個案例都有c個維度的數據:
DataFrame: index | dim_0 | dim_1 | ... | dim_c-1 0 | pd.Series | pd.Series | pd.Series | pd.Series 1 | pd.Series | pd.Series | pd.Series | pd.Series ... | ... | ... | ... | ... n | pd.Series | pd.Series | pd.Series | pd.Series
並且,如果數據是分類問題,則將返回帶有類標籤的單獨(索引對齊)數組:
index | class_val 0 | int 1 | int ... | ... n | int
從.ts文件加載到Pandas DataFrame
可以使用sktime.utils.load_data.py中的以下方法從.ts文件加載數據集:
load_from_tsfile_to_dataframe(full_file_path_and_name, replace_missing_vals_with='NaN')
可以使用sktime / datasets / data下sktime中包含的Arrow Head問題來證明這一點
[1]:
from sktime.utils.load_data import load_from_tsfile_to_dataframe import os import sktime DATA_PATH = os.path.join(os.path.dirname(sktime.__file__), "datasets/data") train_x, train_y = load_from_tsfile_to_dataframe(os.path.join(DATA_PATH, "ArrowHead/ArrowHead_TRAIN.ts")) test_x, test_y = load_from_tsfile_to_dataframe(os.path.join(DATA_PATH, "ArrowHead/ArrowHead_TEST.ts"))
ArrowHead問題的訓練分區和測試分區已加載到具有類值關聯數組的數據幀中。例如,下面是train_x和train_y的前5行:
[2]:
train_x.head()
[2]:
dim_0 | |
---|---|
0 | 0 -1.9630 1 -1.9578 2 -1.9561 3 ... |
1個 | 0 -1.7746 1 -1.7740 2 -1.7766 3 ... |
2 | 0 -1.8660 1 -1.8420 2 -1.8350 3 ... |
3 | 0 -2.0738 1 -2.0733 2 -2.0446 3 ... |
4 | 0 -1.7463 1 -1.7413 2 -1.7227 3 ... |
[3]:
train_y[0:5]
[3]:
array(['0','1','2','0','1'],dtype ='<U1')
從Weka ARFF文件加載
也可以從Weka的屬性關係文件格式(ARFF)文件中加載數據。這是東英吉利大學研究人員使用的數據格式(可從www.timeseriesclassification.com獲取)。中的load_from_arff_to_dataframe
方法sktime.utils.load_data
支持讀取單變量和多變量問題。下面再次顯示了ArrowHead問題(這次是從ARFF加載)和多元BasicMotions問題的示例。
從ARFF加載單變量ArrowHead問題
[4]:
from sktime.utils.load_data 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 ... |
從ARFF加載多元BasicMotions問題
[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獲取)。 。中的load_from_ucr_tsv_to_dataframe
方法sktime.utils.load_data
支持閱讀單變量問題。下面給出了ArrowHead的示例,以演示從ARFF和.ts文件格式加載的等效性。
從.tsv加載單變量ArrowHead問題
[6]:
from sktime.utils.load_data 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 ... |
在sktime中使用長格式數據
通過手動將數據整形爲上述格式,也可以使用來自.ts和.arff文件以外的其他來源的數據。爲了方便起見,還提供了一個輔助函數,用於在from_long_to_nested
方法中將長格式數據轉換爲sktime格式的數據sktime.utils.load_data
(假設數據最初是如何格式化的)。
該方法假定每行包含以下信息,從長表模式數據幀轉換行:
case_id, dimension_id, reading_id, value
其中,case_id
是用於標識數據中特定情況的ID;對於數據dimension_id
中的d維,是0到d-1之間的整數;reading_id
是與關聯的case_id
和的該觀察值的索引;dimension_id
並且value
是觀察值的實際值。例如:
| case_id | dim_id | reading_id | value ------------------------------------------------ 0 | int | int | int | double 1 | int | int | int | double 2 | int | int | int | double 3 | int | int | int | double
爲了演示此功能,下面的方法創建一個具有給定數量的案例,維度和觀察值的數據集:
[7]:
import numpy as np import pandas as pd def generate_example_long_table(num_cases=50, series_len=20, num_dims=2): rows_per_case = series_len*num_dims total_rows = num_cases*series_len*num_dims case_ids = np.empty(total_rows, dtype=np.int) idxs = np.empty(total_rows, dtype=np.int) dims = np.empty(total_rows, dtype=np.int) vals = np.random.rand(total_rows) for i in range(total_rows): case_ids[i] = int(i/rows_per_case) rem = i%rows_per_case dims[i] = int(rem/series_len) idxs[i] = rem%series_len df = pd.DataFrame() df['case_id'] = pd.Series(case_ids) df['dim_id'] = pd.Series(dims) df['reading_id'] = pd.Series(idxs) df['value'] = pd.Series(vals) return df
下面的示例生成一個長格式表,其中包含50個案例,每個案例的4個維度的長度爲20:
[8]:
X = generate_example_long_table(num_cases=50, series_len=20, num_dims=4) X.head()
[8]:
案例ID | dim_id | reading_id | 值 | |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0.405759 |
1個 | 0 | 0 | 1個 | 0.234337 |
2 | 0 | 0 | 2 | 0.048338 |
3 | 0 | 0 | 3 | 0.942984 |
4 | 0 | 0 | 4 | 0.518808 |
[9]:
X.tail()
[9]:
案例ID | dim_id | reading_id | 值 | |
---|---|---|---|---|
3995 | 49 | 3 | 15 | 0.635890 |
3996 | 49 | 3 | 16 | 0.850341 |
3997 | 49 | 3 | 17 | 0.023233 |
3998 | 49 | 3 | 18 | 0.728243 |
3999 | 49 | 3 | 19 | 0.433297 |
如下所示,應用該from_long_to_nested
方法將返回一個sktime格式的數據集,其單個維度由輸出數據框的列表示:
[10]:
from sktime.utils.load_data import from_long_to_nested X_nested = from_long_to_nested(X) X_nested.head()
[10]:
dim_0 | dim_1 | dim_2 | dim_3 | |
---|---|---|---|---|
0 | 0 0.405759 1 0.234337 2 0.048338 3 ... | 0 0.061763 1 0.849623 2 0.336848 3 ... | 0 0.026670 1 0.487476 2 0.430561 3 ... | 0 0.900226 1 0.794101 2 0.972804 3 ... |
1個 | 0 0.274029 1 0.393993 2 0.751551 3 ... | 0 0.124583 1 0.789808 2 0.102596 3 ... | 0 0.815371 1 0.922024 2 0.023706 3 ... | 0 0.462451 1 0.518190 2 0.247583 3 ... |
2 | 0 0.624624 1 0.984892 2 0.999759 3 ... | 0 0.945452 1 0.786874 2 0.173361 3 ... | 0 0.814436 1 0.370925 2 0.781942 3 ... | 0 0.799729 1 0.348755 2 0.072161 3 ... |
3 | 0 0.230626 1 0.061769 2 0.244859 3 ... | 0 0.350042 1 0.184927 2 0.870344 3 ... | 0 0.487125 1 0.398676 2 0.553949 3 ... | 0 0.023464 1 0.966539 2 0.488225 3 ... |
4 | 0 0.164249 1 0.602726 2 0.280815 3 ... | 0 0.763073 1 0.595917 2 0.986492 3 ... | 0 0.167080 1 0.897912 2 0.367797 3 ... | 0 0.104634 1 0.723399 2 0.227106 3 ... |
[11]:
X_nested.iloc[0][0].head()
[11]:
0 0.405759 1 0.234337 2 0.048338 3 0.942984 4 0.518808 dtype:float64