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 */ public class Nettoyage { /** * Permet de remplacer les valeurs abérrantes 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. * @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 nettoieColumnsMoyenne(HashSet list, Function getValue, BiConsumer setValue, boolean allowNegative ){ Double mean = Completion.calculateMean(list, getValue); 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).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( getValue.apply(item).doubleValue() < firstQuart - (IQR * 1.5) || getValue.apply(item).doubleValue() > thirdQuart + (IQR * 1.5) || ( !allowNegative && getValue.apply(item).doubleValue() < 0 ) ){ setValue.accept( item, (V) mean); } } return list; } /** * Polymorphisme de la fonction précédente. Autorise les valeurs abérrantes à être négative. * @param list * @param getValue * @param setValue * @return * @param * @param * * @see Nettoyage::nettoieColumnsMoyenne */ public static HashSet nettoieColumnsMoyenne(HashSet list, Function getValue, BiConsumer setValue){ 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); } }