IFCA-Advanced-Computing/anjana
GitHub: IFCA-Advanced-Computing/anjana
ANJANA是一个实现多种隐私保护匿名化技术的Python库,支持k-anonymity、ℓ-diversity、t-closeness等算法,帮助用户在发布敏感数据前进行合规的隐私处理。
Stars: 45 | Forks: 5
[](https://gitlab.ifca.es/privacy-security/anjana/-/blob/main/LICENSE)
[](https://codecov.io/gh/IFCA-Advanced-Computing/anjana)
[](https://doi.org/10.5281/zenodo.11184467)

[](https://pepy.tech/project/anjana)
[](https://anjana.readthedocs.io/en/latest/?badge=latest)
[](https://github.com/IFCA-Advanced-Computing/anjana/actions/workflows/release-please.yml)
[](https://github.com/IFCA-Advanced-Computing/anjana/actions/workflows/pypi.yml)
[](https://github.com/IFCA-Advanced-Computing/anjana/actions/workflows/cicd.yml)
[](https://github.com/IFCA-Advanced-Computing/anjana/actions/workflows/.codecov.yml)

**匿名性作为个人数据隐私的主要保障**
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.