class_docstr: PerturbedDataGenerator is a wrapping class to prepare various kinds of
  perturbers and generate specified number of perturbations using these
  perturbers.
code: def fit_transform(
      self,
      x: Union["tsFrame", np.ndarray],
      x_exog: Union["tsFrame", np.ndarray] = None,
      n: int = 10,
  ):
      counter = Counter(np.random.choice(len(self._perturbers), n))
      data = []
      data_exog = []
      for idx in counter:
          ni = counter.get(idx)
          data += self._perturbers[idx].fit_transform(
              x, n_perturbations=ni, block_selector=self._block_selector
          )
          if x_exog is not None:
              data_exog += self._perturbers[idx].fit_transform(
                  x_exog, n_perturbations=ni
              )
      return data, data_exog
  
file_path: AIX360/aix360/algorithms/tsutils/tsperturbers/perturbed_data_generator.py
imports: import numpy
  from collections import Counter
  from typing import List, Union
  from aix360.algorithms.tsutils.tsframe import tsFrame
  from aix360.algorithms.tsutils.tsperturbers import BlockBootstrapPerturber, FrequencyPerturber, MovingAveragePerturber, TSShiftPerturber, TSImputePerturber
  from aix360.algorithms.tsutils.tsperturbers.tsperturber import BlockSelector, TSPerturber
label_desc: Use image node_id 2 for calling the PerturbedDataGenerator obj's underlying member method code with example usage: obj.fit_transform(x, x_exog, n) and returns: data,  data_exog