Aggregate statistics gem released!

by: Joseph Ruscio | posted: September 13th, 2009

Finally got around to putting together a decent README (and a few last bugfixes) for my Aggregate statistics gem. With that out of the way, its ready for public consumption. Aggregate is an easy-to-use ruby implementation of a statistics aggregator that includes configurable histogram (binary or linear) support. Stats are aggregated in a streaming fashion that doesn’t record/store any of the individual sample values, enabling statistics tracking across a practically unlimited number of samples without any impact on your application’s performance or memory footprint.

Perhaps more importantly than the basic aggregate statistics (e.g. mean, standard deviation, max, min, etc) Aggregate also maintains a histogram of the sample distribution. For anything other than normally distributed data averages are insufficient at best and often downright misleading. 37Signals recently posted a terse but effective explanation on the importance of histograms. Here’s a second more detailed posting by Zed Shaw authored in his inimitable and entertaining style.

Full source code and a detailed README can be found on the project homepage and the gem is available on gemcutter.org. But just to whet your appetite, here’s a quick example:

require 'rubygems'
require 'aggregate'

# Create an Aggregate instance
binary_aggregate = Aggregate.new
linear_aggregate = Aggregate.new(0, 65536, 8192)

65536.times do
  x = rand(65536)
  binary_aggregate >> x
  linear_aggregate >> x
end

puts "\n** Binary Histogram **\n%s" % [binary_aggregate.to_s]
puts "\n** Linear Histogram **\n%s" % [linear_aggregate.to_s]

And the resulting output:

macbook:aggregate(master) jruscio$ ruby ./aggregate_example.rb 

** Binary Histogram **
value |------------------------------------------------------------------| count
    1 |                                                                  |     1
    2 |                                                                  |     1
    4 |                                                                  |     2
    8 |                                                                  |    10
   16 |                                                                  |    24
   32 |                                                                  |    33
   64 |                                                                  |    71
  128 |                                                                  |   121
  256 |                                                                  |   258
  512 |@                                                                 |   497
 1024 |@@                                                                |  1061
 2048 |@@@@                                                              |  2004
 4096 |@@@@@@@@                                                          |  4186
 8192 |@@@@@@@@@@@@@@@@                                                  |  8257
16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                 | 16345
32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| 32665
  ~
Total |------------------------------------------------------------------| 65536

** Linear Histogram **
value |------------------------------------------------------------------| count
    0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |  8269
 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |  8257
16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |  8302
24576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   |  8043
32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |  8273
40960 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   |  8052
49152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|  8315
57344 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   |  8025
Total |------------------------------------------------------------------| 65536

Feedback welcome and enjoy!