注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

クエリの複雑さの例

クエリされた時系列データに対してネストされた操作が適用されると、時系列クエリの複雑さが増します。

例として、以下の FoundryTS コードは 2 つの時系列データを加算し、新しい時系列データのすべてのポイントを 1 年間の時間範囲で Pandas データフレームとして返します。

# 時系列データを扱うノードを作成します
series_1 = N.TimeseriesNode('series_1') # 'series_1'という名前の時系列ノードを作成
series_2 = N.TimeseriesNode('series_2') # 'series_2'という名前の時系列ノードを作成

# DSL(ドメイン固有言語)を使用して、2つの時系列ノードのデータを組み合わせる計算を定義します
# この場合、それぞれのノードから取得したデータを足し合わせる計算を指定しています
result = F.dsl(program='a+b', return_type=float)([series_1, series_2])

# 指定した時間範囲(2022年1月1日から2023年1月1日)のデータを取得します
result = result.time_range(start='2022-01-01', end='2023-01-01')

# 結果をPandasのデータフレーム形式で出力します
result.to_pandas()

このコードは、以下の形でCodexにクエリを行います:

{
  id: dsl-fomula
  // 子要素
  children: [
    { id: timeseries }, // 時系列データ
    { id: timeseries }  // 時系列データ
  ]
}

to_pandas の評価は、要求された 1 年間の時間範囲内で result タイムシリーズのポイントをスキャンするためのコストと、結果を計算するために必要な 2 つのコンポーネントシリーズのポイント(この場合は、それぞれから 1 年間の範囲)を発生させます。

次に、より入れ子になった操作を適用する FoundryTS コードを検討してみましょう。まず、2つの他のシリーズの合計であるシリーズを定義します。次に、そのシリーズを 7 日間のローリング平均と比較し、結果の 1 年分のポイントを Pandas データフレームとしてロードします:

# 時系列ノードを作成
series_1 = N.TimeseriesNode('series_1')
series_2 = N.TimeseriesNode('series_1')

# 2つの時系列ノードを加算
intermediate_1 = F.dsl(program='a+b', return_type=float)([series_1, series_2])

# 加算された時系列の7日間の平均値を計算
intermediate_2 = intermediate_1.rolling_aggregate('mean', '7d')

# 元の加算された時系列から7日間の平均値を減算
result = F.dsl(program='a-b', return_type=float)([intermediate_1, intermediate_2]).time_range(start='2022-01-01', end='2023-01-01')

# 結果を pandas のデータフレームに変換
result.to_pandas()
{
  id: dsl-fomula // これはDSL(Domain Specific Language)の式を示す識別子です
  children: [
    {
      id: dsl-fomula // 子ノードもDSLの式を示します
      children: [
        { id: timeseries }, // 時系列データを示す識別子です
        { id: timeseries } // 同じく、時系列データを示す識別子です
      ]
    },
    {
      id: rolling-aggregate // これは移動集計(時間窓を移動させながらの集計)を示す識別子です
      children: [
        {
          id: dsl-fomula // 子ノードはDSLの式を示します
          children: [
            { id: timeseries }, // 時系列データを示す識別子です
            { id: timeseries } // 同じく、時系列データを示す識別子です
          ]
        }
      ]
    }
  ]
}

このクエリツリーの各ノードでは、最終結果を生成するために1年間の範囲のポイントをスキャンするためのコストが発生します。