AWS IoT SiteWise で時系列データの線形補間を試してみた

2022.05.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

先日、AWS IoT SiteWise の線形補間 API を試す機会がありました。
線形補間というシンプルなデータ補間なのでイメージしやすいかと思いますが、この API で何ができて、どのようなデータを取得できるのか、といった点を確認してみました。

なお、線形補間 のサポートは下記リリースにて発表されたものになります。

単純な2点間の線形補間

まずは単純に 2つのデータだけの場合を試してみます。 事前に下記のように2つの時間でSiteWise 上にデータを Put しておきます。
(下記は SiteWise Monitor のグラフを切り抜いたものになります)

  • 07 時 02 分:20.47773220685643
  • 07 時 08 分:50.47773220685643

01-0702-0708-temp

AWS CLI の get-interpolated-asset-property-values コマンドで線形補間してみます。
補完したい時間の最初(--start-time-in-seconds)と最後(--end-time-in-seconds)で「 07 時 02 分 〜 07 時 08 分」を指定しています。

また、--interval-in-seconds で補間したい間隔を 60 秒にしています。

$ aws iotsitewise get-interpolated-asset-property-values \
  --property-alias "/test/device/1/temperature" \
  --start-time-in-seconds 1652436130 \
  --start-time-offset-in-nanos 0 \
  --end-time-in-seconds 1652436499 \
  --end-time-offset-in-nanos 0 \
  --quality GOOD \
  --interval-in-seconds 60 \
  --type LINEAR_INTERPOLATION

コマンドを実行すると下記のようなレスポンスが得られます。
value にて60秒間隔で補間されたデータを取得できています。

{
    "interpolatedAssetPropertyValues": [
        {
            "timestamp": {
                "timeInSeconds": 1652436130,
                "offsetInNanos": 0
            },
            "value": {}
        },
        {
            "timestamp": {
                "timeInSeconds": 1652436190,
                "offsetInNanos": 0
            },
            "value": {
                "doubleValue": 25.35183035271009
            }
        },
        {
            "timestamp": {
                "timeInSeconds": 1652436250,
                "offsetInNanos": 0
            },
            "value": {
                "doubleValue": 30.229879133197894
            }
        },
        {
            "timestamp": {
                "timeInSeconds": 1652436310,
                "offsetInNanos": 0
            },
            "value": {
                "doubleValue": 35.1079279136857
            }
        },
        {
            "timestamp": {
                "timeInSeconds": 1652436370,
                "offsetInNanos": 0
            },
            "value": {
                "doubleValue": 39.9859766941735
            }
        },
        {
            "timestamp": {
                "timeInSeconds": 1652436430,
                "offsetInNanos": 0
            },
            "value": {
                "doubleValue": 44.864025474661304
            }
        },
        {
            "timestamp": {
                "timeInSeconds": 1652436490,
                "offsetInNanos": 0
            },
            "value": {
                "doubleValue": 49.74207425514911
            }
        }
    ]
}

このデータを Google スプレッドシートでグラフ化したものが下記になります。
60秒間隔の補完データを取得できました。

02-google-spreadsheet-0702-0708-temp

データ値が上下している区間の線形補間

次に、下記のような複雑なデータの場合を考えてみます。
グラフの通り、02 時 15 分 〜 02 時 30 分の間でグラフが上下しています。この最初と最後の時間で補間してみます。

03-0215-0230-temp

時間だけ変えて先ほどと同じコマンドを実行します。

aws iotsitewise get-interpolated-asset-property-values \
  --property-alias "/test/device/1/temperature" \
  --start-time-in-seconds 1652462100 \
  --start-time-offset-in-nanos 0 \
  --end-time-in-seconds 1652463060 \
  --end-time-offset-in-nanos 0 \
  --quality GOOD \
  --interval-in-seconds 60 \
  --type LINEAR_INTERPOLATION

結果も先程と同じように取得できました。

{
  "interpolatedAssetPropertyValues": [
      {
          "timestamp": {
              "timeInSeconds": 1652462100,
              "offsetInNanos": 0
          },
          "value": {}
      },
      {
          "timestamp": {
              "timeInSeconds": 1652462160,
              "offsetInNanos": 0
          },
          "value": {
              "doubleValue": 26.47287292625643
          }
      },
      {
          "timestamp": {
              "timeInSeconds": 1652462220,
              "offsetInNanos": 0
          },
          "value": {
              "doubleValue": 32.47287292625643
          }
      },
      
 以下略

取得できたデータを先ほどと同じようにグラフ化してみました。データ値が上下していても正しく補間データを取得できています。

04-google-spreadsheets-0215-0230-temp

ダウンサンプリング

最後に補間間隔を元のデータよりも大きく取ったダウンサンプリングを試してみます。

事前に下記にようなデータを用意しておきます。
(「09 時 30 分〜10 時 30 分」の間で 1 分間隔にデータを Put しています。)

05-0930-1020-temp

今回は -interval-in-seconds 300 として、補完する時間の間隔を 5分 にしています。

aws iotsitewise get-interpolated-asset-property-values \
  --property-alias "/test/device/1/temperature" \
  --start-time-in-seconds 1652661000 \
  --start-time-offset-in-nanos 0 \
  --end-time-in-seconds 1652664000 \
  --end-time-offset-in-nanos 0 \
  --quality GOOD \
  --interval-in-seconds 300 \
  --type LINEAR_INTERPOLATION

得られたデータを可視化したものが下記になります。
元のグラフに比べて5分間隔でデータを取得できていることが分かりました。

06-google-spreadsheet-downsampling

最後に

以上で基本的な動作を確認できました。

この API は補完データの取得までなので、保管データをそのまま SiteWise に書き込むことはできません。
欠損値を埋めたいような場合は、取得したデータを再度 Put するようなオペレーションを行うことになります。

他のユースケースとしては、外部のデータのサンプリング間隔に合わせたデータを取得したいときなどに役立ちそうです。機会があれば使っていこうと思います。

以上です。