Trend analysis using iterative value increments
        Posted  
        
            by Dave Jarvis
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Dave Jarvis
        
        
        
        Published on 2010-03-18T21:22:07Z
        Indexed on 
            2010/03/18
            21:51 UTC
        
        
        Read the original article
        Hit count: 568
        
We have configured iReport to generate the following graph:

The real data points are in blue, the trend line is green. The problems include:
- Too many data points for the trend line
 - Trend line does not follow a Bezier curve (spline)
 
The source of the problem is with the incrementer class. The incrementer is provided with the data points iteratively. There does not appear to be a way to get the set of data. The code that calculates the trend line looks as follows:
import java.math.BigDecimal;
import net.sf.jasperreports.engine.fill.*;
/**
 * Used by an iReport variable to increment its average.
 */
public class MovingAverageIncrementer
  implements JRIncrementer {
  private BigDecimal average;
  private int incr = 0;
  /**
   * Instantiated by the MovingAverageIncrementerFactory class.
   */
  public MovingAverageIncrementer() {
  }
  /**
   * Returns the newly incremented value, which is calculated by averaging
   * the previous value from the previous call to this method.
   * 
   * @param jrFillVariable Unused.
   * @param object New data point to average.
   * @param abstractValueProvider Unused.
   * @return The newly incremented value.
   */
  public Object increment( JRFillVariable jrFillVariable, Object object, 
                           AbstractValueProvider abstractValueProvider ) {
    BigDecimal value = new BigDecimal( ( ( Number )object ).doubleValue() );
    // Average every 10 data points
    //
    if( incr % 10 == 0 ) {
      setAverage( ( value.add( getAverage() ).doubleValue() / 2.0 ) );
    }
    incr++;
    return getAverage();
  }
  /**
   * Changes the value that is the moving average.
   * @param average The new moving average value.
   */
  private void setAverage( BigDecimal average ) {
    this.average = average;
  }
  /**
   * Returns the current moving average average.
   * @return Value used for plotting on a report.
   */
  protected BigDecimal getAverage() {
    if( this.average == null ) {
      this.average = new BigDecimal( 0 );
    }
    return this.average;
  }
  /** Helper method. */    
  private void setAverage( double d ) {
    setAverage( new BigDecimal( d ) );
  }
}
How would you create a smoother and more accurate representation of the trend line?
© Stack Overflow or respective owner