GridDBの集計関数

集計値とその重要性

集計(Aggregation)とは、特定の基準に基づいてデータを要約する方法です。 よく知られている例としては、最小値、平均値、または合計値などの統計値があります。 これらの結果は、データの結論や推測に使用されたり、時間の経過とともに変化するデータのパターンや傾向を観察するために使われます。標準偏差や分散などの他の集計結果を利用して、データサンプルの信頼性を推定することもできます。例えば、高い標準偏差または分散が見られた場合、データセットにおいて測定値が広く拡散されていることを意味し、この測定値の信頼性が低いと推定することができます。GridDBは、開発者がAPIを使ってデータを集約するためのいくつかの方法と機能を提供します。これから詳しく見ていきましょう。

GridDBにおける集計

GridDBには、集計データの収集に使用できるさまざまな組み込みAPI関数が用意されています。 GridDBのJava APIでは、集計メソッドは AggregationResult タイプのオブジェクトを返します。 これらのオブジェクトは通常、コンテナからの行セットではなく、単一の結果の形式となります。GridDBが収集できる集計結果には、最小値、最大値、平均値、標準偏差、行数、すべての行の合計、および分散が含まれます。 これらの結果は、TimeSeriesコンテナの .aggregate メソッドまたはコレクションのTQLクエリを使用して取得できます。

TQLクエリによる集計の実行

TQLとは、Terminology Query Languageの略語です。 GridDBのSQLの簡略化されたバージョンで、コンテナに標準クエリとデータ操作を行うために使用されます。また、TQLは実行計画やクエリ文の解析を取得する機能を提供します。標準文字列を使用してTQLを表現し、GridDB APIから .query または gsQuery 関数を使用してTQLを発行します。

TQLを使用すると、コレクションとTimeSeriesコンテナの両方で集計クエリを実行できます。 .fetch() gsFetch 関数を使用して集計結果を取得し、前述のメソッドを使用して数値を取得します。

ClimateReading というJavaクラスの形式で行スキーマを持つJavaのコレクションがあるとします。変数名 climateContainer がこのコレクションにキャストされます。このコンテナの標準偏差と「温度」欄の平均値の両方を取得したい場合は、まずTQLクエリを文字列として作成し、GridDB APIのクエリ関数とフェッチ関数を使用して集計結果を取得します。

Container<String,ClimateReading> climateContainer = store.getCollection("climate",ClimateReading.class); 
String averageTql = "SELECT AVG(temperature) FROM climate";
String standardDeviationTql>= "SELECT STDDEV(temperature) FROM climate";
Query<AggregationResult> averageQuery = climateContainer.query(averageTql,AggregationResult.class);
Query<AggregationResult> standardDeviationQuery = climateContainer.query(standardDeviationTql, AggregationResult.class);
RowSet<AggregationResult> rowSet = aggregationQuery.fetch();//Set of one row which has the result
RowSet<AggregationResult> stdDeviationSet = deviationQuery.fetch();
AggregationResult average = rowSet.next();
AggregationResult stdDev = stdDeviationSet.next();
System.out.println("The average temperature is " + average.getDouble());
System.out.println("The standard deviation of the temperature is " + stdDev.getDouble());

アウトプット:

The average temperature is 73.56
The standard deviation of the temperature is 4.62

TimeSeriesによる集計 Containers

JavaでTimeSeriesコンテナの集計結果を取得するには、 .aggregate メソッドを使用します。照会する列と計算する集計のタイプ、および開始日と終了日として設定する2つの日付を選択します。これらの4つのパラメータは、集計クエリを構成します。このクエリが取得されると、 AggregationResult が返されます。 AggregationResultオブジェクトから数値を取得するには、 .getDouble()または .getLong()のいずれかの呼び出しを行います。

1つ例を挙げてご説明します。以下の例では、TimeSeriesコンテナが変数 timeSeries に設定されています。平均値を取得したい “light”という数値列があります。また、計算に含まれる行を、設定された開始日と終了日の間に制限する必要があります。クエリの開始日または終了日を設定したくない場合は、クエリの最初または2番目のパラメータを null に設定します。これらの日付は、変数 start および end にそれぞれ Date オブジェクトとしてキャストされます。

// Get average from earliest record to latest record in the container on the ‘light’ column
AggregationResult averageResult = timeSeries.aggregate(start,end,”light”,Aggregation.AVERAGE);
System.out.println("The average light value is " + averageResult.getDouble()); 

アウトプット:

The average light value is 29.82

時間加重平均

データベースから列の平均を取得するとき、私たちが考えている通常の平均値(すべての値を値の数で割ったものの合計)で十分ではないことがあります。 時間関連データに適した集計結果は時間平均です。 時間加重平均は、測定値のすべての値だけでなく、それらの間の時間量も考慮に入れます。

1つの例を挙げると、非定期的な時間間隔で測定値を記録するセンサーがあるとします。 このセンサーでは最初は録音の間隔が3秒でしたが、数時間後にはこの録音の間隔が6秒以上に増加する可能性があります。これらの不一致を説明するには、テーブル内のすべてのエントリの時間値と隣接する行間の時間間隔によって平均自体を重み付けするという方法があります。 GridDBは、そのようなTimeSeriesコンテナの時間加重平均を得る機能を提供します。

時間加重平均の計算

時間平均は、 TimeSeries コンテナに固有の集約値です。 これらの結果は、 TIME_AVG TQLクエリまたは WEIGHTED_AVERAGE 集計で取得します。 GridDBの加重平均は、行のすべての値に、それに隣接する2つの行(前後の行)の時間間隔の半分の加重値を与えることによって計算されます。

例えば、 light という列の加重平均をTimeSeriesコンテナで収集したいとします。 ある行で、行10 を呼び出します。タイムスタンプは6月22日8:23:43で、ライト値は23です。前の行は4秒前に挿入されています。 行10の10秒後に次の行が挿入されました。
行10の加重値は次のとおりです。

(10 + 4 ) / 2 = 7 

以下の時間に挿入された5行のコンテナでは、

Row     Time     Value                    Weighted-Value
0          0        20                                10
1         10        30             (10 + 15 ) / 2 = 12.5
2         25        50                 (15 + 5) / 2 = 10
3         30        70               (5 + 30) / 2 = 17.5
4         60        60                                30

加重平均は、すべての値をすべての加重値の合計で割った合計です。

Sum of Values:		20 + 30 + 50 + 70  + 60 = 230   
Sum of Weights: 	10 + 12.5 + 17.5 + 10   =  50   
Sum of Values / Sum of Weights:         230/50  = 4.6

加重平均は4.6となりました。以上です。お分かりになりましたでしょうか?
GridDBの集計操作の詳細については、こちらをご参照ください。 GridDB APIの詳細については、 GridDB APIリファレンスページをご覧ください。

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

Your email address will not be published. Required fields are marked *