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]

ただし、数十ではなく 50,000 の数字になる可能性があります。最小の数値は常に で1あり、最大の数値は です3

私がする必要があるのは、管理しやすい折れ線グラフでデータを表示できるように、ある種のローリング平均を見つけることです。

では、5 ~ 10 個のデータ ポイントごとの数を平均化することはできますか? このようなものを処理する最善の方法がわからないだけです。

注: 単一の平均を得ようとしているわけではありません。配列全体をさらにいくつかの平均点に絞り込もうとしています。したがって、1000 ポイントのデータ セットは、10 個の平均値に分割される可能性があります。

4

3 に答える 3

4

このスライスされた平均は、データベース選択を介して直接取得できます。データベースエンジンは、ほぼ確実にグループ化と平均計算をルビーよりも1桁速く実行します。さらに、データベースからプログラムにネットワーク経由で転送するデータがはるかに少なくなり、インスタンス化されるオブジェクトの数が大幅に減少します。結果セットを表すrubyプログラム。

したがって、元のクエリが(Postgresqlで)次のようになっている場合:

select value from mytable;

次のように、10個のアイテムごとに平均を生成するように変更できます。

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削除して、文字通りand句で置き換えることができます。chunkselectchunkrow/10group byorder by

于 2013-03-20T15:43:39.620 に答える
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]
于 2013-03-20T13:42:42.313 に答える
1

平均の平均は、全体の平均と同じではありません。多くの精度を必要としない場合、または平均のサブセットを必要としない場合を除き、お勧めしません。

于 2013-03-20T13:43:32.943 に答える