code: def filterSeasonals(self):
      logger = tsutil.get_pyaf_logger()
      logger.debug("CYCLE_TRAINING_FILTER_SEASONALS_START")
      for trend in self.mTrendList:
          lPerfs = {}
          lTrend_residue_name = trend.mOutName + "_residue"
          lCycleList = []
          lSeasonals = []
          for cycle in self.mCycleList[trend]:
              if isinstance(cycle, cSeasonalPeriodic):
                  cycle.computePerf()
                  lPerfs[
                      cycle.mOutName
                  ] = cycle.mCycleForecastPerf.getCriterionValue(
                      self.mOptions.mCycle_Criterion
                  )
                  lSeasonals = lSeasonals + [cycle]
              else:
                  lCycleList = lCycleList + [cycle]
  
          if len(lSeasonals) == 0:
              return
          lBestCriterion = None
          lBestSeasonal = None
          for k, cycle in enumerate(lSeasonals):
              lCriterionValue = lPerfs[cycle.mOutName]
              if (lBestCriterion is None) or (
                  lCriterionValue < (1.05 * lBestCriterion)
              ):
                  lBestSeasonal = cycle
                  lBestCriterion = lCriterionValue
          lCycleList = lCycleList + [lBestSeasonal]
          self.mCycleList[trend] = lCycleList
          logger.debug(
              "CYCLE_TRAINING_FILTER_SEASONALS "
              + trend.mOutName
              + " "
              + lBestSeasonal.mOutName
          )
      logger.debug("CYCLE_TRAINING_FILTER_SEASONALS_END")
      pass
  
imports: import pandas
  import numpy
  from .None import Time
  from .None import Perf
  from .None import Plots
  from .None import Utils
  import time
label_desc: Use image node_id 7 for calling the cCycleEstimator obj's underlying member method code with example usage: obj.filterSeasonals() without return types