docs: def quantile_turnover(quantile_factor, quantile, period=1):
      """
      Computes the proportion of names in a factor quantile that were
      not in that quantile in the previous period.
  
      Parameters
      ----------
      quantile_factor : pd.Series
          DataFrame with date, asset and factor quantile.
      quantile : int
          Quantile on which to perform turnover analysis.
      period: string or int, optional
          Period over which to calculate the turnover. If it is a string it must
          follow pandas.Timedelta constructor format (e.g. '1 days', '1D', '30m',
          '3h', '1D1h', etc).
      Returns
      -------
      quant_turnover : pd.Series
          Period by period turnover for that quantile.
      """
  
      quant_names = quantile_factor[quantile_factor == quantile]
      quant_name_sets = quant_names.groupby(level=['date']).apply(
          lambda x: set(x.index.get_level_values('asset')))
  
      if isinstance(period, int):
          name_shifted = quant_name_sets.shift(period)
      else:
          shifted_idx = utils.add_custom_calendar_timedelta(
                  quant_name_sets.index, -pd.Timedelta(period),
                  quantile_factor.index.levels[0].freq)
          name_shifted = quant_name_sets.reindex(shifted_idx)
          name_shifted.index = quant_name_sets.index
  
      new_names = (quant_name_sets - name_shifted).dropna()
      quant_turnover = new_names.apply(
          lambda x: len(x)) / quant_name_sets.apply(lambda x: len(x))
      quant_turnover.name = quantile
      return quant_turnover