2013-12-15 82 views
0

我想用dc.js中的crossfilter.js來表示移動平均數。用crossfilter.js和dc.js移動平均數

是否有可能來計算一組數據或如果有已經平均值計算傳遞的數據移動平均?

如果有可能,可以請你提供一個簡單的例子。

謝謝

+1

我不太清楚你打算做什麼。據我所知,應該完全有可能使用這些庫,因爲你必須將數據推送到它們中,所以只需計算n個元素的平均值並推送它,而不是推送元素本身。實時時間你將會落後大約n/2個元素。在我看來,只要你可以繪製正常的數據,那麼你可以繪製移動平均線。 –

回答

2

我很樂意被證明是錯誤的,但我真的不能想辦法在crossfilter做到這一點。

在時間序列的情況下,reduce()函數將被用來執行跨數據聚合,通過日期分組,如下面的顯現細胞:

Aggregating across fruits

隨着移動平均你會需要通過循環向下行執行操作:

enter image description here

服務器端,我也不會選擇SQL來計算數據庫的DAT均線一個;同樣我也不會使用crossfilter客戶端。

0

我不知道,如果你任何幫助,之後還在,但剛走克服這個問題我自己,我想我會分享我的解決方案的情況下,它可以幫助別人。

首先我聲明一些漂亮的標準reduce函數返回一個簡單的平均值,並添加兩個變量來存儲t-1和t-2的平均值。我創建了一個3週期移動平均線,但是如果您想要更長的移動平均線,您可以輕鬆地用您的pushsplice數據替換這些變量。當你建立一個圖表與這個小組,將以下添加到其valueAccessor()

var movingAverageGrp = yourDimension.group().reduce(movingAveAdd, movingAveRemove, movingAveInit); 

現在:

function movingAveInit(){ 
    return { 
    total: 0, 
    count: 0, 
    average: 0, 
    //These are the two vars for storing previous periods 
    avet1: 150000, 
    avet2: 150000 
    }; 
} 

function movingAveAdd(p,v){ 
    //'apples' is the property that you're interested in finding the moving average for 
    p.total = p.total + v.apples; 
    p.count = p.count +1; 
    p.avet2 = p.avet1; 
    p.avet1 = p.average; 
    p.average = p.total/p.count; 
    return p; 
} 

function movingAveRemove(p,v){ 
    p.total = p.total - v.apples; 
    p.count = p.count - 1; 
    p.avet2 = p.avet1; 
    p.avet1 = p.average; 
    p.average = p.total/p.count; 
    return p; 
} 

下稱這些對你的小組(尺寸應該是哪個時間段你正在使用):

yourChart 
    .valueAccessor(function (d) { 

     var mAv = ((d.value.avet2 + d.value.avet1 + d.value.average)/3); 
     return mAv; 
    }) 

如果存儲在數組中以前期間,可以通過使用此功能,而不是計算的移動平均值:

.valueAccessor(function (d) { 

    var sum = d.value.yourArray.reduce(function(a, b){ return a + b; }); 
    var count = d.value.yourArray.length;   
    var mAv = (sum/count); 
    return mAv; 

    }) 

這不是一個特別漂亮的解決方案,但它似乎爲我工作。