package WWW::Webrobot::Statistic; use strict; use warnings; # Author: Stefan Trcek # Copyright(c) 2004 ABAS Software AG use Carp; use WWW::Webrobot::Attributes qw(extended elem sum_x sum_x2 n min max); sub new { my ($class) = shift; my $self = bless({}, ref($class) || $class); my %parm = (@_); if (exists $parm{extended}) { $self->extended($parm{extended} ? 1 : 0); $self->elem([]); } $self->sum_x(0); $self->sum_x2(0); $self->n(0); return $self; } sub add { my $self = shift; foreach (@_) { push(@{$self->elem}, $_) if $self->extended; $self->sum_x($self->sum_x + $_); $self->sum_x2($self->sum_x2 + $_ * $_); $self->n($self->n + 1); $self->min($_) if !defined $self->min || $_ < $self->min; $self->max($_) if !defined $self->max || $_ > $self->max; } } sub mean { my $self = shift; return $self->sum_x / $self->n; } sub quad_mean { my $self = shift; return sqrt($self->sum_x2 / $self->n); } sub standard_deviation { my $self = shift; return 0 if $self->n <= 1; return sqrt( ($self->sum_x2 - $self->n * $self->mean * $self->mean) / ($self->n - 1) ); } sub median { my $self = shift; croak("Method only available in extended mode ". __PACKAGE__ . "->new(extended=>1)") if ! $self->extended; my @tmp = sort { $a<=>$b } @{$self->elem}; my $c = scalar @tmp; my $median = ($c%2 eq 1) ? $tmp[$c/2] : ($tmp[$c/2] + $tmp[$c/2-1]) / 2; return $median; } 1; =head1 NAME WWW::Webrobot::Statistic - Plain simple statistic =head1 SYNOPSIS use WWW::Webrobot::Statistic; my $s = WWW::Webrobot::Statistic -> new(); $s -> add(3, 4, 5); $s -> add(6, 7); print "n: ", $s->n, "\n"; print "min: ", $s->min, "\n"; print "max: ", $s->max, "\n"; print "mean: ", $s->mean, "\n"; print "median: ", $s->median, "\n"; print "standard deviation: ", $s->standard_deviation, "\n"; print "quadratic mean: ", $s->quad_mean, "\n"; =head1 DESCRIPTION Does some plain statistics. This module will store the complete data set on demand only. =head1 METHODS =over =item $s->new(%options) Constructor. Options: =over =item extended 1 store complete data set (only if you want to call L. 0 needn't store complete data set (L not available). =back =item $s->n Number of elements added. =item $s->min Smallest element. =item $s->max Largest element. =item $s->mean Arithmetic mean. =item $s->quad_mean Quadratic mean. =item $s->standard_deviation Standard deviation, base n-1 =item $s->median Median. Gives the arithmetic mean of the two "mean" elements if the number of elements is even. =back =cut __END__