注: 以下の翻訳の正確性は検証されていません。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年間の範囲のポイントをスキャンするためのコストが発生します。