跳转到主要内容

ANJANA是一个开源框架,用于应用不同的匿名技术。

项目描述

ANJANA

License: Apache 2.0 codecov DOI PyPI Downloads Documentation Status release-please Publish Package in PyPI CI/CD Pipeline Code Coverage Python version

匿名性作为个人数据隐私的主要保障

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数据集提取,用于测试目的),其中agegendercity作为准标识符,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 (16.6 kB 查看哈希值)

上传时间

构建分布

anjana-1.0.0-py3-none-any.whl (22.4 kB 查看哈希值)

上传时间 Python 3

由...支持