def all_local_aggregation(tab, k, variables, method, unknown=''): ''' retourne une table k-anonymisée par aggrégation locale tab: la table à anonymiser k: un entier est le k-anonymat recherché variables est une liste de variable de tab : on traitera les données dans cet ordre et la première variable sera celle dont on est le plus prêt à sacrifier l'aggrégation method : voir local_aggregation Remarque: si pour un groupe donné, plusieurs modalité ont moins de k éléments, on les remplace toutes par "dropped", on peut ainsi avoir un groupe avec dropped d'une taille supérieure à k. Si ensuite on a une modalité plus grande que k à l'intérieur du groupe hétéroclyte avec dropped, on peut afficher cette variable ''' assert(isinstance(k, int)) assert(all([var in tab.columns for var in variables])) assert(all(tab[variables].dtypes == 'object')) if get_k(tab, variables) >= k: return tab variable_a_aggreger = variables[-1] if len(variables) == 1: new_serie = local_aggregation(tab[variable_a_aggreger], k, method, unknown) tab[variable_a_aggreger] = new_serie return tab if get_k(tab, variables[:-1]) < k: tab = all_local_aggregation(tab, k, variables[:-1], method, unknown) # on a une table k-anonymisée lorsqu'elle est restreinte aux # len(variables) - 1 premières variables # on applique l'aggrégation locale d'une variable par groupe grp = tab.groupby(variables[:-1]) new_serie = grp[variable_a_aggreger].apply( lambda x: local_aggregation(x, k, method, unknown) ) tab[variable_a_aggreger] = new_serie assert get_k(tab, variables, unknown) >= k return tab
def all_local_aggregation(tab, k, variables, method, unknown=''): ''' retourne une table k-anonymisée par aggrégation locale tab: la table à anonymiser k: un entier est le k-anonymat recherché variables est une liste de variable de tab : on traitera les données dans cet ordre et la première variable sera celle dont on est le plus prêt à sacrifier l'aggrégation method : voir local_aggregation Remarque: si pour un groupe donné, plusieurs modalité ont moins de k éléments, on les remplace toutes par "dropped", on peut ainsi avoir un groupe avec dropped d'une taille supérieure à k. Si ensuite on a une modalité plus grande que k à l'intérieur du groupe hétéroclyte avec dropped, on peut afficher cette variable ''' assert (isinstance(k, int)) assert (all([var in tab.columns for var in variables])) assert (all(tab[variables].dtypes == 'object')) if get_k(tab, variables) >= k: return tab variable_a_aggreger = variables[-1] if len(variables) == 1: new_serie = local_aggregation(tab[variable_a_aggreger], k, method, unknown) tab[variable_a_aggreger] = new_serie return tab if get_k(tab, variables[:-1]) < k: tab = all_local_aggregation(tab, k, variables[:-1], method, unknown) # on a une table k-anonymisée lorsqu'elle est restreinte aux # len(variables) - 1 premières variables # on applique l'aggrégation locale d'une variable par groupe grp = tab.groupby(variables[:-1]) new_serie = grp[variable_a_aggreger].apply( lambda x: local_aggregation(x, k, method, unknown)) tab[variable_a_aggreger] = new_serie assert get_k(tab, variables, unknown) >= k return tab
def transfo_1(x): return transfo.local_aggregation(x, 5, 'regroup_with_smallest', unknown='')
def transfo_0(x): return transfo.local_aggregation(x, 5, 'with_closest', unknown='')
def aggregation_year(x): return(local_aggregation(x, 5, 'with_closest', 'non renseigné'))
def aggregation_serie(x): return(local_aggregation(x, 5, 'regroup_with_smallest', 'non renseigné'))