2013-03-20 94 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