<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def fit(self, y, exogenous=None, **fit_kwargs):
 """Fit the pipeline of transformers and the ARIMA model Chain the time-series and exogenous arrays through a series of transformations, fitting each stage along the way, finally fitting an ARIMA or AutoARIMA model. Parameters y : array-like or iterable, shape=(n_samples,) The time-series to which to fit the ``ARIMA`` estimator. This may either be a Pandas ``Series`` object (statsmodels can internally use the dates in the index), or a numpy array. This should be a one-dimensional array of floats, and should not contain any ``np.nan`` or ``np.inf`` values. exogenous : array-like, shape=[n_obs, n_vars], optional (default=None) An optional 2-d array of exogenous variables. If provided, these variables are used as additional features in the regression operation. This should not include a constant or trend. Note that if an ``ARIMA`` is fit on exogenous features, it must be provided exogenous features for making predictions. **fit_kwargs : keyword args Extra keyword arguments used for each stage's ``fit`` stage. Similar to scikit-learn pipeline keyword args, the keys are compound, comprised of the stage name and the argument name separated by a "__". For instance, if fitting an ARIMA in stage "arima", your kwargs may resemble:: {"arima__maxiter": 10} """

        # Shallow copy
        steps = self.steps_ = self._validate_steps()

        yt = y
        Xt = exogenous
        named_kwargs = self._get_kwargs(**fit_kwargs)

        for step_idx, name, transformer in self._iter(with_final=False):
            cloned_transformer = clone(transformer)
            kwargs = named_kwargs[name]
            yt, Xt = cloned_transformer.fit_transform(yt, Xt, **kwargs)

            # Replace the transformer of the step with the fitted
            # transformer.
            steps[step_idx] = (name, cloned_transformer)

        # Now fit the final estimator
        kwargs = named_kwargs[steps[-1][0]]
        self._final_estimator.fit(yt, exogenous=Xt, **kwargs)
        return self