如何在 Python 中匿名(去识别)数据?

数据挖掘 机器学习 Python 深度学习 数据集 隐私
2022-02-28 08:12:39

我尝试了一种简单的算法来使用去识别技术对数据进行匿名化。但是代码对我不起作用。我想通过稍微改变字符串和整数的值来匿名化数据。数据样本可在此处获得

这是我尝试过的。

import pandas as pd 
import uuid as u 
import datetime as dt 
 # generate a pseudo-identifier sequesnce using python random number generator library uudi.

    def uudi_generator(length): 

    uudi_list= list() 
    i=0 
    while i < length: 
        uudi_list.append(u.uuid4()) 
    i+=1 
    return uudi_list 

#import original originaL dataset 
dataset = pd.read_csv('bankcredit-data.csv') 

# pseudo identifier
sLength = len(dataset['housing']) 
dataset.insert(0, 'uuid', pd.Series(uudi_generator(sLength), index=dataset.index)) 

# Transaction record attached to the original
dataset.insert(0, 'transaction_date', pd.Series([dt.datetime.now]*sLength, index=dataset.index)) 

#transcation record is attached to originaL data file 
dataset.to_csv('bankcredit-data.csv') 

#delete identifiabLe record from dataset 
del dataset['firstnamme'] 
del dataset['lastname'] 

# export  de-identified dataset as csv to be shared with the user
dataset.to_csv('deidentified-data.csv')
3个回答

我无权访问输入数据集,我自己创建了示例并尝试了您的代码,几乎没有修改并且它有效

input dataset:
housing      lastname   firstname
64403818    AA  AB
30893205    AC  AD
89883627    AE  AF
90302087    AG  AH

执行后,输入数据集附加了 uid 和 transaction_date

transaction_date    uuid                                     housing    lastname
10/31/2019 20:35    809b4505-2269-48b0-8833-e7502fc2738a    64403818    AA
10/31/2019 20:35    7de91a91-0b58-4703-b62b-4278efe22b05    30893205    AC
10/31/2019 20:35    d6b8cfbd-a9c2-4ffd-b336-0a23547445ea    89883627    AE
10/31/2019 20:35    11db6b3a-9679-4422-b754-4c1b23aa4801    90302087    AG


firstname
AB
AD
AF
AH

and the output dataset becomes
transaction_date    uuid                                    housing
10/31/2019 20:35    809b4505-2269-48b0-8833-e7502fc2738a    64403818
10/31/2019 20:35    7de91a91-0b58-4703-b62b-4278efe22b05    30893205
10/31/2019 20:35    d6b8cfbd-a9c2-4ffd-b336-0a23547445ea    89883627
10/31/2019 20:35    11db6b3a-9679-4422-b754-4c1b23aa4801    90302087


import pandas as pd 
import uuid as u 
from datetime import datetime
import datetime as dt 
 # generate a pseudo-identifier sequesnce using python random number generator library uudi.

def uudi_generator(length): 
    uudi_list= list() 
    i=0 
    while i < length: 
        uudi_list.append(u.uuid4()) 
        i+=1
    return uudi_list 

#import original originaL dataset 
dataset = pd.read_csv('C:\\mylocation\\input_credit_data.csv', index_col=False) 

# pseudo identifier
sLength = len(dataset['housing']) 
dataset.insert(0, 'uuid', pd.Series(uudi_generator(sLength), index=dataset.index)) 

# Transaction record attached to the original
dataset.insert(0, 'transaction_date', pd.Series([datetime.now()]*sLength, index=dataset.index)) 

#transcation record is attached to originaL data file 
dataset.to_csv('C:\\mylocation\\input_credit_data.csv',index=False) 

#delete identifiabLe record from dataset 
del dataset['firstname'] 
del dataset['lastname'] 

# export  de-identified dataset as csv to be shared with the user
dataset.to_csv('C:\\mylocation\\output_bankcredit-data.csv',index=False)

一切正常。很少的观察 -

  • uudi_generator 的缩进似乎不正确,但这可能是在此处粘贴时出现的问题
  • dt.datetime.now 应更改为 dt.datetime.now()

----编辑看到你上面的评论

尽管您的代码没有达到您正在寻找的目标,

您可以尝试以下类似的方法(移动 ASCII 值)......只是一个例子(代码对于大列表来说效率很低)......

def shift_ascii(name_string):

print("Hello "+name_string)
newname_list =  [chr(ord(name_string[i])+2) for i in range(len(name_string))]
newname_string = ''.join(newname_list)
return  newname_string

print("Hello "+shift_ascii("Roshan"))

我已将此文件用作输入 - [ https://filebin.net/p2k4lqbxfh209zd2/bankcredit-data.csv?t=zcathulf]

import pandas as pd 

#to shuffle move ascii value of every char
def shift_ascii(name_string):
    newname_list =  [chr(ord(name_string[i])+2) for i in range(len(name_string))]
    newname_string = ''.join(newname_list)
    return  newname_string

#import original original dataset 
dataset = pd.read_csv('bankcredit-data.csv',encoding = "utf") 
for col in dataset.columns:
    col_type = dataset[col].dtype 
    if str(col_type) == "object": #to check if the col is String
        dataset[col] = dataset[col].apply(lambda x: shift_ascii(x))

# export  de-identified dataset 
dataset.to_csv('deidentified-data.csv',index=False) 
#index=false is to get rid of first index column that Pandas adds by default
#to get the main data back, pass the output csv and change +2-->minus 2 in shift_ascii Fn )