import numpy as np
import pandas as pd
from typing import Tuple
from doenut.data.modifiers.data_set_modifier import DataSetModifier
[docs]
class OrthoScaler(DataSetModifier):
"""Takes a dataset and scales it per column using an ortho scaling to
the range -1 ... 1
Parameters
----------
inputs : pd.DataFrame
The dataset's inputs
responses : pd.DataFrame
The dataset's responses
scale_responses : bool, default False
Whether to also scale the responses.
Returns
-------
"""
[docs]
@classmethod
def _compute_scaling(cls, data: pd.DataFrame) -> Tuple[float, float]:
data_max = np.max(data, axis=0)
data_min = np.min(data, axis=0)
mj = (data_min + data_max) / 2
rj = (data_max - data_min) / 2
return mj, rj
def __init__(
self,
inputs: pd.DataFrame,
responses: pd.DataFrame,
scale_responses: bool = False,
) -> None:
super().__init__(inputs, responses)
self.inputs_mj, self.inputs_rj = self._compute_scaling(inputs)
self.responses_mj, self.responses_rj = self._compute_scaling(responses)
self.scale_responses = scale_responses
[docs]
def apply_to_responses(self, data: pd.DataFrame) -> pd.DataFrame:
if not self.scale_responses:
return data
return (data - self.responses_mj) / self.responses_rj