Source code for deep_time_series.transform
import copy
import numpy as np
import pandas as pd
def _merge_data_frames(
data_frames: pd.DataFrame | list[pd.DataFrame],
) -> pd.DataFrame:
if isinstance(data_frames, pd.DataFrame):
data_frames = [data_frames]
return pd.concat(data_frames).reset_index(drop=True)
[docs]class ColumnTransformer:
def __init__(
self,
transformer_dict=None,
transformer_tuples=None,
):
if transformer_dict is None and transformer_tuples is None:
raise Exception(
'One of transformer_dict or transformer_tuples has to be given.'
)
if (transformer_dict is not None) and (transformer_tuples is not None):
raise Exception(
'Both transformer_dict or transformer_tuples are set.'
)
if transformer_dict is not None:
self.transformer_dict = transformer_dict
if transformer_tuples is not None:
self.transformer_dict = {}
for transformer, names in transformer_tuples:
for name in names:
self.transformer_dict[name] = copy.deepcopy(transformer)
def _apply_to_single_feature(self, series, func):
values = series.values.reshape(-1, 1)
return_value = func(values)
if isinstance(return_value, np.ndarray):
return return_value.reshape(-1)
else:
return return_value
def _get_valid_names(self, names):
valid_name_set = set(self.transformer_dict.keys()) & set(names)
# Do not use list(valid_name_set) to preserve order of elements.
return [name for name in names if name in valid_name_set]
def fit(self, data_frames: pd.DataFrame | list[pd.DataFrame]) -> None:
df = _merge_data_frames(data_frames)
for name in self._get_valid_names(df.columns):
transformer = self.transformer_dict[name]
self._apply_to_single_feature(df[name], transformer.fit)
def transform(
self, data_frames: pd.DataFrame | list[pd.DataFrame]
) -> pd.DataFrame | list[pd.DataFrame]:
single_df = isinstance(data_frames, pd.DataFrame)
if single_df:
data_frames = [data_frames]
dfs = []
for df in data_frames:
data = {}
for name in self._get_valid_names(df.columns):
transformer = self.transformer_dict[name]
data[name] = self._apply_to_single_feature(
df[name], transformer.transform
)
dfs.append(pd.DataFrame(data=data, index=df.index))
if single_df:
return dfs[0]
else:
return dfs
def fit_transform(
self, data_frames: pd.DataFrame | list[pd.DataFrame]
) -> pd.DataFrame | list[pd.DataFrame]:
self.fit(data_frames)
return self.transform(data_frames)
def inverse_transform(
self, data_frames: pd.DataFrame | list[pd.DataFrame]
) -> pd.DataFrame | list[pd.DataFrame]:
single_df = isinstance(data_frames, pd.DataFrame)
if single_df:
data_frames = [data_frames]
dfs = []
for df in data_frames:
data = {}
for name in self._get_valid_names(df.columns):
transformer = self.transformer_dict[name]
data[name] = self._apply_to_single_feature(
df[name], transformer.inverse_transform
)
dfs.append(pd.DataFrame(data=data, index=df.index))
if single_df:
return dfs[0]
else:
return dfs