2013-03-20 110 views
2

我有什麼最終相當於一大堆數字(從數據庫中拉出)。平均大陣?

因此,它可能看起來像:[1,3,1,2,1,3,1,2,3,1,2,3,1,3,1,3,1,1,3,2,3,3,3,3,1,1,1,1,3,2,1]

它除了能5萬個的數字,而不是幾十個。最低的數字將始終爲1,最高的數字爲3

我需要做的是找到某種滾動平均值,以便我可以在可管理的折線圖中顯示數據。

那麼也許平均每5-10個數據點的數量?只是不知道什麼是處理這樣的事情的最佳方式。

注意:不期望獲得單個平均值。我期待將整個陣列提升到幾個平均點。因此,一個1000點的數據集可能會被分解爲10個平均數。

+1

作爲一個旁註,你的例子中的最高值(編輯前)不是3.)但真正的問題是,你的'平均值'應該有多精確? – raina77ow 2013-03-20 13:39:58

+2

是否有一個原因,你不只是直接從數據庫中選擇平均值? – mcfinnigan 2013-03-20 13:40:02

+0

@mcfinnigan我不需要一個單一的平均值...我需要多個平均數據點。所以一個1000個數字的數據集可能有10個平均點。 – Shpigford 2013-03-20 13:41:48

回答

4
1.9.3p327 :001 > a = [1,3,1,2,1,3,1,2,3,1,2,3,1,3,1,3,1,1,3,2,3,3,3,3,1,1,1,1,3,2,1] 
=> [1, 3, 1, 2, 1, 3, 1, 2, 3, 1, 2, 3, 1, 3, 1, 3, 1, 1, 3, 2, 3, 3, 3, 3, 1, 1, 1, 1, 3, 2, 1] 
1.9.3p327 :002 > a.each_cons(10).map { |subarray| subarray.reduce(0.0, :+)/subarray.size } 
=> [1.8, 1.9, 1.9, 1.9, 2.0, 2.0, 2.0, 2.0, 1.9, 1.9, 2.0, 2.1, 2.1, 2.3, 2.3, 2.3, 2.1, 2.1, 2.1, 2.1, 2.1, 1.9] 

雖然這在性能方面並不好。它是O(NM),其中N是數組的大小,M是窗口的大小(在這種情況下爲10)。

UPD:或者你可以使用each_slice,如果你需要「減少」數組大小顯著:

1.9.3p327 :002 > a.each_slice(10).map { |subarray| subarray.reduce(0.0, :+)/subarray.size } 
=> [1.8, 2.0, 2.1, 1.0] 
+1

對於OP想要的內容,「也許平均每5-10個數據點的數量?」,「each_cons」應該被替換爲「each_slice」。 – AGS 2013-03-20 13:48:21

+0

'each_cons'和'each_slice'在做什麼? 'each_slice'可能是我以後的......但是好奇的是'each_cons'究竟做了什麼。 – Shpigford 2013-03-20 13:49:44

+1

'each_slice'接受每個'n'元素,而'each_cons'向前滑動一個大小爲'n'的窗口,每次一個元素。 [Enumerable Docs](http://ruby-doc.org/core-2.0/Enumerable.html) – AGS 2013-03-20 13:51:39

1

平均數的平均值爲一樣的總體平均。除非您不要求太高的精度,或者不需要平均值的分組,我不推薦它。

+0

這不是真正的「平均值」......它只是將一堆數字分成幾個平均值數據範圍而不是單個平均值。 – Shpigford 2013-03-20 13:48:31

+0

然後你的想法是黃金(平均分) – fcm 2013-03-20 13:50:32

4

這個切片平均值可以通過數據庫選擇直接獲取。你的數據庫引擎幾乎可以確定分組和平均計算的速度至少比ruby快一個數量級,另外,你將通過數據傳輸的數據遠少於你的數據庫到你的程序,並大幅減少你實例化的對象數量ruby程序來表示結果集。

所以,如果您的原始查詢看起來是這樣的(在PostgreSQL):

select value from mytable; 

您可以修改它在每十個項目這樣產生平均:

select avg(value) as chunk_avg, row/10 as chunk 
from 
    (select value, row_number() over() - 1 as row 
    from mytable) x 
group by chunk 
order by chunk; 

SqlFiddle

如果你不想要結果中的塊號,你可以把它包裹在另一個外部選擇中只是項目chunk_avg,或跌落chunk領域形成select條款和字面上row/10group byorder by條款取代chunk