File Coverage

blib/lib/WWW/Webrobot/Statistic.pm
Criterion Covered Total %
statement 46 46 100.0
branch 13 16 81.2
condition 7 9 77.7
subroutine 10 10 100.0
pod 5 6 83.3
total 81 87 93.1


line stmt bran cond sub pod time code
1             package WWW::Webrobot::Statistic;
2 1     1   763 use strict;
  1         2  
  1         33  
3 1     1   5 use warnings;
  1         1  
  1         24  
4              
5             # Author: Stefan Trcek
6             # Copyright(c) 2004 ABAS Software AG
7              
8              
9 1     1   4 use Carp;
  1         2  
  1         58  
10              
11 1     1   486 use WWW::Webrobot::Attributes qw(extended elem sum_x sum_x2 n min max);
  1         2  
  1         4  
12              
13              
14             sub new {
15 4     4 1 33 my ($class) = shift;
16 4   33     25 my $self = bless({}, ref($class) || $class);
17 4         9 my %parm = (@_);
18 4 50       12 if (exists $parm{extended}) {
19 4 100       19 $self->extended($parm{extended} ? 1 : 0);
20 4         14 $self->elem([]);
21             }
22 4         11 $self->sum_x(0);
23 4         10 $self->sum_x2(0);
24 4         10 $self->n(0);
25 4         9 return $self;
26             }
27              
28             sub add {
29 15     15 0 43 my $self = shift;
30 15         21 foreach (@_) {
31 15 100       30 push(@{$self->elem}, $_) if $self->extended;
  12         25  
32 15         32 $self->sum_x($self->sum_x + $_);
33 15         31 $self->sum_x2($self->sum_x2 + $_ * $_);
34 15         35 $self->n($self->n + 1);
35 15 100 100     38 $self->min($_) if !defined $self->min || $_ < $self->min;
36 15 100 100     35 $self->max($_) if !defined $self->max || $_ > $self->max;
37             }
38             }
39              
40             sub mean {
41 9     9 1 26 my $self = shift;
42 9         18 return $self->sum_x / $self->n;
43             }
44              
45             sub quad_mean {
46 3     3 1 4 my $self = shift;
47 3         21 return sqrt($self->sum_x2 / $self->n);
48             }
49              
50             sub standard_deviation {
51 3     3 1 4 my $self = shift;
52 3 50       8 return 0 if $self->n <= 1;
53             return sqrt(
54 3         7 ($self->sum_x2 - $self->n * $self->mean * $self->mean) /
55             ($self->n - 1)
56             );
57             }
58              
59             sub median {
60 3     3 1 15 my $self = shift;
61 3 50       8 croak("Method only available in extended mode ". __PACKAGE__ . "->new(extended=>1)")
62             if ! $self->extended;
63 3         4 my @tmp = sort { $a<=>$b } @{$self->elem};
  14         23  
  3         9  
64 3         4 my $c = scalar @tmp;
65 3 100       14 my $median = ($c%2 eq 1) ? $tmp[$c/2] : ($tmp[$c/2] + $tmp[$c/2-1]) / 2;
66 3         17 return $median;
67             }
68              
69             1;
70              
71             =head1 NAME
72              
73             WWW::Webrobot::Statistic - Plain simple statistic
74              
75             =head1 SYNOPSIS
76              
77             use WWW::Webrobot::Statistic;
78             my $s = WWW::Webrobot::Statistic -> new();
79             $s -> add(3, 4, 5);
80             $s -> add(6, 7);
81             print "n: ", $s->n, "\n";
82             print "min: ", $s->min, "\n";
83             print "max: ", $s->max, "\n";
84             print "mean: ", $s->mean, "\n";
85             print "median: ", $s->median, "\n";
86             print "standard deviation: ", $s->standard_deviation, "\n";
87             print "quadratic mean: ", $s->quad_mean, "\n";
88              
89              
90             =head1 DESCRIPTION
91              
92             Does some plain statistics.
93             This module will store the complete data set on demand only.
94              
95             =head1 METHODS
96              
97             =over
98              
99             =item $s->new(%options)
100              
101             Constructor.
102             Options:
103              
104             =over
105              
106             =item extended
107              
108             1 store complete data set (only if you want to call L.
109              
110             0 needn't store complete data set (L not available).
111              
112             =back
113              
114             =item $s->n
115              
116             Number of elements added.
117              
118             =item $s->min
119              
120             Smallest element.
121              
122             =item $s->max
123              
124             Largest element.
125              
126             =item $s->mean
127              
128             Arithmetic mean.
129              
130             =item $s->quad_mean
131              
132             Quadratic mean.
133              
134             =item $s->standard_deviation
135              
136             Standard deviation, base n-1
137              
138             =item $s->median
139              
140             Median.
141             Gives the arithmetic mean of the two "mean" elements
142             if the number of elements is even.
143              
144             =back
145              
146             =cut
147              
148             __END__