使用 Python 和 Tkinter 构建数据集 k-匿名系统

本代码使用 Python 和 Tkinter 库构建一个交互式系统,实现数据集的 k-匿名化,以保护敏感信息。该系统包含以下功能:

  1. 数据读入: 使用 pandas 库读入数据集,将其转化为 DataFrame 格式。
  2. 数据预处理: 对数据集进行缺失值、异常值、重复值等的处理,确保数据的准确性和完整性。
  3. 敏感属性的识别: 根据数据集中的属性,确定哪些属性属于敏感属性,需要进行 k-匿名处理。
  4. 数据的划分: 将数据集按照敏感属性的值进行划分,得到多个子集。
  5. k 匿名的实现: 对每个子集进行 k-匿名的处理,确保每个子集中的记录都满足 k-匿名的条件。
  6. 数据的合并: 将所有子集的数据合并成为最终的匿名数据集。
  7. 可视化界面的实现: 使用 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-匿名化实现,可能需要根据实际情况进行修改和完善。

使用说明:

  1. 将代码保存为 .py 文件。
  2. 运行代码,系统会显示一个窗口。
  3. 点击 '选择文件' 按钮选择需要匿名化的数据集文件。
  4. 点击 '处理数据' 按钮对数据进行预处理。
  5. 点击 '识别属性' 按钮识别敏感属性。
  6. 点击 '划分数据' 按钮将数据按照敏感属性的值进行划分。
  7. 在 'k-匿名处理' 区域输入 k 值,并点击 '开始处理' 按钮进行 k-匿名化处理。
  8. 点击 '合并数据' 按钮将所有子集的数据合并成最终的匿名数据集。
  9. 点击 '查看结果' 按钮查看匿名后的数据集。

示例数据集:

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 值和数据本身的特征。
Python Tkinter 数据集 k-匿名系统:实现隐私保护

原文地址: https://www.cveoy.top/t/topic/ogGB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录