1 package com.github.davidmoten.rx2;
2
3 public final class Statistics {
4
5 private final long count;
6 private final double sumX;
7 private final double sumX2;
8
9 private Statistics(long count, double sumX, double sumX2) {
10 this.count = count;
11 this.sumX = sumX;
12 this.sumX2 = sumX2;
13 }
14
15 public static Statistics create() {
16 return new Statistics(0, 0, 0);
17 }
18
19 public Statistics add(Number number) {
20 double x = number.doubleValue();
21 return new Statistics(count + 1, sumX + x, sumX2 + x * x);
22 }
23
24 public long count() {
25 return count;
26 }
27
28 public double sum() {
29 return sumX;
30 }
31
32 public double sumSquares() {
33 return sumX2;
34 }
35
36 public double mean() {
37 return sumX / count;
38 }
39
40 public double sd() {
41 double m = mean();
42 return Math.sqrt(sumX2 / count - m * m);
43 }
44
45 @Override
46 public String toString() {
47 StringBuilder builder = new StringBuilder();
48 builder.append("Statistics [count=");
49 builder.append(count);
50 builder.append(", sum=");
51 builder.append(sum());
52 builder.append(", sumSquares=");
53 builder.append(sumSquares());
54 builder.append(", mean=");
55 builder.append(mean());
56 builder.append(", sd=");
57 builder.append(sd());
58 builder.append("]");
59 return builder.toString();
60 }
61 }