Source code for af.model.reports.TransformationMetrics

from af.controller.data.SqliteController import SqliteController
from af.utils import (
    get_anonymization_db_location,
    ANONYMIZED_DATA_TABLE,
    ADDITIONAL_INFO_TABLE,
    PRIVACY_TYPE_QI,
)


[docs]class TransformationMetrics(object): """Class that queries an anonymized table and can generate some metrics based on the data """ def __init__(self, data_config): self.data_config = data_config self.qi_attributes = data_config.get_privacy_type_attributes_list(PRIVACY_TYPE_QI) self.original_db = SqliteController(self.data_config.location) self.original_db_table = self.data_config.table self.anonymized_db = SqliteController(get_anonymization_db_location()) self.anonymized_db_table = ANONYMIZED_DATA_TABLE self.additional_information = self.get_additional_information()
[docs] def get_additional_information(self): """Returns the additional information the anonymization algorithm left behind :rtype: Dictionary containing additional information to be displayed """ additional_information = {} query = '''SELECT * FROM {0} ORDER BY id;'''.format(ADDITIONAL_INFO_TABLE) for row in self.anonymized_db.execute_query(query): info_id, key, value = row additional_information[info_id] = (key, value) return additional_information
[docs] def qi_eq_classes_differences(self): """Returns the differences between the amount of equivalence classes existent before and after the anonymization process for each quasi-identifier attribute. :rtype: Dictionary that stores the equivalence classes values """ eq_classes = {} dbs = (self.original_db, self.anonymized_db) tables = (self.original_db_table, self.anonymized_db_table) for qi_att in self.qi_attributes: amounts = [] for db, table in zip(dbs, tables): amounts.extend(list(db.get_count_of_distinct_qi_values(table, qi_att.name))) eq_classes[qi_att.name] = tuple(amounts) return eq_classes
[docs] def removed_outlier_rows(self): """Returns the amount of rows that were deleted during the anonymization process :rtype: Number of outliers rows removed """ dbs = (self.original_db, self.anonymized_db) tables = (self.original_db_table, self.anonymized_db_table) rows_amount = [] for db, table in zip(dbs, tables): rows_amount.append(db.amount_of_rows(table)) return rows_amount[0] - rows_amount[1]
[docs] def number_of_qi_eq_classes_generated(self): """Returns the amount of equivalence classes created for each quasi-identifier attribute during the anonymization process :rtype: List of frequencies """ qi_list = [att.name for att in self.qi_attributes] return self.anonymized_db.get_frequency_of_eq_classes(self.anonymized_db_table, qi_list)
[docs] def qi_eq_classes_generated(self): """Returns all the equivalence classes created for each quasi-identifier attribute during the anonymization process :rtype: List of equivalence classes """ qi_list = [att.name for att in self.qi_attributes] for value in self.anonymized_db.get_frequency_of_qi_attributes(self.anonymized_db_table, qi_list): yield value