diff --git a/src/ecoparasite/nettoyage/Nettoyage.java b/src/ecoparasite/nettoyage/Nettoyage.java index d922b71..2daacfe 100644 --- a/src/ecoparasite/nettoyage/Nettoyage.java +++ b/src/ecoparasite/nettoyage/Nettoyage.java @@ -1,8 +1,13 @@ package ecoparasite.nettoyage; +import ecoparasite.completion.Completion; import ecoparasite.poisson.Poisson; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; +import java.util.function.BiConsumer; +import java.util.function.Function; /** * Class Définissant les méthodes statics de Nettoyage des données @@ -16,16 +21,31 @@ public class Nettoyage { */ public static HashSet nettoiePoissonMean(HashSet tablePoisson){ - Double mean = mean(tablePoisson); //Moyenne - Double ecart = ecartType(tablePoisson); // Ecart Type + Double mean = Completion.calculateMean(tablePoisson,Poisson::getInfestation); //Moyenne - Double z = 0.0; + ArrayList infest = new ArrayList<>(); + for (Poisson p : tablePoisson) { + if (p.getInfestation() != null){ //Test des valeurs null pour les Tests Unitaires. Je ne devrais pas en avoir. + infest.add(p.getInfestation()); + } + } + + Collections.sort(infest); + + int quartIndex = infest.size()/4; + Double firstQuart = infest.get(quartIndex); + Double thirdQuart = infest.get(quartIndex *3); + Double IQR = thirdQuart - firstQuart; for (Poisson p : tablePoisson) { - z = ( p.getInfestation() - mean ) / ecart; - if ( z >= 2.5 ) { - p.setInfestation(mean); + if (p.getInfestation() == null) { + p.setInfestation(mean); //Fonction codé en dur pour éviter des problèmes dans les Tests Unitaires : Completion devrais etre fait et valeur null ne devrait pas exister + } + else { + if (p.getInfestation() < firstQuart - (IQR * 1.5) || p.getInfestation() > thirdQuart + (IQR * 1.5)) { + p.setInfestation(mean); + } } } @@ -33,48 +53,41 @@ public class Nettoyage { } /** - * Methode Privée permettant de calculer la moyenne - * @param tablePoisson Un Hashset de Poisson contenant nos données - * @return Un Double correspondant à la moyenne + * Permet de remplacer les valeurs inexistantes d'un paramètre d'un HashSet par la moyenne des autres valeurs (non nulles). + * Exemple d'utilisation : T = Poisson, V = Double, getValue = Poisson::getInfestation, setValue = Poisson::setInfestation. + * + * @param list La liste de données cobaye. + * @param getValue La fonction (Getter) qui permet d'obtenir la valeur que l'on veut vérifier + * @param setValue La fonction (Setter) qui permet de remplacer la valeur si null. + * @return Le HashSet avec les valeurs remplacés. + * @param Le type de données cobaye. Exemple : Poisson, Population + * @param Le type de la donnée à vérifier, doit être un Wrapper Number. Exemple : Double. */ - private static Double mean(HashSet tablePoisson){ + public static HashSet nettoieColumnsMoyenne(HashSet list, Function getValue, BiConsumer setValue ){ - Double mean = 0.0; + Double mean = Completion.calculateMean(list, getValue); - for (Poisson p : tablePoisson){ - mean += p.getInfestation(); + ArrayList array = new ArrayList<>(); + for ( T item : list) { + if (getValue.apply(item)!= null){ //Test des valeurs null pour les Tests Unitaires. Je ne devrais pas en avoir. + array.add(getValue.apply(item)); + } } - return mean / tablePoisson.size(); - } + Collections.sort(array); - /** - * Methode Privée permettant de calculer la variance - * @param tablePoisson Un Hashset de Poisson contenant nos données - * @return Un Double correspondant à la variance - */ - private static Double variance(HashSet tablePoisson){ + int quartIndex = array.size()/4; + Double firstQuart = array.get(quartIndex); + Double thirdQuart = array.get(quartIndex *3); + Double IQR = thirdQuart - firstQuart; - Double vari = 0.0; - Double mean = mean(tablePoisson); - - for (Poisson p : tablePoisson) { - vari += Math.pow( (p.getInfestation() - mean), 2); + for(T item : list){ + if( getValue.apply(item) < firstQuart - (IQR * 1.5) || getValue.apply(item) > thirdQuart + (IQR * 1.5)){ + setValue.accept( item, (V) mean); + } } - return vari / tablePoisson.size(); - } - - /** - * Methode Privée permettant de calculer l'écart-type - * @param tablePoisson Un Hashset de Poisson contenant nos données - * @return Un Double correspondant à l'écart-type - */ - private static Double ecartType(HashSet tablePoisson){ - - Double vari = variance(tablePoisson); - - return Math.sqrt(vari); + return list; } diff --git a/tests/ecoparasite/nettoyage/NettoyageTest.java b/tests/ecoparasite/nettoyage/NettoyageTest.java index faa7515..34f4333 100644 --- a/tests/ecoparasite/nettoyage/NettoyageTest.java +++ b/tests/ecoparasite/nettoyage/NettoyageTest.java @@ -6,6 +6,7 @@ import ecoparasite.input.InputFileException; import ecoparasite.input.RawData; import ecoparasite.input.RawDataOverflow; import ecoparasite.poisson.Mackerel; +import ecoparasite.poisson.MackerelSerra; import ecoparasite.poisson.Poisson; import org.junit.jupiter.api.Test; @@ -16,9 +17,9 @@ class NettoyageTest { @org.junit.jupiter.api.Test void nettoiePoissonMean() throws InputFileException, RawDataOverflow { - RawData test = InputFactory.readData("testNettoie.csv"); + RawData test = InputFactory.readData("test2.csv", ","); - HashSet testp = Mackerel.parse(test); + HashSet testp = MackerelSerra.parse(test); System.out.println(testp);