Module dalex.arena.params
Expand source code Browse git
from abc import ABC, abstractmethod
import numpy as np
import math
from pandas.api.types import is_numeric_dtype, is_bool_dtype, is_object_dtype
class Param(ABC):
@abstractmethod
def get_type(self):
pass
@abstractmethod
def get_label(self):
pass
@abstractmethod
def get_attributes(self):
pass
@staticmethod
@abstractmethod
def list_attributes(arena):
pass
@staticmethod
def get_param_class(param_type):
return {'model': ModelParam, 'variable': VariableParam, 'observation': ObservationParam, 'dataset': DatasetParam}.get(param_type)
class ModelParam(Param):
def __init__(self, explainer):
self.explainer = explainer
indexes = np.apply_along_axis(lambda x, y: not (x == y).all(), 0, explainer.data, explainer.y)
self.variables = explainer.data.columns[indexes]
def get_label(self):
return self.explainer.label
def get_type(self):
return 'model'
def get_attributes(self):
return {}
@staticmethod
def list_attributes(arena):
return []
class DatasetParam(Param):
def __init__(self, dataset, label, target):
self.dataset = dataset
self.label = label
self.target = target
self.variables = dataset.columns.astype(str).drop(target)
def get_label(self):
return self.label
def get_type(self):
return 'dataset'
def get_attributes(self):
return {}
@staticmethod
def list_attributes(arena):
return []
class VariableParam(Param):
def __init__(self, variable):
self.variable = variable
self.clear_attributes()
def get_label(self):
return self.variable
def get_type(self):
return 'variable'
def clear_attributes(self):
self.type = None
self.min = None
self.max = None
self.levels = None
def update_attributes(self, column):
if is_bool_dtype(column):
col_type = 'logical'
elif is_numeric_dtype(column):
col_type = 'numeric'
elif is_object_dtype(column):
col_type = 'categorical'
else:
raise Exception('Column type is not supported')
if self.type is None:
self.type = col_type
elif self.type != col_type:
raise Exception('The same name was used for columns with different type')
if self.type == 'numeric':
self.min = min(column.min(), math.inf if self.min is None else self.min)
self.max = max(column.max(), -math.inf if self.max is None else self.max)
if len(column.unique()) < 20:
self.levels = np.unique((self.levels or []) + column.unique().tolist()).tolist()
if not self.levels is None and len(self.levels) >= 20:
self.levels = None
else:
self.levels = np.unique((self.levels or []) + column.unique().tolist()).tolist()
def get_attributes(self):
return {
'type': self.type,
'min': self.min,
'max': self.max,
'levels': self.levels
}
@staticmethod
def list_attributes(arena):
return ['type', 'min', 'max', 'levels']
class ObservationParam(Param):
def __init__(self, dataset, index):
self.dataset = dataset
self.index = index
def get_label(self):
return self.index
def get_type(self):
return 'observation'
def get_row(self):
return self.dataset.loc[self.index]
def get_row_for_model(self, model_param):
try:
return self.dataset.loc[[self.index]][model_param.explainer.data.columns]
except:
return None
def get_attributes(self):
return dict(self.get_row())
@staticmethod
def list_attributes(arena):
datasets = []
for obs in arena.get_params('observation'):
if len([1 for dataset in datasets if dataset is obs.dataset]) == 0:
datasets.append(obs.dataset)
columns = list(map(lambda x: x.columns.tolist(), datasets))
# flatten
columns = [col for columns_list in columns for col in columns_list]
columns = np.unique(columns).tolist()
return columns
Classes
class DatasetParam (dataset, label, target)
-
Helper class that provides a standard way to create an ABC using inheritance.
Expand source code Browse git
class DatasetParam(Param): def __init__(self, dataset, label, target): self.dataset = dataset self.label = label self.target = target self.variables = dataset.columns.astype(str).drop(target) def get_label(self): return self.label def get_type(self): return 'dataset' def get_attributes(self): return {} @staticmethod def list_attributes(arena): return []
Ancestors
- Param
- abc.ABC
Static methods
def list_attributes(arena)
-
Expand source code Browse git
@staticmethod def list_attributes(arena): return []
Methods
def get_attributes(self)
-
Expand source code Browse git
def get_attributes(self): return {}
def get_label(self)
-
Expand source code Browse git
def get_label(self): return self.label
def get_type(self)
-
Expand source code Browse git
def get_type(self): return 'dataset'
class ModelParam (explainer)
-
Helper class that provides a standard way to create an ABC using inheritance.
Expand source code Browse git
class ModelParam(Param): def __init__(self, explainer): self.explainer = explainer indexes = np.apply_along_axis(lambda x, y: not (x == y).all(), 0, explainer.data, explainer.y) self.variables = explainer.data.columns[indexes] def get_label(self): return self.explainer.label def get_type(self): return 'model' def get_attributes(self): return {} @staticmethod def list_attributes(arena): return []
Ancestors
- Param
- abc.ABC
Static methods
def list_attributes(arena)
-
Expand source code Browse git
@staticmethod def list_attributes(arena): return []
Methods
def get_attributes(self)
-
Expand source code Browse git
def get_attributes(self): return {}
def get_label(self)
-
Expand source code Browse git
def get_label(self): return self.explainer.label
def get_type(self)
-
Expand source code Browse git
def get_type(self): return 'model'
class ObservationParam (dataset, index)
-
Helper class that provides a standard way to create an ABC using inheritance.
Expand source code Browse git
class ObservationParam(Param): def __init__(self, dataset, index): self.dataset = dataset self.index = index def get_label(self): return self.index def get_type(self): return 'observation' def get_row(self): return self.dataset.loc[self.index] def get_row_for_model(self, model_param): try: return self.dataset.loc[[self.index]][model_param.explainer.data.columns] except: return None def get_attributes(self): return dict(self.get_row()) @staticmethod def list_attributes(arena): datasets = [] for obs in arena.get_params('observation'): if len([1 for dataset in datasets if dataset is obs.dataset]) == 0: datasets.append(obs.dataset) columns = list(map(lambda x: x.columns.tolist(), datasets)) # flatten columns = [col for columns_list in columns for col in columns_list] columns = np.unique(columns).tolist() return columns
Ancestors
- Param
- abc.ABC
Static methods
def list_attributes(arena)
-
Expand source code Browse git
@staticmethod def list_attributes(arena): datasets = [] for obs in arena.get_params('observation'): if len([1 for dataset in datasets if dataset is obs.dataset]) == 0: datasets.append(obs.dataset) columns = list(map(lambda x: x.columns.tolist(), datasets)) # flatten columns = [col for columns_list in columns for col in columns_list] columns = np.unique(columns).tolist() return columns
Methods
def get_attributes(self)
-
Expand source code Browse git
def get_attributes(self): return dict(self.get_row())
def get_label(self)
-
Expand source code Browse git
def get_label(self): return self.index
def get_row(self)
-
Expand source code Browse git
def get_row(self): return self.dataset.loc[self.index]
def get_row_for_model(self, model_param)
-
Expand source code Browse git
def get_row_for_model(self, model_param): try: return self.dataset.loc[[self.index]][model_param.explainer.data.columns] except: return None
def get_type(self)
-
Expand source code Browse git
def get_type(self): return 'observation'
class Param
-
Helper class that provides a standard way to create an ABC using inheritance.
Expand source code Browse git
class Param(ABC): @abstractmethod def get_type(self): pass @abstractmethod def get_label(self): pass @abstractmethod def get_attributes(self): pass @staticmethod @abstractmethod def list_attributes(arena): pass @staticmethod def get_param_class(param_type): return {'model': ModelParam, 'variable': VariableParam, 'observation': ObservationParam, 'dataset': DatasetParam}.get(param_type)
Ancestors
- abc.ABC
Subclasses
Static methods
def get_param_class(param_type)
-
Expand source code Browse git
@staticmethod def get_param_class(param_type): return {'model': ModelParam, 'variable': VariableParam, 'observation': ObservationParam, 'dataset': DatasetParam}.get(param_type)
def list_attributes(arena)
-
Expand source code Browse git
@staticmethod @abstractmethod def list_attributes(arena): pass
Methods
def get_attributes(self)
-
Expand source code Browse git
@abstractmethod def get_attributes(self): pass
def get_label(self)
-
Expand source code Browse git
@abstractmethod def get_label(self): pass
def get_type(self)
-
Expand source code Browse git
@abstractmethod def get_type(self): pass
class VariableParam (variable)
-
Helper class that provides a standard way to create an ABC using inheritance.
Expand source code Browse git
class VariableParam(Param): def __init__(self, variable): self.variable = variable self.clear_attributes() def get_label(self): return self.variable def get_type(self): return 'variable' def clear_attributes(self): self.type = None self.min = None self.max = None self.levels = None def update_attributes(self, column): if is_bool_dtype(column): col_type = 'logical' elif is_numeric_dtype(column): col_type = 'numeric' elif is_object_dtype(column): col_type = 'categorical' else: raise Exception('Column type is not supported') if self.type is None: self.type = col_type elif self.type != col_type: raise Exception('The same name was used for columns with different type') if self.type == 'numeric': self.min = min(column.min(), math.inf if self.min is None else self.min) self.max = max(column.max(), -math.inf if self.max is None else self.max) if len(column.unique()) < 20: self.levels = np.unique((self.levels or []) + column.unique().tolist()).tolist() if not self.levels is None and len(self.levels) >= 20: self.levels = None else: self.levels = np.unique((self.levels or []) + column.unique().tolist()).tolist() def get_attributes(self): return { 'type': self.type, 'min': self.min, 'max': self.max, 'levels': self.levels } @staticmethod def list_attributes(arena): return ['type', 'min', 'max', 'levels']
Ancestors
- Param
- abc.ABC
Static methods
def list_attributes(arena)
-
Expand source code Browse git
@staticmethod def list_attributes(arena): return ['type', 'min', 'max', 'levels']
Methods
def clear_attributes(self)
-
Expand source code Browse git
def clear_attributes(self): self.type = None self.min = None self.max = None self.levels = None
def get_attributes(self)
-
Expand source code Browse git
def get_attributes(self): return { 'type': self.type, 'min': self.min, 'max': self.max, 'levels': self.levels }
def get_label(self)
-
Expand source code Browse git
def get_label(self): return self.variable
def get_type(self)
-
Expand source code Browse git
def get_type(self): return 'variable'
def update_attributes(self, column)
-
Expand source code Browse git
def update_attributes(self, column): if is_bool_dtype(column): col_type = 'logical' elif is_numeric_dtype(column): col_type = 'numeric' elif is_object_dtype(column): col_type = 'categorical' else: raise Exception('Column type is not supported') if self.type is None: self.type = col_type elif self.type != col_type: raise Exception('The same name was used for columns with different type') if self.type == 'numeric': self.min = min(column.min(), math.inf if self.min is None else self.min) self.max = max(column.max(), -math.inf if self.max is None else self.max) if len(column.unique()) < 20: self.levels = np.unique((self.levels or []) + column.unique().tolist()).tolist() if not self.levels is None and len(self.levels) >= 20: self.levels = None else: self.levels = np.unique((self.levels or []) + column.unique().tolist()).tolist()