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 }