IFCA-Advanced-Computing/anjana

GitHub: IFCA-Advanced-Computing/anjana

ANJANA是一个实现多种隐私保护匿名化技术的Python库,支持k-anonymity、ℓ-diversity、t-closeness等算法,帮助用户在发布敏感数据前进行合规的隐私处理。

Stars: 45 | Forks: 5

[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-green.svg)](https://gitlab.ifca.es/privacy-security/anjana/-/blob/main/LICENSE) [![codecov](https://codecov.io/gh/IFCA-Advanced-Computing/anjana/graph/badge.svg?token=AVI53GZ7YD)](https://codecov.io/gh/IFCA-Advanced-Computing/anjana) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.11184467.svg)](https://doi.org/10.5281/zenodo.11184467) ![PyPI](https://img.shields.io/pypi/v/anjana) [![Downloads](https://static.pepy.tech/badge/anjana)](https://pepy.tech/project/anjana) [![Documentation Status](https://readthedocs.org/projects/anjana/badge/?version=latest)](https://anjana.readthedocs.io/en/latest/?badge=latest) [![release-please](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/3ca27b0db2110131.svg)](https://github.com/IFCA-Advanced-Computing/anjana/actions/workflows/release-please.yml) [![Publish Package in PyPI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/9fc3fcec19110132.svg)](https://github.com/IFCA-Advanced-Computing/anjana/actions/workflows/pypi.yml) [![CI/CD Pipeline](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/59eb14b944110133.svg)](https://github.com/IFCA-Advanced-Computing/anjana/actions/workflows/cicd.yml) [![Code Coverage](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/5e1806d9f8110134.svg)](https://github.com/IFCA-Advanced-Computing/anjana/actions/workflows/.codecov.yml) ![Python version](https://img.shields.io/badge/python-3.9|3.10|3.11|3.12-blue) **匿名性作为个人数据隐私的主要保障** ANJANA 是一个用于匿名化敏感数据的 Python 库。 基于 Python 库 _[pyCANON](https://github.com/IFCA-Advanced-Computing/pycanon)_,实现了以下匿名技术: * _k-anonymity_。 * _(α,k)-anonymity_。 * _ℓ-diversity_。 * _Entropy ℓ-diversity_。 * _Recursive (c,ℓ)-diversity_。 * _t-closeness_。 * _Basic β-likeness_。 * _Enhanced β-likeness_。 * _δ-disclosure privacy_。 ## 安装说明 首先,我们强烈建议使用虚拟环境。在 Linux 中: ``` virtualenv .venv -p python3 source .venv/bin/activate ``` **使用 [pip](https://pypi.org/project/anjana/)**: 安装 anjana(Linux 和 Windows): ``` pip install anjana ``` **使用 git**: 安装 anjana 的最新版本(Linux 和 Windows): ``` pip install git+https://github.com/IFCA-Advanced-Computing/anjana.git ``` ## 快速入门 为了对数据进行匿名化处理,你需要引入: * 包含待匿名化数据的 **pandas dataframe**。每列可以包含:标识符、准标识符或敏感属性。 * dataframe 中 **标识符名称的列表**,以便对其进行抑制处理。 * dataframe 中 **准标识符名称的列表**。 * 在应用除 _k-anonymity_ 以外的其他技术时的 **敏感属性**(仅限一个)。 * **要应用的匿名级别**,例如 _k_(针对 _k-anonymity_)、_ℓ_(针对 _ℓ-diversity_)、_t_(针对 _t-closeness_)、_β_(针对 _basic 或 enhanced β-likeness_)等。 * 允许的最大 **记录抑制级别**(从 0 到 100,表示抑制记录的百分比)。 * 包含每个准标识符的 **层次结构** 和级别的字典。 ### 示例:使用一些预定义的层次结构,对 [adult dataset](https://archive.ics.uci.edu/dataset/2/adult) 应用 _k-anonymity_、_ℓ-diversity_ 和 _t-closeness_: ``` import pandas as pd import anjana from anjana.anonymity import k_anonymity, l_diversity, t_closeness # 读取数据 data = pd.read_csv("adult.csv") data.columns = data.columns.str.strip() cols = [ "workclass", "education", "marital-status", "occupation", "sex", "native-country", ] for col in cols: data[col] = data[col].str.strip() # 定义标识符、准标识符和敏感属性 quasi_ident = [ "age", "education", "marital-status", "occupation", "sex", "native-country", ] ident = ["race"] sens_att = "salary-class" # 选择所需的 k、l 和 t 级别 k = 10 l_div = 2 t = 0.5 # 选择允许的抑制限制 supp_level = 50 # 导入每个准标识符的层次结构。定义包含它们的字典 hierarchies = { "age": dict(pd.read_csv("hierarchies/age.csv", header=None)), "education": dict(pd.read_csv("hierarchies/education.csv", header=None)), "marital-status": dict(pd.read_csv("hierarchies/marital.csv", header=None)), "occupation": dict(pd.read_csv("hierarchies/occupation.csv", header=None)), "sex": dict(pd.read_csv("hierarchies/sex.csv", header=None)), "native-country": dict(pd.read_csv("hierarchies/country.csv", header=None)), } # 应用这三个函数:k-anonymity、l-diversity 和 t-closeness data_anon = k_anonymity(data, ident, quasi_ident, k, supp_level, hierarchies) data_anon = l_diversity( data_anon, ident, quasi_ident, sens_att, k, l_div, supp_level, hierarchies ) data_anon = t_closeness( data_anon, ident, quasi_ident, sens_att, k, t, supp_level, hierarchies ) ``` 对于原始数据集中超过 30,000 条记录,上述代码可以在 4 秒内执行完成。 ### 定义你自己的层次结构 ANJANA 中所有可用的匿名函数都会接收一个字典,其中包含要应用于准标识符的层次结构。具体来说,该字典的键是要应用层次结构的准标识符列的名称(可能存在你不想泛化某些 QI 的情况,因此不需要对它们应用层次结构,只需不将它们包含在此字典中即可)。每个键(QI)的值由一个字典构成,使得键 0 的值为原始列(与原始数据集中的相同),键 1 对应于要应用的第一级转换(相对于原始列的值),依此类推,键的数量与已建立的层次结构级别数相同。 为了更好地理解,让我们看下面的例子。假设我们有以下模拟数据集(提取自用于测试目的的 [_hospital_extended.csv_](https://github.com/IFCA-Advanced-Computing/anjana/blob/main/examples/data/hospital_extended.csv) 数据集),其中 _age_、_gender_ 和 _city_ 为准标识符,_name_ 为标识符,_disease_ 为敏感属性。关于 QI,我们要应用以下层次结构:_age_ 为 5 年间隔(第一级)和 10 年间隔(第二级)。_gender_ 和 _city_ 的第一级均为抑制。 | name | age | gender | city | disease | |-----------|-----|--------|------------|----------------| | Ramsha | 29 | Female | Tamil Nadu | Cancer | | Yadu | 24 | Female | Kerala | Viralinfection | | Salima | 28 | Female | Tamil Nadu | TB | | Sunny | 27 | Male | Karnataka | No illness | | Joan | 24 | Female | Kerala | Heart-related | | Bahuksana | 23 | Male | Karnataka | TB | | Rambha | 19 | Male | Kerala | Cancer | | Kishor | 29 | Male | Karnataka | Heart-related | | Johnson | 17 | Male | Kerala | Heart-related | | John | 19 | Male | Kerala | Viralinfection | 然后,为了创建层次结构,我们可以定义以下字典: ``` import numpy as np age = data['age'].values # 值:[29 24 28 27 24 23 19 29 17 19](注意以下内容可以自动化) age_5years = ['[25, 30)', '[20, 25)', '[25, 30)', '[25, 30)', '[20, 25)', '[20, 25)', '[15, 20)', '[25, 30)', '[15, 20)', '[15, 20)'] age_10years = ['[20, 30)', '[20, 30)', '[20, 30)', '[20, 30)', '[20, 30)', '[20, 30)', '[10, 20)', '[20, 30)', '[10, 20)', '[10, 20)'] hierarchies = { "age": {0: age, 1: age_5years, 2: age_10years}, "gender": { 0: data["gender"].values, 1: np.array(["*"] * len(data["gender"].values)) # Suppression }, "city": {0: data["city"].values, 1: np.array(["*"] * len(data["city"].values))} # Suppression } ``` 你也可以使用 _utils_ 中的 _generate_intervals()_ 函数来创建基于区间的层次结构,如下所示: ``` import numpy as np from anjana.anonymity import utils age = data['age'].values hierarchies = { "age": { 0: data["age"].values, 1: utils.generate_intervals(data["age"].values, 0, 100, 5), 2: utils.generate_intervals(data["age"].values, 0, 100, 10), }, "gender": { 0: data["gender"].values, 1: np.array(["*"] * len(data["gender"].values)) # Suppression }, "city": {0: data["city"].values, 1: np.array(["*"] * len(data["city"].values))} # Suppression } ``` ## 许可证 本项目采用 [Apache 2.0 license](https://github.com/IFCA-Advanced-Computing/anjana/blob/main/LICENSE) 授权。 ## 引用 如果你正在使用 _anjana_,可以按如下方式引用: ``` @article{sainzpardo2024anjana, title={An Open Source Python Library for Anonymizing Sensitive Data}, author={S{\'a}inz-Pardo D{\'\i}az, Judith and L{\'o}pez Garc{\'\i}a, {\'A}lvaro}, journal={Scientific data}, volume={11}, number={1}, pages={1289}, year={2024}, publisher={Nature Publishing Group UK London} } ``` ## 相关工作 如果你正在使用 ___anjana___,你可能还会对以下内容感兴趣: - [_pyCANON_](https://github.com/IFCA-Advanced-Computing/pycanon):一个用于检查数据集匿名级别的 Python 库。 - [_trasgoDP_](https://github.com/judithspd/trasgoDP):一个实现了不同机制以直接将本地差分隐私应用于你的数据的 Python 库。 ## 资助与致谢 这项工作由欧盟通过 SIESTA 项目(Horizon Europe)资助,资助编号 [101131957](https://cordis.europa.eu/project/id/101131957)。

**_注意:Anjana 与坎塔布里亚神话_**

"La Anjana" 是坎塔布里亚神话中的一个角色。被称为坎塔布里亚的好仙女,她慷慨且保护所有人,帮助穷人、受苦的人以及在森林中迷路的人。

- 部分摘自:Cotera, Gustavo. Mitología de Cantabria. Ed. Tantin, Santander, 1998.

标签:Apache 2.0许可证, GDPR合规, k)-匿名, k-匿名, pyCANON, (α, 个人信息保护, 开源库, 搜索引擎爬虫, 敏感数据, 数据匿名化, 数据脱敏, 数据预处理, 网络安全, 逆向工具, 隐私保护, 隐私计算