DescriptiveStats.java

/**
 * DescriptiveStats.java This file is part of WattDepot.
 *
 * Copyright (C) 2013  Cam Moore
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.wattdepot.common.analysis;

import java.util.ArrayList;

import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.wattdepot.common.domainmodel.InterpolatedValue;
import org.wattdepot.common.domainmodel.Labels;
import org.wattdepot.common.domainmodel.InterpolatedValueList;
import org.wattdepot.common.domainmodel.Measurement;
import org.wattdepot.common.domainmodel.MeasurementList;

/**
 * DescriptiveStats - Simple way of getting descriptive statistics for different
 * WattDepot measurement and interpolated values lists.
 * 
 * @author Cam Moore
 * 
 */
public class DescriptiveStats {

  private DescriptiveStatistics data;

  /**
   * @param meas MeasurementList.
   */
  public DescriptiveStats(MeasurementList meas) {
    this.data = new DescriptiveStatistics();
    for (Measurement m : meas.getMeasurements()) {
      data.addValue(m.getValue());
    }
  }
  
  /**
   * @param meas the Measurements.
   * @param valueType The type of value to use either Labels.POINT or Labels.INTERVAL.
   */
  public DescriptiveStats(MeasurementList meas, String valueType) {
    this.data = new DescriptiveStatistics();
    if (Labels.POINT.equals(valueType)) {
      for (Measurement m : meas.getMeasurements()) {
        data.addValue(m.getValue());
      }
    }
    else if (Labels.INTERVAL.equals(valueType)) {
      ArrayList<Measurement> measurements = meas.getMeasurements();
      for (int i = 1; i < measurements.size(); i++) {
        Measurement start = measurements.get(i - 1);
        Measurement end = measurements.get(i);
        data.addValue(end.getValue() - start.getValue());
      }
    }
  }
  
  /**
   * @param meas MeasuredValueList.
   */
  public DescriptiveStats(InterpolatedValueList meas) {
    this.data = new DescriptiveStatistics();
    for (InterpolatedValue v : meas.getInterpolatedValues()) {
      if (v.getValue() != null) {
        data.addValue(v.getValue());
      }
    }
  }

  /**
   * @param v the value to add.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#addValue(double)
   */
  public void addValue(double v) {
    data.addValue(v);
  }

  /**
   * 
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#clear()
   */
  public void clear() {
    data.clear();
  }

  /**
   * @param index the index.
   * @return get the value at the index.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getElement(int)
   */
  public double getElement(int index) {
    return data.getElement(index);
  }

  /**
   * @return the geometric mean of the values.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getGeometricMean()
   */
  public double getGeometricMean() {
    return data.getGeometricMean();
  }

  /**
   * @return the Kurtosis of the values.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getKurtosis()
   */
  public double getKurtosis() {
    return data.getKurtosis();
  }

  /**
   * @return the maximum value.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getMax()
   */
  public double getMax() {
    return data.getMax();
  }

  /**
   * @return the mean value.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getMean()
   */
  public double getMean() {
    return data.getMean();
  }

  /**
   * @return the minimum value.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getMin()
   */
  public double getMin() {
    return data.getMin();
  }

  /**
   * @return the number of values.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getN()
   */
  public long getN() {
    return data.getN();
  }

  /**
   * Returns an estimate for the pth percentile of the values.
   * @param p the requested percentile scaled from 0 to 100.
   * @return An estimate for the pth percentile.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getPercentile(double)
   */
  public double getPercentile(double p) {
    return data.getPercentile(p);
  }

  /**
   * @return the population variance of the values.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getPopulationVariance()
   */
  public double getPopulationVariance() {
    return data.getPopulationVariance();
  }

  /**
   * @return the skewness of the values.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getSkewness()
   */
  public double getSkewness() {
    return data.getSkewness();
  }

  /**
   * @return the values in sorted order.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getSortedValues()
   */
  public double[] getSortedValues() {
    return data.getSortedValues();
  }

  /**
   * @return the standard deviation of the values.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getStandardDeviation()
   */
  public double getStandardDeviation() {
    return data.getStandardDeviation();
  }

  /**
   * @return the sum of the values.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getSum()
   */
  public double getSum() {
    return data.getSum();
  }

  /**
   * @return the sum of the square of the values
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getSumsq()
   */
  public double getSumsq() {
    return data.getSumsq();
  }

  /**
   * @return an array of the values.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getValues()
   */
  public double[] getValues() {
    return data.getValues();
  }

  /**
   * @return the variance of the values.
   * @see org.apache.commons.math3.stat.descriptive.DescriptiveStatistics#getVariance()
   */
  public double getVariance() {
    return data.getVariance();
  }
  
  
}