Source for file trendClass.php
Documentation is available at trendClass.php
require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/linearBestFitClass.php';
require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/logarithmicBestFitClass.php';
require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/exponentialBestFitClass.php';
require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/powerBestFitClass.php';
require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/polynomialBestFitClass.php';
const TREND_LINEAR = 'Linear';
const TREND_LOGARITHMIC = 'Logarithmic';
const TREND_EXPONENTIAL = 'Exponential';
const TREND_POWER = 'Power';
const TREND_POLYNOMIAL_2 = 'Polynomial_2';
const TREND_POLYNOMIAL_3 = 'Polynomial_3';
const TREND_POLYNOMIAL_4 = 'Polynomial_4';
const TREND_POLYNOMIAL_5 = 'Polynomial_5';
const TREND_POLYNOMIAL_6 = 'Polynomial_6';
const TREND_BEST_FIT = 'Bestfit';
const TREND_BEST_FIT_NO_POLY = 'Bestfit_no_Polynomials';
private static $_trendTypes = array( self::TREND_LINEAR,
private static $_trendTypePolyOrders = array( self::TREND_POLYNOMIAL_2,
self::TREND_POLYNOMIAL_3,
self::TREND_POLYNOMIAL_4,
self::TREND_POLYNOMIAL_5,
private static $_trendCache = array();
public static function calculate($trendType= self::TREND_BEST_FIT, $yValues, $xValues= array(), $const= True) {
// Calculate number of points in each dataset
// Define X Values if necessary
// Ensure both arrays of points are the same size
trigger_error("trend(): Number of elements in coordinate arrays do not match.", E_USER_ERROR);
// Determine which trend method has been requested
// Instantiate and return the class for the requested trend method
case self::TREND_LINEAR :
case self::TREND_LOGARITHMIC :
case self::TREND_EXPONENTIAL :
if (!isset (self::$_trendCache[$key])) {
$className = 'PHPExcel_'. $trendType. '_Best_Fit';
self::$_trendCache[$key] = new $className($yValues,$xValues,$const);
return self::$_trendCache[$key];
case self::TREND_POLYNOMIAL_2 :
case self::TREND_POLYNOMIAL_3 :
case self::TREND_POLYNOMIAL_4 :
case self::TREND_POLYNOMIAL_5 :
case self::TREND_POLYNOMIAL_6 :
if (!isset (self::$_trendCache[$key])) {
$order = substr($trendType,- 1);
self::$_trendCache[$key] = new PHPExcel_Polynomial_Best_Fit($order,$yValues,$xValues,$const);
return self::$_trendCache[$key];
case self::TREND_BEST_FIT :
case self::TREND_BEST_FIT_NO_POLY :
// If the request is to determine the best fit regression, then we test each trend line in turn
// Start by generating an instance of each available trend method
foreach(self::$_trendTypes as $trendMethod) {
$className = 'PHPExcel_'. $trendMethod. 'BestFit';
$bestFit[$trendMethod] = new $className($yValues,$xValues,$const);
$bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit();
if ($trendType != self::TREND_BEST_FIT_NO_POLY) {
foreach(self::$_trendTypePolyOrders as $trendMethod) {
$order = substr($trendMethod,- 1);
if ($bestFit[$trendMethod]->getError()) {
unset ($bestFit[$trendMethod]);
$bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit();
// Determine which of our trend lines is the best fit, and then we return the instance of that trend class
$bestFitType = key($bestFitValue);
return $bestFit[$bestFitType];
} // function calculate()
|