2017-04-14 15 views
1

私はDescriptiveStatisticsを使用していくつかのメトリックの移動平均を追跡しています。私は1分ごとにメトリック値を送信するスレッドを持っており、DescriptiveStatisticsのsetWindowSize(10)メソッドを使用してメトリックの10分間の移動平均を追跡します。Apache Commons Math DescriptiveStatisticsで複数の移動平均を追跡する

これは1回の移動平均をトラッキングするのには問題ありませんが、実際には1分間の平均、5分間の平均、10分間の平均といった複数の移動平均をトラッキングする必要があります。

現在、私は次のオプションがあります。

  1. は、3種類の窓のある3種類の要約統計量インスタンスを持っています。しかし、これは生のメトリックを複数回保存することを意味しますが、これは理想的ではありません。

  2. は、要約統計量の1つのインスタンスを持ち、同じような何かを、移動平均を照会するときは、次の

    int minutes = <set from parameter>; 
    DescriptiveStatistics stats = <class variable>; 
    
    if (minutes == stats.getN()) return stats.getMean(); 
    SummaryStatistics subsetStats = new SummaryStatistics(); 
    for (int i = 0; i < minutes; i++) { 
        subsetStats.addValue(stats.getElement((int)stats.getN() - i - 1)); 
    } 
    return subsetStats.getMean(); 
    

しかし、オプション2は私がすべての平均値の束を再計算しなければならないことを意味私は、ウィンドウがDescriptiveStatsウィンドウサイズよりも小さい移動平均をクエリします。

これを行う方法はありますか?私は、メトリクスデータの1つのコピーを保存し、異なる間隔でそれのN個の移動平均を絶えず計算します。これはCodahale MetricsやNetflix Servoの土地になっているかもしれませんが、これのためだけに重量のあるライブラリを使う必要はありません。

答えて

0

StatUtilsユーティリティクラスを使用して、新しい値を追加するときにアレイを管理できます。 1つの代替方法は、がApache Commonsで、サイズが10でApache Utilsを使用して、プリミティブ値の配列への変換を簡素化することです。

User GuideにはStatUtilsの例がありますが、次のような使用例があります。

CircularFifoQueue<Double> queue = new CircularFifoQueue<>(10); 

// Add your values 

double[] values = ArrayUtils.toPrimitive(queue.toArray(new Double[0])) 
mean1 = StatUtils.mean(values, 0, 1); 
mean5 = StatUtils.mean(values, 0, 5); 
mean10 = StatUtils.mean(values, 0, 10);