ANJANA是一个开源框架,用于应用不同的匿名技术。
项目描述
ANJANA
匿名性作为个人数据隐私的主要保障
ANJANA是一个用于匿名化敏感数据的Python库。
以下匿名技术已实现,基于Python库 pyCANON
- k-匿名性.
- (α,k)-匿名性.
- ℓ-多样性.
- 熵ℓ-多样性.
- 递归(c,ℓ)-多样性.
- t-接近度.
- 基本β相似度.
- 增强β相似度.
- δ泄露隐私.
安装
首先,我们强烈建议使用虚拟环境。在linux
virtualenv .venv -p python3
source .venv/bin/activate
使用 pip:
安装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-匿名以外的其他技术时,所需的敏感属性(仅一个)。
- 要应用的匿名化程度,例如k(用于k-匿名),ℓ(用于ℓ-多样性),t(用于t-接近性),β(用于基本或增强β相似性)等。
- 允许的最大记录抑制程度(从0到100,作为被抑制记录的百分比)。
- 包含每个准标识符的层次结构和级别的字典。
示例:将k-匿名、ℓ-多样性和t-接近性应用于adult数据集,并应用一些预定义的层次结构
import pandas as pd
import anjana
from anjana.anonymity import k_anonymity, l_diversity, t_closeness
# Read and process the data
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()
# Define the identifiers, quasi-identifiers and the sensitive attribute
quasi_ident = [
"age",
"education",
"marital-status",
"occupation",
"sex",
"native-country",
]
ident = ["race"]
sens_att = "salary-class"
# Select the desired level of k, l and t
k = 10
l_div = 2
t = 0.5
# Select the suppression limit allowed
supp_level = 50
# Import the hierarquies for each quasi-identifier. Define a dictionary containing them
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)),
}
# Apply the three functions: k-anonymity, l-diversity and 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,因此不需要对它们应用层次结构,只需不要将它们包含在此字典中)。每个键(QI)的值由一个字典组成,其中值为0时对应于原始列(正如它在原始数据集中那样),值为1对应于要应用的第一级转换,与原始列的值相关,依此类推,具有与已建立的层次结构级别一样多的键。
为了更好地理解,让我们看一下以下示例。假设我们有一个以下模拟数据集(从hospital_extended.csv数据集提取,用于测试目的),其中age、gender和city作为准标识符,name作为标识符,disease作为敏感属性。关于QI,我们想应用以下层次结构:将age的5年(第一级)和10年(第二级)区间。
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
# Values: [29 24 28 27 24 23 19 29 17 19] (note that the following can be automatized)
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许可证。
项目状态
本项目正在积极开发中。
资金和致谢
本工作由欧盟通过SIESTA项目(Horizon Europe)资助,项目编号101131957。
注意:Anjana和坎塔布里亚的神话
"La Anjana" 是坎塔布里亚神话中的人物。被称为坎塔布里亚的好仙女,慷慨并保护所有人,她帮助穷人、受苦的人和在森林中迷路的人。
- 部分摘自:Cotera, Gustavo. 坎塔布里亚神话。Tantin出版社,桑坦德,1998年。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
anjana-1.0.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4559cb6e23f5ac3559ccf22a150f51289dfcf7dbd722a85bdb9f11e0f3e0efa3 |
|
MD5 | f45b1d3756f7bafea2a56d9ad3d7dc66 |
|
BLAKE2b-256 | 638e58eaa3696f80bbab00f3fb11140e9e1ea4d7bea3826fd4b6f66cd0c506db |
anjana-1.0.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 07d8340abf7a84b4e753180f7faf7c572cf12b99af47b4feb0ecfa3cc49a23f3 |
|
MD5 | c91d6145215d2661b749b36c2d3bca05 |
|
BLAKE2b-256 | 5d4b198dffce9fb82d27028977970040a2d8816f0e8ed09f88dbe911149cd3c6 |