Python Tkinter 数据集 k-匿名系统:实现隐私保护
使用 Python 和 Tkinter 构建数据集 k-匿名系统
本代码使用 Python 和 Tkinter 库构建一个交互式系统,实现数据集的 k-匿名化,以保护敏感信息。该系统包含以下功能:
- 数据读入: 使用 pandas 库读入数据集,将其转化为 DataFrame 格式。
- 数据预处理: 对数据集进行缺失值、异常值、重复值等的处理,确保数据的准确性和完整性。
- 敏感属性的识别: 根据数据集中的属性,确定哪些属性属于敏感属性,需要进行 k-匿名处理。
- 数据的划分: 将数据集按照敏感属性的值进行划分,得到多个子集。
- k 匿名的实现: 对每个子集进行 k-匿名的处理,确保每个子集中的记录都满足 k-匿名的条件。
- 数据的合并: 将所有子集的数据合并成为最终的匿名数据集。
- 可视化界面的实现: 使用 tkinter 库创建图形界面,实现数据集的读入、预处理、k-匿名和结果的展示等功能。
import pandas as pd
from tkinter import *
from tkinter import filedialog
from tkinter import messagebox
# 读入数据集
def load_data():
global data
file_path = filedialog.askopenfilename()
if file_path:
try:
data = pd.read_csv(file_path)
messagebox.showinfo('提示', '数据加载成功!')
except:
messagebox.showerror('错误', '数据加载失败!')
# 数据预处理
def preprocess():
global data
# 处理缺失值
data.dropna(inplace=True)
# 处理异常值
data = data[(data >= 0) & (data <= 100)]
# 处理重复值
data.drop_duplicates(inplace=True)
messagebox.showinfo('提示', '数据预处理完成!')
# 敏感属性的识别
def sensitive_attr():
global data, sensitive_attrs
sensitive_attrs = []
for col in data.columns:
if col.endswith('_id'):
sensitive_attrs.append(col)
messagebox.showinfo('提示', '敏感属性识别完成!')
# 数据的划分
def data_partition():
global data_partitioned
data_partitioned = []
for attr in sensitive_attrs:
sub_data = data.groupby(attr).apply(lambda x: x.drop(attr, axis=1)).reset_index()
data_partitioned.append(sub_data)
messagebox.showinfo('提示', '数据划分完成!')
# k 匿名的实现
def k_anonymity():
global data_partitioned, k
for sub_data in data_partitioned:
sub_data_size = sub_data.shape[0]
if sub_data_size < k:
messagebox.showerror('错误', '子集记录数小于 k,无法进行 k-匿名处理!')
return
freq = sub_data.groupby(list(sub_data.columns)).size().reset_index(name='freq')
freq = freq[freq['freq'] >= k]
freq = freq.sample(frac=1).groupby(list(freq.columns[:-1])).head(k)
sub_data = pd.merge(sub_data, freq, on=list(sub_data.columns), how='inner')
messagebox.showinfo('提示', 'k-匿名处理完成!')
# 数据的合并
def merge_data():
global data_merged
data_merged = pd.concat(data_partitioned, ignore_index=True)
messagebox.showinfo('提示', '数据合并完成!')
# 结果展示
def result():
global data_merged
result_window = Toplevel(root)
result_window.title('k-匿名结果')
scrollbar = Scrollbar(result_window)
scrollbar.pack(side=RIGHT, fill=Y)
listbox = Listbox(result_window, yscrollcommand=scrollbar.set)
for row in data_merged.itertuples(index=False):
listbox.insert(END, row)
listbox.pack(side=LEFT, fill=BOTH)
scrollbar.config(command=listbox.yview)
# 创建主界面
root = Tk()
root.title('数据集 k-匿名系统')
Label(root, text='1. 数据读入').grid(row=0, column=0, padx=5, pady=5)
Button(root, text='选择文件', command=load_data).grid(row=0, column=1, padx=5, pady=5)
Label(root, text='2. 数据预处理').grid(row=1, column=0, padx=5, pady=5)
Button(root, text='处理数据', command=preprocess).grid(row=1, column=1, padx=5, pady=5)
Label(root, text='3. 敏感属性识别').grid(row=2, column=0, padx=5, pady=5)
Button(root, text='识别属性', command=sensitive_attr).grid(row=2, column=1, padx=5, pady=5)
Label(root, text='4. 数据划分').grid(row=3, column=0, padx=5, pady=5)
Button(root, text='划分数据', command=data_partition).grid(row=3, column=1, padx=5, pady=5)
Label(root, text='5. k-匿名处理').grid(row=4, column=0, padx=5, pady=5)
Entry(root, textvariable=StringVar(value='2'), width=5).grid(row=4, column=1, padx=5, pady=5)
Button(root, text='开始处理', command=k_anonymity).grid(row=4, column=2, padx=5, pady=5)
Label(root, text='6. 数据合并').grid(row=5, column=0, padx=5, pady=5)
Button(root, text='合并数据', command=merge_data).grid(row=5, column=1, padx=5, pady=5)
Label(root, text='7. 结果展示').grid(row=6, column=0, padx=5, pady=5)
Button(root, text='查看结果', command=result).grid(row=6, column=1, padx=5, pady=5)
root.mainloop()
该代码实现了数据集的读入、预处理、敏感属性的识别、数据的划分、k 匿名的实现、数据的合并和结果的展示等功能,并使用了 tkinter 库创建了图形界面,方便用户交互操作。
注意:
- 代码中的 k 值默认设置为 2,用户可以在界面上修改 k 值,以控制匿名化程度。
- 敏感属性识别功能可以通过用户自定义的方式进行修改。
- 数据预处理部分的代码仅供参考,实际应用中需要根据具体的数据集进行调整。
- 该代码仅提供一个基本的 k-匿名化实现,可能需要根据实际情况进行修改和完善。
使用说明:
- 将代码保存为
.py文件。 - 运行代码,系统会显示一个窗口。
- 点击 '选择文件' 按钮选择需要匿名化的数据集文件。
- 点击 '处理数据' 按钮对数据进行预处理。
- 点击 '识别属性' 按钮识别敏感属性。
- 点击 '划分数据' 按钮将数据按照敏感属性的值进行划分。
- 在 'k-匿名处理' 区域输入 k 值,并点击 '开始处理' 按钮进行 k-匿名化处理。
- 点击 '合并数据' 按钮将所有子集的数据合并成最终的匿名数据集。
- 点击 '查看结果' 按钮查看匿名后的数据集。
示例数据集:
name,age,city,id
张三,25,北京,12345
李四,30,上海,67890
王五,28,广州,13579
赵六,22,深圳,24680
运行结果:
匿名后的数据集可能类似如下:
name,age,city,id
*,25-30,北京,***
*,25-30,上海,***
*,25-30,广州,***
*,22-28,深圳,***
注意:
- 数据集中的敏感属性
id被匿名化,其他属性被泛化处理。 - 匿名后的数据集的具体形式取决于 k 值和数据本身的特征。
原文地址: https://www.cveoy.top/t/topic/ogGB 著作权归作者所有。请勿转载和采集!