class_docstr: Symbolic Fourier Approximation (SFA) Transformer.
  
  Overview: for each series:
      run a sliding window across the series
      for each window
          shorten the series with DFT
          discretise the shortened series into bins set by MFC
          form a word from these discrete values
  by default SFA produces a single word per series (window_size=0)
  if a window is used, it forms a histogram of counts of words.
  
  Parameters
  ----------
  word_length:         int, default = 8
      length of word to shorten window to (using PAA)
  
  alphabet_size:       int, default = 4
      number of values to discretise each value to
  
  window_size:         int, default = 12
      size of window for sliding. Input series
      length for whole series transform
  
  norm:                boolean, default = False
      mean normalise words by dropping first fourier coefficient
  
  binning_method:      {"equi-depth", "equi-width", "information-gain", "kmeans"},
                          default="equi-depth"
      the binning method used to derive the breakpoints.
  
  anova:               boolean, default = False
      If True, the Fourier coefficient selection is done via a one-way
      ANOVA test. If False, the first Fourier coefficients are selected.
      Only applicable if labels are given
  
  bigrams:             boolean, default = False
      whether to create bigrams of SFA words
  
  skip_grams:          boolean, default = False
      whether to create skip-grams of SFA words
  
  remove_repeat_words: boolean, default = False
      whether to use numerosity reduction (default False)
  
  levels:              int, default = 1
      Number of spatial pyramid levels
  
  save_words:          boolean, default = False
      whether to save the words generated for each series (default False)
  
  return_pandas_data_series:          boolean, default = False
      set to true to return Pandas Series as a result of transform.
      setting to true reduces speed significantly but is required for
      automatic test.
  
  n_jobs:              int, optional, default = 1
      The number of jobs to run in parallel for both `transform`.
      ``-1`` means using all processors.
  
  Attributes
  ----------
  words: []
  breakpoints: = []
  num_insts = 0
  num_atts = 0
  
  References
  ----------
  .. [1] Schäfer, Patrick, and Mikael Högqvist. "SFA: a symbolic fourier approximation
  and  index for similarity search in high dimensional datasets." Proceedings of the
  15th international conference on extending database technology. 2012.
docstr: Perform a discrete fourier transform using the fast fourier transform.
  
  if self.norm is True, then the first term of the DFT is ignored
  
  Input
  -------
  X : The training input samples.  array-like or sparse matrix of
  shape = [n_samps, num_atts]
  
  Returns
  -------
  1D array of fourier term, real_0,imag_0, real_1, imag_1 etc, length
  num_atts or
  num_atts-2 if if self.norm is True
docstr_tok: ["Perform","a","discrete","fourier","transform","using","the","fast","fourier","transform",".","if","self.norm","is","True",",","then","the","first","term","of","the","DFT","is","ignored","Input","--","--","--","-","X",":","The","training","input","samples",".","array-like","or","sparse","matrix","of","shape","=","[","n_samps",",","num_atts","]","Returns","--","--","--","-","1D","array","of","fourier","term",",","real_0",",","imag_0",",","real_1",",","imag_1","etc",",","length","num_atts","or","num_atts-2","if","if","self.norm","is","True"]
code: def _fast_fourier_transform(self, series):
      """Perform a discrete fourier transform using the fast fourier transform.
  
      if self.norm is True, then the first term of the DFT is ignored
  
      Input
      -------
      X : The training input samples.  array-like or sparse matrix of
      shape = [n_samps, num_atts]
  
      Returns
      -------
      1D array of fourier term, real_0,imag_0, real_1, imag_1 etc, length
      num_atts or
      num_atts-2 if if self.norm is True
      """
      # first two are real and imaginary parts
      start = 2 if self.norm else 0
  
      s = np.std(series)
      std = s if s > 1e-8 else 1
  
      X_fft = np.fft.rfft(series)
      reals = np.real(X_fft)
      imags = np.imag(X_fft)
  
      length = start + self.dft_length
      dft = np.empty((length,), dtype=reals.dtype)
      dft[0::2] = reals[: np.uint32(length / 2)]
      dft[1::2] = imags[: np.uint32(length / 2)]
      if self.lower_bounding:
          dft[1::2] = dft[1::2] * -1  # lower bounding
      dft *= self.inverse_sqrt_win_size / std
      return dft[start:]
  
imports: import math
  import sys
  import warnings
  import numpy
  import pandas
  from joblib import Parallel, delayed
  from sklearn.feature_selection import f_classif
  from sklearn.preprocessing import KBinsDiscretizer
  from sklearn.tree import DecisionTreeClassifier
  from sktime.transformations.base import BaseTransformer
  from sktime.utils.validation.panel import check_X
label_desc: Use image node_id 10 for calling the SFA obj's underlying member method code with example usage: obj._fast_fourier_transform(series) and returns: dft