<commit_before>/*******************************************************************************
 * BusinessHorizon2
 *
 * Copyright (C) 
 * 2012-2013 <NAME>, <NAME>, <NAME>,
 * <NAME>, <NAME>, <NAME>, <NAME>, <NAME>
 * 2013-2014 <NAME>, <NAME>, <NAME>, <NAME>, 
 * <NAME>
 * 
 *
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/

package dhbw.ka.mwi.businesshorizon2.methods.timeseries;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Arrays;

import org.apache.log4j.Logger;
//import org.jamesii.core.math.statistics.timeseries.AutoCovariance;

import Jama.Matrix;
import cern.colt.list.DoubleArrayList;
import cern.colt.matrix.DoubleFactory2D;
import cern.colt.matrix.DoubleMatrix2D;
import cern.colt.matrix.linalg.LUDecomposition;
import cern.jet.stat.Descriptive;
import dhbw.ka.mwi.businesshorizon2.methods.CallbackInterface;
import dhbw.ka.mwi.businesshorizon2.methods.StochasticMethodException;
import dhbw.ka.mwi.businesshorizon2.methods.discountedCashflow.APV;
import dhbw.ka.mwi.businesshorizon2.models.Szenario;

/**
 * Diese Klasse stellt die Methoden zur Verfuegung, die benoetigt werden, um die
 * Zeitreihenanalyse durch zu fuehren. Sie baut auf der YuleWalkerGleichung auf
 * und implementiert das AR-Modell.
 * 
 * @author <NAME>, <NAME>, <NAME>, <NAME>, Marcel
 *         Rosenberger, <NAME>
 * 
 */

public class AnalysisTimeseries {

	private static final Logger LOGGER = Logger.getLogger("AnalysisTimeseries.class");
	private DoubleArrayList autokovarianzen;
	private DoubleArrayList bereinigteZeitreihe;
	private DoubleMatrix2D modellparameter;
	private double standardabweichung;
	private double mittelwert;
	private double[] erwarteteCashFlows;
	private double[] erwartetesFremdkapital;
	private double abweichung;
	private double[] autocorrelation;

	/**
	 * Methode zur Berechnung des Mittelwerts einer Zeitreihe.
	 * 
	 * @author <NAME>, <NAME>, <NAME>
	 * 
	 * @param zeitreihe
	 *            Durch den Benutzer gegebene Zeitreihe vergangener Werte.
	 * @return Gibt den Mittelwert einer Zeitreihe zurück.
	 * 
	 * 
	 * 
	 *         Speichern wir die Werte ebenfalls in ein Array ? Falls ja kann
	 *         die Methode übernommen werden
	 */

	public double berechneMittelwert(DoubleArrayList zeitreihe) {
		double mittelwert = 0;
		double summe = 0;
		int zaehler = 0;

		for (int i = 0; i < zeitreihe.size(); i++) {
			summe = summe + zeitreihe.get(i);
			zaehler = zaehler + 1;
		}

		if (zaehler != 0) {
			mittelwert = summe / zaehler;
		}

		return mittelwert;
	}

	/**
	 * Methode zur Berechnung der Varianz *
	 * 
	 * Berechnung der Varianz über den zuvor errechneten Mittelwert
	 */

	public double berechneVarianz(DoubleArrayList zeitreihe) {
		double mittelwert = berechneMittelwert(zeitreihe);
		double varianz = 0;
		double s2 = 0;

		for (int i = 0; i < zeitreihe.size(); i++) {
			s2 = zeitreihe.get(i) - mittelwert;
			s2 = s2 * s2;
			varianz = varianz + s2;
		}

		varianz = varianz / zeitreihe.size();
		return varianz;
	}

	/**
	 * Methode zur Berechnung der Standardabweichung *
	 * 
	 * Berechnung der Standardabweichung über den zuvor errechneten Varianz
	 */

	public double berechneStandardabweichung(DoubleArrayList zeitreihe) {

		double standardabweichung = 0;
		double varianz = berechneVarianz(zeitreihe);

		standardabweichung = Math.sqrt(varianz);

		return standardabweichung;
	}
	
	/**
	 * Berechnung der Autokovarianzen einer Zeitreihe für verschiedene lags(Verschiebung)
	 * lag geht von 0 bis p-1
	 * 
	 * @author <NAME>, <NAME>, <NAME>
	 * @param zeitreihe: Arraylist der Messwerte für die Zeitreihe von Zeitpunkt 0 bis zur Ordnung p
	 * 
	 * @return results: beinhaltet alle Autokovarianzen der Zeitreihe für jedes lag
	 */
	public double[] calculateAutocorrelations(DoubleArrayList zeitreihe) {

		double[] results = new double[zeitreihe.size()];

		for (int i = 0; i < zeitreihe.size(); i++) {
			results[i] = this.calculateAutocorrelation(zeitreihe, i);
		}
		return results;
	}
	
	/**
	 * Berechnung der Autokokorrelationen einer Zeitreihe für verschiedene lags(Verschiebung)
	 * lag geht von 0 bis p-1
	 * 
	 * @author <NAME>, <NAME>, <NAME>
	 * @param zeitreihe: Arraylist der Messwerte für die Zeitreihe von Zeitpunkt 0 bis zur Ordnung p
	 * 
	 * @return results: beinhaltet alle Autokokorrelationen der Zeitreihe für jedes lag
	 */
	public double[] calculateAutocovariances(DoubleArrayList zeitreihe) {

		double[] results = new double[zeitreihe.size()];

		for (int i = 0; i < zeitreihe.size(); i++) {
			results[i] = this.calculateAutocovariance(zeitreihe, i);
		}
		return results;
	}

	/**
	 * Berechnung der Autokovarianzen einer Zeitreihe zum gegebenen lag
	 * 
	 * @author <NAME>, <NAME>, <NAME>
	 * @param zeitreihe: Arraylist der Messwerte für die Zeitreihe von Zeitpunkt 0 bis zur Ordnung p
	 * @param lag: gibt die Verschiebung der Zeitreihen an
	 * @return autocovariance: autorvarianz der Zeitreihe zum gegebenen lag
	 */
	public double calculateAutocovariance(DoubleArrayList zeitreihe, int lag) {

		double expectedValue = this.berechneMittelwert(zeitreihe);

		double autocovariance = 0;

		DoubleArrayList lokalezeitreihe = new DoubleArrayList(zeitreihe.size());

		for (int i = lag; i < zeitreihe.size(); i++) {
			lokalezeitreihe.add(zeitreihe.get(i));
		}

		// berechnet die Autokovarianzen der Zeitreihe in Abhängigkeit von j
		for (int j = 0; j < lokalezeitreihe.size(); j++) {
			autocovariance += (lokalezeitreihe.get(j) - expectedValue) * (zeitreihe.get(j) - expectedValue);
		}
		autocovariance = autocovariance / lokalezeitreihe.size();
		return autocovariance;
	}

	/**
	 * Methode zur Berechnung der Autokorrelation einer Zeitreihe;
	 * Ausgangswert ist die Berechnung der Autokovarianz
	 * 
	 * @author <NAME>, <NAME>, <NAME>
	 * @param zeitreihe: Arraylist der Zeitreihe mit den einzelnen Messwerten
	 * @param lag: gibt den Wert der Verschiebung der Zeitreihe an
	 * @return Autokorrelation: berechnet aus Autokovarianz/Varianz
	 */	
	public double calculateAutocorrelation(DoubleArrayList zeitreihe, int lag) {<commit_msg>added comment change index (duplicate Zeitreihen-array)<commit_after>/*******************************************************************************
 * BusinessHorizon2
 *
 * Copyright (C) 
 * 2012-2013 <NAME>, <NAME>, <NAME>,
 * <NAME>, <NAME>, <NAME>, <NAME>, <NAME>
 * 2013-2014 <NAME>, <NAME>, <NAME>, <NAME>, 
 * <NAME>
 * 
 *
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/

package dhbw.ka.mwi.businesshorizon2.methods.timeseries;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Arrays;

import org.apache.log4j.Logger;
//import org.jamesii.core.math.statistics.timeseries.AutoCovariance;

import Jama.Matrix;
import cern.colt.list.DoubleArrayList;
import cern.colt.matrix.DoubleFactory2D;
import cern.colt.matrix.DoubleMatrix2D;
import cern.colt.matrix.linalg.LUDecomposition;
import cern.jet.stat.Descriptive;
import dhbw.ka.mwi.businesshorizon2.methods.CallbackInterface;
import dhbw.ka.mwi.businesshorizon2.methods.StochasticMethodException;
import dhbw.ka.mwi.businesshorizon2.methods.discountedCashflow.APV;
import dhbw.ka.mwi.businesshorizon2.models.Szenario;

/**
 * Diese Klasse stellt die Methoden zur Verfuegung, die benoetigt werden, um die
 * Zeitreihenanalyse durch zu fuehren. Sie baut auf der YuleWalkerGleichung auf
 * und implementiert das AR-Modell.
 * 
 * @author <NAME>, <NAME>, <NAME>, <NAME>, Marcel
 *         Rosenberger, <NAME>
 * 
 */

public class AnalysisTimeseries {

	private static final Logger LOGGER = Logger.getLogger("AnalysisTimeseries.class");
	private DoubleArrayList autokovarianzen;
	private DoubleArrayList bereinigteZeitreihe;
	private DoubleMatrix2D modellparameter;
	private double standardabweichung;
	private double mittelwert;
	private double[] erwarteteCashFlows;
	private double[] erwartetesFremdkapital;
	private double abweichung;
	private double[] autocorrelation;

	/**
	 * Methode zur Berechnung des Mittelwerts einer Zeitreihe.
	 * 
	 * @author <NAME>, <NAME>, <NAME>
	 * 
	 * @param zeitreihe
	 *            Durch den Benutzer gegebene Zeitreihe vergangener Werte.
	 * @return Gibt den Mittelwert einer Zeitreihe zurück.
	 * 
	 * 
	 * 
	 *         Speichern wir die Werte ebenfalls in ein Array ? Falls ja kann
	 *         die Methode übernommen werden
	 */

	public double berechneMittelwert(DoubleArrayList zeitreihe) {
		double mittelwert = 0;
		double summe = 0;
		int zaehler = 0;

		for (int i = 0; i < zeitreihe.size(); i++) {
			summe = summe + zeitreihe.get(i);
			zaehler = zaehler + 1;
		}

		if (zaehler != 0) {
			mittelwert = summe / zaehler;
		}

		return mittelwert;
	}

	/**
	 * Methode zur Berechnung der Varianz *
	 * 
	 * Berechnung der Varianz über den zuvor errechneten Mittelwert
	 */

	public double berechneVarianz(DoubleArrayList zeitreihe) {
		double mittelwert = berechneMittelwert(zeitreihe);
		double varianz = 0;
		double s2 = 0;

		for (int i = 0; i < zeitreihe.size(); i++) {
			s2 = zeitreihe.get(i) - mittelwert;
			s2 = s2 * s2;
			varianz = varianz + s2;
		}

		varianz = varianz / zeitreihe.size();
		return varianz;
	}

	/**
	 * Methode zur Berechnung der Standardabweichung *
	 * 
	 * Berechnung der Standardabweichung über den zuvor errechneten Varianz
	 */

	public double berechneStandardabweichung(DoubleArrayList zeitreihe) {

		double standardabweichung = 0;
		double varianz = berechneVarianz(zeitreihe);

		standardabweichung = Math.sqrt(varianz);

		return standardabweichung;
	}
	
	/**
	 * Berechnung der Autokovarianzen einer Zeitreihe für verschiedene lags(Verschiebung)
	 * lag geht von 0 bis p-1
	 * 
	 * @author <NAME>, <NAME>, <NAME>
	 * @param zeitreihe: Arraylist der Messwerte für die Zeitreihe von Zeitpunkt 0 bis zur Ordnung p
	 * 
	 * @return results: beinhaltet alle Autokovarianzen der Zeitreihe für jedes lag
	 */
	public double[] calculateAutocorrelations(DoubleArrayList zeitreihe) {

		double[] results = new double[zeitreihe.size()];

		for (int i = 0; i < zeitreihe.size(); i++) {
			results[i] = this.calculateAutocorrelation(zeitreihe, i);
		}
		return results;
	}
	
	/**
	 * Berechnung der Autokokorrelationen einer Zeitreihe für verschiedene lags(Verschiebung)
	 * lag geht von 0 bis p-1
	 * 
	 * @author <NAME>, <NAME>, <NAME>
	 * @param zeitreihe: Arraylist der Messwerte für die Zeitreihe von Zeitpunkt 0 bis zur Ordnung p
	 * 
	 * @return results: beinhaltet alle Autokokorrelationen der Zeitreihe für jedes lag
	 */
	public double[] calculateAutocovariances(DoubleArrayList zeitreihe) {

		double[] results = new double[zeitreihe.size()];

		for (int i = 0; i < zeitreihe.size(); i++) {
			results[i] = this.calculateAutocovariance(zeitreihe, i);
		}
		return results;
	}

	/**
	 * Berechnung der Autokovarianzen einer Zeitreihe zum gegebenen lag
	 * 
	 * @author <NAME>, <NAME>, <NAME>
	 * @param zeitreihe: Arraylist der Messwerte für die Zeitreihe von Zeitpunkt 0 bis zur Ordnung p
	 * @param lag: gibt die Verschiebung der Zeitreihen an
	 * @return autocovariance: autorvarianz der Zeitreihe zum gegebenen lag
	 */
	public double calculateAutocovariance(DoubleArrayList zeitreihe, int lag) {

		double expectedValue = this.berechneMittelwert(zeitreihe);

		double autocovariance = 0;

		DoubleArrayList lokalezeitreihe = new DoubleArrayList(zeitreihe.size());

		//duplizierte Zeitreihenarray um Parameter lag verschoben
		for (int i = lag; i < zeitreihe.size()-lag; i++) {
			lokalezeitreihe.add(zeitreihe.get(i));
		}

		// berechnet die Autokovarianzen der Zeitreihe in Abhängigkeit von j
		for (int j = 0; j < lokalezeitreihe.size(); j++) {
			autocovariance += (lokalezeitreihe.get(j) - expectedValue) * (zeitreihe.get(j) - expectedValue);
		}
		autocovariance = autocovariance / lokalezeitreihe.size();
		return autocovariance;
	}

	/**
	 * Methode zur Berechnung der Autokorrelation einer Zeitreihe;
	 * Ausgangswert ist die Berechnung der Autokovarianz
	 * 
	 * @author <NAME>, <NAME>, <NAME>
	 * @param zeitreihe: Arraylist der Zeitreihe mit den einzelnen Messwerten
	 * @param lag: gibt den Wert der Verschiebung der Zeitreihe an
	 * @return Autokorrelation: berechnet aus Autokovarianz/Varianz
	 */	
	public double calculateAutocorrelation(DoubleArrayList zeitreihe, int lag) {
{'fraction_non_alphanumeric': 0.11774992713494609, 'fraction_numerical': 0.007869425823375109, 'mean_word_length': 4.202805155420774, 'pattern_counts': {'":': 0, '<': 83, '<?xml version=': 0, '>': 71, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7397188', 'n_tokens_mistral': 4890, 'n_tokens_neox': 4506, 'n_words': 1297}