#include "stdafx.h" #include "Preparator.h" #include #include using namespace std; int Preparator::sgn(double val){ if (val > 0) return 1; if (val == 0) return 0; return -1; } void Preparator::setLog(bool log){ IsLogarithm = log; } void Preparator::setBoxCox(bool boxcox){ IsBoxCox = boxcox; } void Preparator::setBoxCoxGamma(double gamma){ if (gamma > 0 && gamma < 1){ boxCoxGamma = gamma; } } vector Preparator::boxcox(vector timeSeria){ for (int i = 0; i < timeSeria.size(); i++){ timeSeria[i] = (pow(timeSeria[i], boxCoxGamma) - 1) / boxCoxGamma; } return timeSeria; } vector Preparator::deboxcox(vector timeSeria){ for (int i = 0; i < timeSeria.size(); i++){ timeSeria[i] = sgn(boxCoxGamma * timeSeria[i] + 1) * pow((abs(boxCoxGamma * timeSeria[i] + 1)), 1 / boxCoxGamma); } return timeSeria; } Preparator::Preparator(bool _IsLogarithm, bool _IsBoxCox){ IsBoxCox = _IsBoxCox; IsLogarithm = _IsLogarithm; } vector Preparator::logarithm(vector timeSeria){ for (int i = 0; i < timeSeria.size(); i++){ timeSeria[i] = log(timeSeria[i]); } return timeSeria; } vector Preparator::delogarithm(vector timeSeria){ for (int i = 0; i < timeSeria.size(); i++){ timeSeria[i] = exp(timeSeria[i]); } return timeSeria; } vector Preparator::shift(vector timeSeria){ double timeSeriaShiftValue = timeSeria[0]; for (int i = 0; i < timeSeria.size(); i++){ if (timeSeria[i] < timeSeriaShiftValue && timeSeria[i] < 0){ timeSeriaShiftValue = timeSeria[i]; } } if (timeSeriaShiftValue < 0){ timeSeriaShiftValue = fabs(timeSeriaShiftValue); for (int i = 0; i < timeSeria.size(); i++){ timeSeria[i] += timeSeriaShiftValue; } } return timeSeria; } vector Preparator::deShift(vector timeSeria){ if (timeSeriaShiftValue < 0){ for (int i = 0; i < timeSeria.size(); i++){ timeSeria[i] -= timeSeriaShiftValue; } } return timeSeria; } vector Preparator::normalizeTimeSeria(vector timeSeria){ timeSeria = shift(timeSeria); if (IsLogarithm) timeSeria = logarithm(timeSeria); if (IsBoxCox) timeSeria = boxcox(timeSeria); maxTimePoint = timeSeria[0]; for (int i = 0; i < timeSeria.size(); i++){ if (timeSeria[i] > maxTimePoint) maxTimePoint = timeSeria[i]; } for (int i = 0; i < timeSeria.size(); i++){ timeSeria[i] /= maxTimePoint; } return timeSeria; } vector Preparator::deNormalizeTimeSeria(vector timeSeria){ //shift(timeSeria); for (int i = 0; i < timeSeria.size(); i++){ timeSeria[i] *= maxTimePoint; } if (IsLogarithm) timeSeria = delogarithm(timeSeria); if (IsBoxCox) timeSeria = deboxcox(timeSeria); deShift(timeSeria); return timeSeria; } //bool Preparator::TestCommon(vector timeSeria, vector(*direct)(vector), // vector(*inverse)(vector)){ // vector initTimeSeria = timeSeria; // timeSeria = direct(inverse(timeSeria)); // double res = 0; // for (int i = 0; i < timeSeria.size(); i++){ // res += initTimeSeria[i] - timeSeria[i]; // } // return res == 0; //} double Preparator::TestPreparator(vector timeSeria){ double resLog = TestLogarithm(timeSeria); cout << "log func works with " << resLog << " error" << endl; double resBoxCox = TestBoxCox(timeSeria); cout << "BoxCox func works with " << resBoxCox << " error" << endl; double resShift = TestShift(timeSeria); cout << "Shift func works with " << resShift << " error" << endl; double resNormalize = TestNormalize(timeSeria); cout << "Normalize func works with " << resShift << " error" << endl; return resNormalize + resLog + resBoxCox + resShift; } double Preparator::TestLogarithm(vector timeSeria){ vector initTimeSeria = timeSeria; timeSeria = delogarithm(logarithm(timeSeria)); double res = 0; for (int i = 0; i < timeSeria.size(); i++){ res += initTimeSeria[i] - timeSeria[i]; } return res; } double Preparator::TestBoxCox(vector timeSeria){ vector initTimeSeria = timeSeria; timeSeria = deboxcox(boxcox(timeSeria)); double res = 0; for (int i = 0; i < timeSeria.size(); i++){ res += initTimeSeria[i] - timeSeria[i]; } return res; } double Preparator::TestShift(vector timeSeria){ vector initTimeSeria = timeSeria; timeSeria = deboxcox(boxcox(timeSeria)); double res = 0; for (int i = 0; i < timeSeria.size(); i++){ res += initTimeSeria[i] - timeSeria[i]; } return res; } double Preparator::TestNormalize(vector timeSeria){ timeSeriaShiftValue = 0; maxTimePoint = 0; IsLogarithm = false; IsBoxCox = false; boxCoxGamma = 0.5; vector initTimeSeria = timeSeria; timeSeria = deboxcox(boxcox(timeSeria)); double res = 0; for (int i = 0; i < timeSeria.size(); i++){ res += initTimeSeria[i] - timeSeria[i]; } return res; }