65.9K
CodeProject 正在变化。 阅读更多。
Home

anonympy - 使用 Python 进行数据匿名化

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2022年2月9日

公共领域

3分钟阅读

viewsIcon

19076

downloadIcon

53

对新编写的 anonympy 包的概述,以及对其一些方法和功能的演练。

引言

我们的世界充斥着数字数据。每天产生的数据量高达 2.5 百万亿字节。而且大多数时候,数据是个人和敏感的,是与该数据相关的人不希望公开的内容。个人和敏感数据的一些例子包括姓名、身份证号码、种族等。但是,数据也包含有价值的商业见解。那么,我们如何在隐私与收集和共享有价值信息的需求之间取得平衡呢?这就是数据匿名化的用武之地。

背景

随着数据匿名化需求的日益增长以及 Python 包的可扩展性,我认为创建一个库,该库可以提供多种数据匿名化技术并且易于使用,这将是一件好事。请认识一下,我的第一个包 - anonympy,创建的目的是为了为开源社区做出贡献并帮助其他用户处理敏感数据。目前,该软件包提供匿名化表格 (pd.DataFrame) 和图像数据的功能。

Using the Code

作为用法示例,让我们匿名化以下数据集 - sample.csv
让我们从安装软件包开始。 可以通过两个步骤实现

pip install anonympy
pip install cape-privacy==0.3.0 --no-deps

接下来,加载我们将尝试匿名化的示例数据集

import pandas as pd

url = r'https://raw.githubusercontent.com/ArtLabss/open-data-anonimizer/
      0287f675a535101f145cb975baf361a96ff71ed3/examples/files/new.csv'
df = pd.read_csv(url, parse_dates=['birthdate'])
df.head()

通过查看列,我们可以看到所有列都是个人敏感的。 因此,我们将不得不对每一列应用相关技术。 我们需要初始化我们的dfAnonymizer对象。

from anonympy.pandas import dfAnonymizer 

anonym = dfAnonymizer(df)

在应用任何函数之前,了解列的数据类型非常重要。 让我们检查数据类型,看看有哪些方法可供我们使用。

# check dtypes 
print(anonym.numeric_columns) 
print(anonym.categorical_columns) 
print(anonym.datetime_columns) 

... ['salary', 'age']
... ['first_name', 'address', 'city', 'phone', 'email', 'web']
... ['birthdate']

# available methods for each data type
from anonympy.pandas.utils import available_methods

print(available_methods())

... `numeric`:        
  * Perturbation - "numeric_noise"         
  * Binning - "numeric_binning"         
  * PCA Masking - "numeric_masking"        
  * Rounding - "numeric_rounding" 
`categorical`:         
  * Synthetic Data - "categorical_fake"         
  * Synthetic Data Auto - "categorical_fake_auto"         
  * Resampling from same Distribution - "categorical_resampling"         
  * Tokenazation - "categorical_tokenization"         
  * Email Masking - "categorical_email_masking" 
`datetime`:         
  * Synthetic Date - "datetime_fake"         
  * Perturbation - "datetime_noise" 
`general`:         
  * Drop Column - "column_suppression" 

在我们的dataset中,我们有 6 个分类列,2 个数值列和 1 个datetime类型。 此外,从available_methods返回的列表中,我们可以找到每种数据类型的函数。

让我们向age列添加一些随机噪声,对salary列中的值进行四舍五入,并部分屏蔽email列。

anonym.numeric_noise('age')   
anonym.numeric_rounding('salary')  
anonym.categorical_email_masking('email') 

# or with a single line 
# anonym.anonymize({'age':'numeric_noise',                      
                    'salary':'numeric_rounding',                      
                    'email':'categorical_email_masking'})

要查看更改,请调用to_df(),或者对于简短的摘要,请调用info()方法。

anonym.info()

现在我们想用虚假的名字替换first_name列中的名字。 为此,我们首先必须检查Faker是否具有相应的函数。

from anonympy.pandas.utils import fake_methods  

print(fake_methods('f')) # agrs: None / 'all' / any letter  

... factories, file_extension, file_name, file_path, firefox, first_name, 
first_name_female, first_name_male, first_name_nonbinary, fixed_width, 
format, free_email, free_email_domain, future_date, future_datetime 

很好,Faker有一个名为first_name的方法,让我们置换该列。

anonym.categorical_fake('first_name') 

# passing a dictionary is also valid -> {column_name: method_name} 
# anonym.categorical_fake({'first_name': 'first_name_female'}

检查其他列名的fake_methods,结果发现 Faker 也有addresscity的方法。 web列可以用url方法替换,phone列可以用phone_number替换。

anonym.categorical_fake_auto() # this will change `address` and `city` 
                               # because column names correspond to method names 
anonym.categorical_fake({'web': 'url', 'phone': 'phone_number'}) # here we need to specify, 
                               # because column names differs from method name 

剩下要匿名化的最后一列是birthdate。 由于我们有包含相同信息的age列,我们可以使用column_supression方法删除此列。 但是,为了清楚起见,让我们向其中添加一些噪声。

anonym.datetime_noise('birthdate')

就这样。 现在让我们比较匿名化前后的数据集。

以前

Click to enlarge

操作后

Click to enlarge

现在,您的数据集可以安全地公开发布了。

关注点

数据隐私和保护是数据处理的重要组成部分,应予以适当重视。 每个人都希望保护自己的个人和敏感数据。 因此,在本文中,我向您展示了如何使用 anonympy 通过 python 进行简单的匿名化和伪匿名化。 不应将此库用作可以完成所有操作的魔杖,您仍然必须彻底了解您的数据和所应用的技术,并且始终牢记您的最终目标。
这是该软件包的 GitHub 存储库 - anonympy

祝您数据匿名化顺利!

历史

  • 2022 年 2 月 9 日:初始版本
© . All rights reserved.