タイムシリーズ・テーブル

[Teradata Vantage™ - 時系列テーブルと操作の概要](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/root) [リリース番号：17.20　リリース日付：2022/9]の翻訳です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/I0t3uwmhsws" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# タイムシリーズ・テーブルとは？
タイムシリーズテーブルは、センサーデータなどの時系列データに特化したテーブル構造により、柔軟な操作により時系列データの記述統計的な分析を簡単に行う事ができます。
- タイムシリーズデータに特化したテーブルにより、効率的にタイムシリーズデータを扱うことが出来ます。
- 時系列集約により、時間バケットごとの集約を簡単に行うことができます。
- 時系列集約関数により、タイムシリーズ・データに対する記述統計による分析が簡単にできます。
- FILL句により、欠損値の処理ができます。
- 無制限配列フレームワークの時系列分析関数と連携することで、高度な分析ができます。

# タイムシリーズデータの特徴と分析
#### タイムシリーズデータの特徴
- タイムシリーズ＝時間＋変数
- 大容量データになることが多い
- 時間的に不規則な間隔で発生する。
- ノイズや欠損値が含まれる場合があります
- 時間間隔で集計されることが多い

#### 主なタイムシリーズデータの種類とは？
- センサーデータ
- 温度
- 風速 
- 地震観測データ
- 株価情報
- 地理空間トレース
- 発電量
- エンジン回転数
- 油圧
- 圧力チェック

#### 時系列解析の主なカテゴリ
|カテゴリ| 説明 |
|:-|:-|
|記述的分析|トレンドやパターンを、外れ値、周期的なパターンなどを把握する。|
|周波数分解|スペクトル解析などにより周波数の周期によるデータの分解。|
|フォーキャスト|過去の時系列データの傾向から将来の値を予測する。|
|変化点検知|何らかの外部介入に基づく変化の性質の見極め。|
|相関分析|時系列データ間の相関関係を分析する|

<img width="500" alt="タイムシリーズ利用例.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/d293c666-cd5b-901a-0cf8-b8a889384e04.png">


# タイムシリーズテーブルのデータ格納
#### プライマリ・タイム・インデックスによるタイムバケットごとのデータ格納
<img width="800" alt="プライマリタイムシリーズインデックス.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/267949d1-6bbd-d9d4-6cf5-844fd7c5b762.png">

|パターン|説明|例|
|:-|:-|:-|
|タイムコードのみ|この場合は各イベントのタイムスタンプをインデックスとして、これに対する時間間隔のタイムバケットを指定します。|1つのテーブルで一種類のデータを扱う場合です。|
|タイムコード＋識別子|センサーIDなど識別子とイベントのタイムスタンプを指定して、このイベントのタイムスタンプに対してタイムバケットを指定します。|永続的にデータが発生するIOTや天候、株価などのデータを扱う場合に使います。|
|識別子のみ|センサーIDなどの識別子のみをプライマリ・タイム・インデックスとして指定して、タイムバケットも指定しない場合です。|1回の実験データなどで、ひとまとまりとして使うもの。|

### 値の格納
測定値の格納方法としては大きく以下の２パターンがあります。
#### 固定変数
ひとつもしくは複数の測定値を持つ場合の形式です。
<img width="500" alt="タイムシリーズ固定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/23d0d088-193d-0c49-253a-225610d95e57.png">

#### 可変複数変数
固定的でない測定値を持つ場合の形式です。通常はJSONフォーマットを用います。
<img width="600" alt="タイムシリーズ可変.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/bdffeb2a-50f5-3e60-c9ea-25a061cb3528.png">

# 欠損値の対応
1. 通常のSQLによる欠損値への対応
    - 欠損値の削除
    - 欠損値の定数へ置き換え
    - 欠損値の見積り値(平均など)への置き換え
2. FILL句による欠損値への対応
    - NULLを使用して置き換え
    - 定数値を使用して置き換え
    - 前のタイムバケット値を使用した置き換え
    - 次のタイムバケット値を使用した置き換え

# タイムシリーズテーブルで使える関数
:::note information
各関数の使い方については、段階的に[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)に対するリンクを追加していきますので、Teradata Vantageドキュメンテーションのマニュアルを参照して、利用方法の確認をお願いします。
:::
|関数名|説明|
|:-|:-|
|[平均<br>AVERAGE](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/ckZv0L3_TM78AYUXR17u_A)|べての値の算術平均値を返します。|
|[ボトム<br>BOTTOM](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/BIzGhJUms6FK5owPol7NqQ)|グループごとに最小値を返します。|
|[カウント<br>COUNT](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/xAMTfsmG8AyXRyACjHz4wQ)| 対象とされるデータの行数を返します|
|[デルタT<br>DELTA_T](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/QpW2DD8xiJH5z7RjMpHqKQ)|開始イベントと終了イベントの間の時間差(つまりDELTA_T)を計算します。計算は、時間順時系列データセットに対して実行されます。|
|[記述<br>DESCRIBE](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/fYLI_Ep75n0ouoKSP2Y4Aw)|標準で、MAX、MIN、AVERAGE、STDDEV_SAMPの結果を返します。VERBOSEキーワードを使用する場合は、MEDIN、MODE、25/50/75番目のPERCENTILEも追加されます。|
|[始値<br>FIRST](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/YPJNZOW2iAEdhDDpyvk6Xg)|タイムコードによって判別される最も古い値を返します。|
|[尖度<br>KURTOSIS](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/dKpKL07j7o73_zqv5wXCnA)|分布のとがり(尖度)を返します。|
|[終値<br>LAST](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/9V5LsEJMw14ok0hgyMjOfw)|グループごとに、タイムコードによって判別される最も新しい値を返します。|
|[最大<br>MAXIMUM](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/MjbASeB1TSwAK9fhP_WpeQ)|最大値である列の値を返します。|
|[中央値絶対偏差<br>MAD](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/F1r~4epDqBdApYErhaQEQg)|各値間の差異の絶対値として定義された一連の値の中央値と、各グループのすべての値の中央値を返します。|
|[中央値<br>MEDIAN](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/MqOQO~j8AOre7tv1~OVldA)|各グループのすべての値の中央値を返します。偶数個の値が含まれている場合、MEDIANは2つの中央値の平均を返します。|
|[最小<br>MINIMUM](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/DSwbETO0roGYGKprs~Vvww)|最小値である列の値を返します。|
|[最頻値<br>MODE](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/65P7BAt0rA9vGTeDM4uVpA)|各グループのすべての値の最頻値を返します。2つ以上の値の間の順位イベントでは、結果ごとに行が返されます。|
|[パーセンタイル<br>PERCENTILE](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/Jee8nZxR1RlerURPHWbGqQ)|各グループから目的のパーセンタイルを表わす値を返します。|
|[ランク<br>RANK(ANSI)](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/Em0ufK2q6iaPHLCwITwJ4Q)|行の順序付き順位を戻します。|
|[偏り<br>SKEW](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/nR6JqK_yKJuTAWz9pvUW9g)|分布の偏りを返します。|
|[母集団標準偏差<br>STDDEV_POP](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/e~LuA_kFIjkuqcUbyzXuiQ)|非nullのデータ点に対して、母集団の標準偏差を戻します。|
|[標本標準偏差<br>STDDEV_SAMP](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/MCxtJ~FfgQXmhlpSygoHBg)|非nullのデータ点に対して、標本の標準偏差を戻します。|
|[合計<br>SUM](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/Ch5xeN3iu36aNjp819s3Lg)|算術合計である列の値を返します。|
|[トップ<br>TOP](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/Pv4Lr8V5ItEaVn2CFttuiQ)|グループごとに最大値を返します。|
|[母集団分散<br>VAR_POP](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/Jfhp2EmKykobrN~ESV42sw)|データ点に対して母集団分散を戻します。|
|[標本分散<br>VAR_SAMP](https://docs.teradata.com/r/~jBLiI_giYQUGpkNh59QuQ/8BhlOCuYEIzkzVMtX9or4Q)|データ点の標本分散を戻します。|

# 実行方法
以下のようなタイムシリーズの生データを30分間隔で集約します。
<img width="700" alt="タイムシリーズ処理イメージ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/27272ab8-8551-8487-1723-753fe2b95cbd.png">

#### テーブル作成
``` テーブル作成.sql
CREATE TABLE Quarter_Hour_Location_Data
( locatin_id INTEGER              #タイムスタンプは設定不要
, temperature FLOAT
, humidity FLOAT)   
PRIMARY TIME INDEX(		#PTIを指定します。
	  TIMESTAMP(0)　　　　　　　#タイムスタンプ
	, DATE ’2020-01-01’　　　　#開始日
	, HOURS(1)		#タイムバケットの指定
	, COLUMNS(locatin_id));
``` 
#### 時系列集約の実行
```時系列集約の実行.sql
SELECT (BEGIN($TD_TIMECODE_RANGE) 　#集計単位の指定
  + INTERVAL ‘30’ MINUTE) AS timepoint
, location_id
, MEDIAN(temperature)
, MEDIAN(humidity) 
FROM Quarter_Hour_Location_Data
WHERE $TD_TIMECODE > TIMESTAMP ‘2020-01-01 00:00:00’
GROUP BY TIME(HOURS(1) AND location _id))
```

:::note
タイムシリーズテーブルは、[タイムシリーズ関数](https://qiita.com/hchd/items/a8247c5766447ed65473)と組み合わせて、使うことで、より多くのことができます。
:::

## おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)