Python ライブラリー「sktime」で学ぶ
らくらくビジネス時系列機械学習 Web講座

– 第7回:データの読み込み方・作り方(tsフォーマット編) –

Python ライブラリー「sktime」で学ぶ らくらくビジネス時系列機械学習 Web講座 – 第7回:データの読み込み方・作り方(tsフォーマット編) –

sktimeに読み込めるデータフォーマットは次の4つです。

  • csvフォーマット
  • tsフォーマット
  • Weka ARFFフォーマット
  • UCR .tsvフォーマット

前回は、最も利用頻度が高いと思われるCSVの読み込み方と、sktimeデータフォーマットの作り方を説明しました。

ちなみに、sktimeで取り扱うデータの種類(scitype)には3つあります。

  • 1. 時系列データ(Series)
  • 2. パネル時系列データ(Panel)
  • 3. 階層時系列(Hierarchical)

今回は、パネル時系列データ(Panel)を扱うtsフォーマットの読み込み方と、sktimeデータフォーマットの作り方を説明します。

復習:パネル時系列データ(Panel)

先ずは、パネル時系列データ(Panel)の復習からです。

パネル時系列データは、系列データを複数の対象に拡張したデータです。例えば四半期ごとに個人消費支出、個人可処分所得、生産量、貯蓄、失業率など複数の経済指標複数の国同じ時点一定の間隔で観測したデータなどがパネル時系列データになります。

 

TSフォーマットの構成

次に、このパネル時系列データ(Panel)を扱うtsフォーマットの構成について説明します。

TSフォーマット3つのブロックで構成されています。

  • 説明ブロック … データセットの説明を記載するブロック(#から始まる)
  • メタデータブロック … データセットを定義するブロック(@から始まる)
  • データセットブロック … データセット本体

 

例えば、次のようなファイルを作ります。時系列分類(ab2クラス)の例で、1つめの観測対象(instances=0)のクラスがa,2つめの観測対象( instances=1)のクラスがb,3つめの観測対象(instances=2)のクラスがaです。

 

これを読み込みpd-multiindexへ変換すると、次のようなパネル時系列データ(Panel)になります。

 

わけわからないと思いますので、各ブロックごとに説明します。

 

TSフォーマットの「説明ブロック」

データセットに関する説明を記述するブロックです。

決まっているのは行を#(半角シャープ)から始めることだけで、記述する内容に決まりはありません。

データセットの内容があとからでもわかるように記載しましょう。

以下、説明ブロックの記載例です。

#This is S2023-01-01mple D2023-01-01t2023-01-01
#ここはデータセットの説明に使うブロックです。
#文字コードはUTF-8です。
#教師あり学習の分類問題の例です。
#次の行からはメタデータ部で、@マークから始めます。

 

TSフォーマットの「メタデータブロック」

データセットの形式について定義するブロックです。

非常に重要です。

以下、各項目の説明です。

項目 内容
@problemname データセットの名前 文字列 TsFormatSamples
@timestamps タイムスタンプの有無 true:あり
false:なし
true
@missing 欠損値の有無 true:あり
false:なし
false
@univariate 単変量か多変量か true:単変量
false:多変量
false
@dimension データの次元数 1以上の整数 2
@equallength 観測対象の観測点数がすべて同じか true:同じ
false:異なる
true
@serieslength 観測点数 1以上の整数 3
@targetlabel 回帰問題の場合のみ

ターゲット列が存在するか否か

true:存在する
false:存在しない
false
@classlabel 分類問題の場合のみ

クラスの存在有無とクラスの値

true:存在する
false:なし
true a b
@data データの開始を宣言する識別子

 

以下、メタデータブロックの設定例です。

@problemname TsFormatSample
@timestamps true
@missing fase
@univariate false
@dimension 2
@equallength true
@serieslength 3
@targetlabel false
@classlabel true 0 1
@data

 

メターデータブロックの最後に@dataがあります。

@dataの次の行からがデータセットブロックになります。

 

TSフォーマットの「データセットブロック」

いきなり、データセットブロックの例を示します。

以下です。

(2023-01-01,1),(2023-01-02,2),(2023-01-03,3):(2023-01-01,4),(2023-02-01,5),(2023-01-03,6):a
(2023-01-01,7),(2023-01-02,8),(2023-01-03,9):2023-01-01,10),(2023-01-02,11),(2023-01-03,12):b
(2023-01-01,13),(2023-01-02,14),(2023-01-03,15):(2023-01-01,16),(2023-01-02,17),(2023-01-03,18):a

 

行がパネルの観測対象を示します。

この例ではデータが3行なので、観測対象が3つあります。

 

このデータセットをよく見ると、次の3つから構成されていることがわかります。

  • タプル ( , )
  • コンマ ,
  • コロン :

タプルの中に観測時点観測値があり、(観測時点,観測値)で表されます。

このタプルは、,(コンマ)で区切られ、次元は:(コロン)で区切られています。

:(コロン)で区切られた最後の次元がクラスです。

 

難しそうに見えますが、覚えてしまえば問題はありません。

ここから、具体的にデータセットブロックの記載方法について説明します。

 タイムスタンプ

データセットにはタイムスタンプをつけるか、つけないかを選べます。

  タイムスタンプをつける場合

メタデータブロックの項目@timestampをtrueとします。

タイムスタンプと観測値をタプルにして記録します。

タイムスタンプは……

  • 日時型(yyyy-mm-dd hh:mm:ss)
  • 整数型

……を指定できます。

以下、日時型のタイムスタンプがある場合の例です。

@problemname TSformat
@timestamps true
@missing false
@univariate true
@dimension 2
@equallength true
@serieslength 5
@targetlabel false
@data
(2022-01-01 01:00:00,1),(2022-01-01 02:00:00,1),(2022-01-01 03:00:00,1)
(2022-02-01 01:00:00,1),(2022-02-01 02:00:00,1),(2022-02-01 03:00:00,1)

 

以下、整数型のタイムスタンプがある場合の例です。

@problemname TSformat
@timestamps true
@missing false
@univariate true
@dimension 1
@equallength true
@serieslength 5
@targetlabel false
@data
(0,10),(1,20),(2,30)
(0,10),(1,20),(2,30)

 

  タイムスタンプをつけない場合

メタデータブロックの項目@timesampをfalseとします。

観測値のみコンマ,で区切って並べます。

以下、タイムスタンプのない場合の例です。

@problemname TSformat
@timestamps false
@missing false
@univariate true
@dimension 1
@equallength true
@serieslength 5
@targetlabel false
@data
1,2,3,4,5
10,20,30,40,50

 

 次元

タイムスタンプの例で示したデータセットの次元は1でしたが、次元(データセットの列)を増やしたい場合は、@dimension項目に次元数を記載します。

データはコロン:で区切ります。

ここは簡単のため、タイムスタンプのない3次元の例で示します。

@problemname TSformat
@timestamps false
@missing false
@univariate true
@dimension 3
@equallength true
@serieslength 5
@targetlabel false
@data
1,2,3,4,5:1,2,3,4,5:1,2,3,4,5
1,2,3,4,5:1,2,3,4,5:1,2,3,4,5

 

 欠損

データに欠損(欠測値)がある場合、メタデータブロック@missingをtrueとします。

そして、?データ欠損を示します。

以下、例です。

@problemname TSformat
@timestamps false
@missing true
@univariate true
@dimension 2
@equallength true
@serieslength 5
@targetlabel false
@data
1,?,3,?,5:1,2,3,4,5
10,20,30,40,?:1,2,3,?,5

 

タイムスタンプと?を組み合わせて使う場合には、次のようになります。

@problemname TSformat
@timestamps true
@missing true
@univariate true
@dimension 1
@equallength true
@serieslength 5
@targetlabel false
@data
(2022-01-01,1),(2022-01-02,?),(2022-01-03,3)
(2023-01-01,1),(2023-01-02,2),(2023-01-03,3)

 

 回帰問題

数値の目的変数が存在し、この目的変数の値を予測する問題を回帰問題と言います。

 

メタデータブロック@targetlabelをtrueにして、最後の次元に目的変数の値(数値)を記載します。

以下、記載例です。

@problemname
@timestamps false
@missing false
@univariate true
@dimension 1
@equallength true
@targetlabel true
@data
1,2,3,4,5:50
1.1,2.2,3.3,4.4,5.5:55

 

 分類問題

クラスを示す目的変数が存在し、この目的変数のクラスを予測する問題を分類問題と言います。

メタデータブロック@classlabelをtrueにして、最後の次元に目的変数の値(クラス)を記載します。

以下、クラスが文字列で表現されている場合の例です。

@problemname TSformat
@timestamps false
@missing false
@univariate true
@dimension 2
@equallength true
@serieslength 5
@classlabel true a b
@data
1,2,3:a
10,20,30:b
5,6,7:a

 

以下、クラスが数字で表現されている場合の例です。

@problemname TSformat
@timestamps false
@missing false
@univariate true
@dimension 2
@equallength true
@serieslength 5
@classlabel true 0.1 0.2
@data
1,2,3:0.1
10,20,30:0.2
5,6,7:0.1

 

まとめ

今回は、パネル時系列データ(Panel)を扱うtsフォーマットの読み込み方と、sktimeデータフォーマットの作り方を説明しました。

CSVフォーマットに次いで利用頻度の高いデータフォーマットです。

若干癖がありますが、慣れてしまえば問題はなく扱えるようになると思います。

次回は、時系列分類について説明します。

Python ライブラリー「sktime」で学ぶ らくらくビジネス時系列機械学習 Web講座 – 第8回:時系列分類 –