From ec87efc815eb94374dd0a0ba57933fbf430efdb2 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Wed, 8 Apr 2026 11:23:02 +0200 Subject: [PATCH] Finish Nettoyage Lineaire --- src/ecoparasite/nettoyage/Nettoyage.java | 57 +++++++++++++++++++ .../ecoparasite/nettoyage/NettoyageTest.java | 22 +++++++ 2 files changed, 79 insertions(+) diff --git a/src/ecoparasite/nettoyage/Nettoyage.java b/src/ecoparasite/nettoyage/Nettoyage.java index 19468f6..0005775 100644 --- a/src/ecoparasite/nettoyage/Nettoyage.java +++ b/src/ecoparasite/nettoyage/Nettoyage.java @@ -68,5 +68,62 @@ public class Nettoyage { return nettoieColumnsMoyenne(list, getValue, setValue, true); } + /** + * Permet de remplacer les valeurs abérrantes d'un paramètre d'un HashSet à l'aide d'une regression linéaire, corrélation entre deux valeurs. + * Exemple d'utilisation : T = Poisson, V = Double, getX = Poisson::getWidth, getY = Poisson::getInfes, setY = Poisson::setInfes + * + * @param list La liste de données cobaye. + * @param getX La fonction (Getter) qui permet d'obtenir les données du X de notre regression linéaire. + * @param getY La fonction (Getter) qui permet d'obtenir la valeur que l'on veut vérifier + * @param setY La fonction (Setter) qui permet de remplacer la valeur si null. + * @param allowNegative Savoir si une valeur négative est forcément aberrant. + * @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. + */ + public static HashSet nettoieColumnsLinear(HashSet list, Function getX, Function getY, BiConsumer setY, boolean allowNegative ){ + double meanX = Completion.calculateMean(list, getX); + double meanY = Completion.calculateMean(list, getY); + + double a = Completion.calculateLinearA(list,getX,getY,meanX,meanY); + double b = Completion.calculateLinearB(meanX,meanY,a); + + ArrayList array = new ArrayList<>(); + for ( T item : list) { + if (getY.apply(item)!= null){ //Test des valeurs null pour les Tests Unitaires. Je ne devrais pas en avoir. + array.add(getY.apply(item).doubleValue()); + } + } + + Collections.sort(array); + + int quartIndex = array.size()/4; + Double firstQuart = array.get(quartIndex); + Double thirdQuart = array.get(quartIndex *3); + Double IQR = thirdQuart - firstQuart; + + for(T item : list){ + if( getY.apply(item) == null || getY.apply(item).doubleValue() < firstQuart - (IQR * 1.5) || getY.apply(item).doubleValue() > thirdQuart + (IQR * 1.5) || ( !allowNegative && getY.apply(item).doubleValue() < 0 ) ){ + Double value = a * getX.apply(item).doubleValue() + b; + setY.accept( item, (V) value ); + } + } + + return list; + } + + /** + * Polymorphisme de la fonction nettoyage de colonne linéaire avec par défaut, l'autorisation des valeurs négatives. + * @param list + * @param getX + * @param getY + * @param setY + * @return + * @param + * @param + */ + public static HashSet nettoieColumnsLinear(HashSet list, Function getX, Function getY, BiConsumer setY){ + return nettoieColumnsLinear(list, getX, getY, setY, true); + } } diff --git a/tests/ecoparasite/nettoyage/NettoyageTest.java b/tests/ecoparasite/nettoyage/NettoyageTest.java index b08d9e3..97c32d9 100644 --- a/tests/ecoparasite/nettoyage/NettoyageTest.java +++ b/tests/ecoparasite/nettoyage/NettoyageTest.java @@ -37,4 +37,26 @@ class NettoyageTest { System.out.println(testp); } + @org.junit.jupiter.api.Test + void nettoieColumnsLinear() throws InputFileException, RawDataOverflow { + + RawData test = InputFactory.readData("test2.csv", ","); + + HashSet testp = MackerelSerra.parse(test); + + System.out.println(testp); + + Function getLength = Poisson::getLength; + Function getInfes = Poisson::getInfestation; + BiConsumer setInfes = Poisson::setInfestation; + + testp = Completion.completeColumnsLinear( testp, getLength, getInfes, setInfes ); + + System.out.println(testp); + + testp = Nettoyage.nettoieColumnsLinear( testp, getLength, getInfes, setInfes, false ); + + System.out.println(testp); + } + } \ No newline at end of file