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

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

Clock Icon2022.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 するようなオペレーションを行うことになります。

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

以上です。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.