from typing import Union
import pandas as pd
from ._base import (
    _NonTrainableMultivariateModel,
    _NonTrainableUnivariateModel,
    _TrainableMultivariateModel,
    _TrainableUnivariateModel,
)
class _NonTrainableUnivariateTransformer(_NonTrainableUnivariateModel):
    def predict(
        self, ts: Union[pd.Series, pd.DataFrame]
    ) -> Union[pd.Series, pd.DataFrame]:
        """Transform time series.
        Parameters
        ----------
        ts: pandas.Series or pandas.DataFrame
            Time series to be transformed. If a DataFrame with k columns, it is
            treated as k independent univariate time series and the transformer
            will be applied to each univariate series independently.
        Returns
        -------
        pandas.Series or pandas.DataFrame
            Transformed time series.
        """
        return self._predict(ts)
    transform = predict
class _TrainableUnivariateTransformer(_TrainableUnivariateModel):
    def fit(self, ts: Union[pd.Series, pd.DataFrame]) -> None:
        """Train the transformer with given time series.
        Parameters
        ----------
        ts: pandas.Series or pandas.DataFrame
            Time series to be used to train the transformer.
            If a DataFrame with k columns, k univariate transformers will be
            trained independently.
        """
        self._fit(ts)
    def predict(
        self, ts: Union[pd.Series, pd.DataFrame]
    ) -> Union[pd.Series, pd.DataFrame]:
        """Transform time series.
        Parameters
        ----------
        ts: pandas.Series or pandas.DataFrame
            Time series to be transformed. If a DataFrame with k columns, it is
            treated as k independent univariate time series.
            - If the transformer was trained with a Series, the transformer
              will be applied to each univariate series independently;
            - If the transformer was trained with a DataFrame, i.e. the
              transformer is essentially k transformers, those transformers
              will be applied to each univariate series respectively.
        Returns
        -------
        pandas.Series or pandas.DataFrame
            Transformed time series.
        """
        return self._predict(ts)
    def fit_predict(
        self, ts: Union[pd.Series, pd.DataFrame]
    ) -> Union[pd.Series, pd.DataFrame]:
        """Train the transformer, and tranform the time series used for
        training.
        Parameters
        ----------
        ts: pandas.Series or pandas.DataFrame
            Time series to be used for training and be transformed.
            If a DataFrame with k columns, it is treated as k independent
            univariate time series, and k univariate transformers will be
            trained and applied to each series independently.
        Returns
        -------
        pandas.Series or pandas.DataFrame
            Transformed time series.
        """
        self.fit(ts)
        return self.predict(ts)
    transform = predict
    fit_transform = fit_predict
class _NonTrainableMultivariateTransformer(_NonTrainableMultivariateModel):
    def predict(self, df: pd.DataFrame) -> Union[pd.Series, pd.DataFrame]:
        """Transform time series.
        Parameters
        ----------
        df: pandas.DataFrame
            Time series to be transformed.
        Returns
        -------
        pandas.Series or pandas.DataFrame
            Transformed time series.
        """
        return self._predict(df)
    transform = predict
class _TrainableMultivariateTransformer(_TrainableMultivariateModel):
    def fit(self, df: pd.DataFrame) -> None:
        """Train the transformer with given time series.
        Parameters
        ----------
        df: pandas.DataFrame
            Time series to be used to train the transformer.
        """
        self._fit(df)
    def predict(self, df: pd.DataFrame) -> Union[pd.Series, pd.DataFrame]:
        """Transform time series.
        Parameters
        ----------
        df: pandas.DataFrame
            Time series to be transformed.
        Returns
        -------
        pandas.Series or pandas.DataFrame
            Transformed time series.
        """
        return self._predict(df)
    def fit_predict(self, df: pd.DataFrame) -> Union[pd.Series, pd.DataFrame]:
        """Train the transformer, and tranform the time series used for
        training.
        Parameters
        ----------
        df: pandas.DataFrame
            Time series to be used for training and be transformed.
        Returns
        -------
        pandas.Series or pandas.DataFrame
            Transformed time series.
        """
        self.fit(df)
        return self.predict(df)
    transform = predict
    fit_transform = fit_predict