import pandas as pd from tkinter import * from tkinter import filedialog

定义K-AnonymitySystem类

class KAnonymitySystem:

def validate_sensitivity_attributes(self):
    sensitivity_attributes = self.sensitivity_entry.get().split(",")
    sensitivity_attributes = [attr.strip() for attr in sensitivity_attributes]  # 去除空格
    self.sensitive_attributes = [attr for attr in sensitivity_attributes if attr in self.df.columns]  # 筛选出有效属性
    self.sensitivity_entry.delete(0, END)
    self.sensitivity_entry.insert(0, ', '.join(self.sensitive_attributes))

def __init__(self, root):
    # 初始化窗口
    self.root = root
    self.root.title('K-Anonymity System')
    self.root.geometry('500x500')

    # 初始化变量
    self.file_path = ''  # 文件路径
    self.df = None  # 原始数据集
    self.sensitive_attributes = []  # 敏感属性
    self.k = 0  # k值
    self.anonymized_df = None  # 匿名数据集

    # 创建控件
    self.file_label = Label(self.root, text='未查找到文件.')
    self.file_label.pack()

    self.select_file_button = Button(self.root, text='插入文件', command=self.select_file)
    self.select_file_button.pack()

    self.preprocess_button = Button(self.root, text='运行程序', command=self.preprocess_data, state=DISABLED)
    self.preprocess_button.pack()

    self.sensitivity_label = Label(self.root, text='输入敏感数据 (逗号分割):', state=DISABLED)
    self.sensitivity_label.pack()

    self.sensitivity_entry = Entry(self.root, state=DISABLED)
    self.sensitivity_entry.pack()

    self.k_label = Label(self.root, text='输入k值:', state=DISABLED)
    self.k_label.pack()

    self.k_entry = Entry(self.root, state=DISABLED)
    self.k_entry.pack()

    self.anonymize_button = Button(self.root, text='匿名数据集', command=self.anonymize_data, state=DISABLED)
    self.anonymize_button.pack()

    self.save_button = Button(self.root, text='保存匿名数据集', command=self.save_anonymized_data, state=DISABLED)
    self.save_button.pack()

    self.result_text = Text(self.root, state=DISABLED, height=20)
    self.result_text.pack()

# 选择文件函数
def select_file(self):
    self.file_path = filedialog.askopenfilename(filetypes=[('CSV Files', '*.csv')])
    self.file_label.config(text=self.file_path)
    self.preprocess_button.config(state=NORMAL)

# 预处理数据函数
def preprocess_data(self):
    # 读取数据集
    self.df = pd.read_csv(self.file_path)
    # 去重
    self.df.drop_duplicates(inplace=True)
    # 删除缺失值
    self.df.dropna(inplace=True)
    # 启用控件
    self.sensitivity_label.config(state=NORMAL)
    self.sensitivity_entry.config(state=NORMAL)
    self.k_label.config(state=NORMAL)
    self.k_entry.config(state=NORMAL)
    self.anonymize_button.config(state=NORMAL)

# 匿名化数据函数
def anonymize_data(self):
    # 获取敏感属性和k值
    self.sensitive_attributes = self.sensitivity_entry.get().split(",")
    self.k = int(self.k_entry.get())

    # 初始化匿名数据集
    self.anonymized_df = pd.DataFrame(columns=self.df.columns)

    # 对每个敏感属性组进行处理
    for group_name, group_data in self.df.groupby(self.sensitive_attributes):
        # 如果组大小小于k值,直接添加到匿名数据集中
        if len(group_data) < self.k:
            self.anonymized_df = pd.concat([self.anonymized_df, group_data])
        # 如果组大小大于等于k值,进行匿名化处理
        else:
            # 复制一份组的数据,用于匿名化处理
            group_data_copy = group_data.copy()
            # 删除敏感属性列
            group_data_copy.drop(self.sensitive_attributes, axis=1, inplace=True)
            # 删除重复行
            group_data_copy.drop_duplicates(inplace=True)
            # 对非敏感属性进行泛化处理
            group_data_copy = self.generalize_data(group_data_copy)
            # 将数据集划分为k个簇
            group_data_copy['cluster'] = pd.cut(group_data_copy.index, bins=self.k, labels=False)
            group_data_copy['cluster'] += min(group_data_copy['cluster'])
            # 将划分后的数据集添加到组的数据中,并重新添加敏感属性列
            group_data_copy = pd.concat([group_data[self.sensitive_attributes], group_data_copy], axis=1)
            # 将处理后的数据添加到匿名数据集中
            self.anonymized_df = pd.concat([self.anonymized_df, group_data_copy])

    # 计算匿名化的准确率
    accuracy = self.calculate_accuracy()
    # 在文本框中显示匿名数据集和准确率
    self.result_text.config(state=NORMAL)
    self.result_text.delete(1.0, END)
    self.result_text.insert(END, 'Anonymized Data:

') self.result_text.insert(END, self.anonymized_df.to_string(index=False)) self.result_text.insert(END, f'

Accuracy: {accuracy}') self.result_text.config(state=DISABLED) # 启用保存按钮 self.save_button.config(state=NORMAL)

# 保存匿名数据集函数
def save_anonymized_data(self):
    save_path = filedialog.asksaveasfilename(defaultextension='.csv', filetypes=[('CSV Files', '*.csv')])
    self.anonymized_df.to_csv(save_path, index=False)

# 泛化数据函数
def generalize_data(self, group_data):
    for column in group_data.columns:
        column_data = group_data[column]
        # 对于object类型的列,将最后一个字符替换为*
        if column_data.dtype == 'object':
            group_data[column] = column_data.str[:-1] + '*'
        # 对于数值类型的列,将其分成10个区间进行泛化
        else:
            min_value = column_data.min()
            max_value = column_data.max()
            step = (max_value - min_value) / 10
            group_data[column] = pd.cut(column_data, bins=[min_value + step*i for i in range(11)], labels=[f'{min_value + step*i:.2f}-{min_value + step*(i+1):.2f}' for i in range(10)])
    return group_data

# 计算匿名化准确率函数
def calculate_accuracy(self):
    # 计算原始数据集中每个敏感属性组的大小
    accuracy_df = self.df.groupby(self.sensitive_attributes).size().reset_index(name='actual_count')
    # 计算匿名数据集中每个敏感属性组的大小
    accuracy_df = pd.merge(accuracy_df, self.anonymized_df.groupby(self.sensitive_attributes).size().reset_index(name='anonymized_count'), on=self.sensitive_attributes, how='left')
    # 将缺失值填充为0
    accuracy_df.fillna(0, inplace=True)
    # 计算每个敏感属性组的匿名化准确率
    accuracy_df['accuracy'] = accuracy_df['anonymized_count'] / accuracy_df['actual_count']
    # 计算平均准确率
    accuracy = accuracy_df['accuracy'].mean()
    return accuracy

创建主窗口

root = Tk()

创建K-AnonymitySystem对象

k_anonymity_system = KAnonymitySystem(root)

进入主循环

root.mainloop()

K-Anonymity System: 数据匿名化和隐私保护

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

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