/** * Copyright (c) 2010-2016 by the respective copyright holders. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.openhab.persistence.jdbc.utils; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.LinkedList; import java.util.Queue; //import org.apache.commons.math3.stat.StatUtils; /** * Calculates the average/mean of a number series. * * @author Helmut Lehmeyer * @since 1.8.0 */ public class MovingAverage { private final Queue<BigDecimal> win = new LinkedList<BigDecimal>(); private final int period; private BigDecimal sum = BigDecimal.ZERO; public MovingAverage(int period) { assert period > 0 : "Period must be a positive integer"; this.period = period; } public void add(Double num) { add(new BigDecimal(num)); } public void add(Long num) { add(new BigDecimal(num)); } public void add(Integer num) { add(new BigDecimal(num)); } public void add(BigDecimal num) { sum = sum.add(num); win.add(num); if (win.size() > period) { sum = sum.subtract(win.remove()); } } public BigDecimal getAverage() { if (win.isEmpty()) { return BigDecimal.ZERO; // technically the average is undefined } BigDecimal divisor = BigDecimal.valueOf(win.size()); return sum.divide(divisor, 2, RoundingMode.HALF_UP); } public double getAverageDouble() { return getAverage().doubleValue(); } public int getAverageInteger() { return getAverage().intValue(); } }