aboutsummaryrefslogtreecommitdiff
path: root/code/sunlab/common/scaler
diff options
context:
space:
mode:
authorChristian C <cc@localhost>2024-11-11 12:29:32 -0800
committerChristian C <cc@localhost>2024-11-11 12:29:32 -0800
commitb85ee9d64a536937912544c7bbd5b98b635b7e8d (patch)
treecef7bc17d7b29f40fc6b1867d0ce0a742d5583d0 /code/sunlab/common/scaler
Initial commit
Diffstat (limited to 'code/sunlab/common/scaler')
-rw-r--r--code/sunlab/common/scaler/__init__.py2
-rw-r--r--code/sunlab/common/scaler/adversarial_scaler.py44
-rw-r--r--code/sunlab/common/scaler/max_abs_scaler.py48
-rw-r--r--code/sunlab/common/scaler/quantile_scaler.py52
4 files changed, 146 insertions, 0 deletions
diff --git a/code/sunlab/common/scaler/__init__.py b/code/sunlab/common/scaler/__init__.py
new file mode 100644
index 0000000..2a2281a
--- /dev/null
+++ b/code/sunlab/common/scaler/__init__.py
@@ -0,0 +1,2 @@
+from .max_abs_scaler import *
+from .quantile_scaler import *
diff --git a/code/sunlab/common/scaler/adversarial_scaler.py b/code/sunlab/common/scaler/adversarial_scaler.py
new file mode 100644
index 0000000..7f61725
--- /dev/null
+++ b/code/sunlab/common/scaler/adversarial_scaler.py
@@ -0,0 +1,44 @@
+class AdversarialScaler:
+ """# Scaler Class to use in Adversarial Autoencoder
+
+ For any scaler to be implemented, make sure to ensure each of the methods
+ are implemented:
+ - __init__ (optional)
+ - init
+ - load
+ - save
+ - __call__"""
+
+ def __init__(self, base_directory):
+ """# Scaler initialization
+
+ - Initialize the base directory of the model where it will live"""
+ self.base_directory = base_directory
+
+ def init(self, data):
+ """# Scaler initialization
+
+ Initialize the scaler transformation with the data
+ Should always return self in subclasses"""
+ raise NotImplementedError("Scaler initialization has not been implemented yet")
+
+ def load(self):
+ """# Scaler loading
+
+ Load the data scaler model from a file
+ Should always return self in subclasses"""
+ raise NotImplementedError("Scaler loading has not been implemented yet")
+
+ def save(self):
+ """# Scaler saving
+
+ Save the data scaler model"""
+ raise NotImplementedError("Scaler saving has not been implemented yet")
+
+ def transform(self, *args, **kwargs):
+ """# Scale the given data"""
+ return self.__call__(*args, **kwargs)
+
+ def __call__(self, *args, **kwargs):
+ """# Scale the given data"""
+ raise NotImplementedError("Scaler has not been implemented yet")
diff --git a/code/sunlab/common/scaler/max_abs_scaler.py b/code/sunlab/common/scaler/max_abs_scaler.py
new file mode 100644
index 0000000..56ea589
--- /dev/null
+++ b/code/sunlab/common/scaler/max_abs_scaler.py
@@ -0,0 +1,48 @@
+from .adversarial_scaler import AdversarialScaler
+
+
+class MaxAbsScaler(AdversarialScaler):
+ """# MaxAbsScaler
+
+ Scale the data based on the maximum-absolute value in each column"""
+
+ def __init__(self, base_directory):
+ """# MaxAbsScaler initialization
+
+ - Initialize the base directory of the model where it will live
+ - Initialize the scaler model"""
+ super().__init__(base_directory)
+ from sklearn.preprocessing import MaxAbsScaler as MAS
+
+ self.scaler_base = MAS()
+ self.scaler = None
+
+ def init(self, data):
+ """# Scaler initialization
+
+ Initialize the scaler transformation with the data"""
+ self.scaler = self.scaler_base.fit(data)
+ return self
+
+ def load(self):
+ """# Scaler loading
+
+ Load the data scaler model from a file"""
+ from pickle import load
+
+ with open(f"{self.base_directory}/portable/maxabs_scaler.pkl", "rb") as fhandle:
+ self.scaler = load(fhandle)
+ return self
+
+ def save(self):
+ """# Scaler saving
+
+ Save the data scaler model"""
+ from pickle import dump
+
+ with open(f"{self.base_directory}/portable/maxabs_scaler.pkl", "wb") as fhandle:
+ dump(self.scaler, fhandle)
+
+ def __call__(self, *args, **kwargs):
+ """# Scale the given data"""
+ return self.scaler.transform(*args, **kwargs)
diff --git a/code/sunlab/common/scaler/quantile_scaler.py b/code/sunlab/common/scaler/quantile_scaler.py
new file mode 100644
index 0000000..a0f53fd
--- /dev/null
+++ b/code/sunlab/common/scaler/quantile_scaler.py
@@ -0,0 +1,52 @@
+from .adversarial_scaler import AdversarialScaler
+
+
+class QuantileScaler(AdversarialScaler):
+ """# QuantileScaler
+
+ Scale the data based on the quantile distributions of each column"""
+
+ def __init__(self, base_directory):
+ """# QuantileScaler initialization
+
+ - Initialize the base directory of the model where it will live
+ - Initialize the scaler model"""
+ super().__init__(base_directory)
+ from sklearn.preprocessing import QuantileTransformer as QS
+
+ self.scaler_base = QS()
+ self.scaler = None
+
+ def init(self, data):
+ """# Scaler initialization
+
+ Initialize the scaler transformation with the data"""
+ self.scaler = self.scaler_base.fit(data)
+ return self
+
+ def load(self):
+ """# Scaler loading
+
+ Load the data scaler model from a file"""
+ from pickle import load
+
+ with open(
+ f"{self.base_directory}/portable/quantile_scaler.pkl", "rb"
+ ) as fhandle:
+ self.scaler = load(fhandle)
+ return self
+
+ def save(self):
+ """# Scaler saving
+
+ Save the data scaler model"""
+ from pickle import dump
+
+ with open(
+ f"{self.base_directory}/portable/quantile_scaler.pkl", "wb"
+ ) as fhandle:
+ dump(self.scaler, fhandle)
+
+ def __call__(self, *args, **kwargs):
+ """# Scale the given data"""
+ return self.scaler.transform(*args, **kwargs)