docs: def plot_mean_quantile_returns_spread_time_series(mean_returns_spread,
                                                    std_err=None,
                                                    bandwidth=1,
                                                    ax=None):
      """
      Plots mean period wise returns for factor quantiles.
  
      Parameters
      ----------
      mean_returns_spread : pd.Series
          Series with difference between quantile mean returns by period.
      std_err : pd.Series
          Series with standard error of difference between quantile
          mean returns each period.
      bandwidth : float
          Width of displayed error bands in standard deviations.
      ax : matplotlib.Axes, optional
          Axes upon which to plot.
  
      Returns
      -------
      ax : matplotlib.Axes
          The axes that were plotted on.
      """
  
      if isinstance(mean_returns_spread, pd.DataFrame):
          if ax is None:
              ax = [None for a in mean_returns_spread.columns]
  
          ymin, ymax = (None, None)
          for (i, a), (name, fr_column) in zip(enumerate(ax),
                                               mean_returns_spread.iteritems()):
              stdn = None if std_err is None else std_err[name]
              a = plot_mean_quantile_returns_spread_time_series(fr_column,
                                                                std_err=stdn,
                                                                ax=a)
              ax[i] = a
              curr_ymin, curr_ymax = a.get_ylim()
              ymin = curr_ymin if ymin is None else min(ymin, curr_ymin)
              ymax = curr_ymax if ymax is None else max(ymax, curr_ymax)
  
          for a in ax:
              a.set_ylim([ymin, ymax])
  
          return ax
  
      if mean_returns_spread.isnull().all():
          return ax
  
      periods = mean_returns_spread.name
      title = ('Top Minus Bottom Quantile Mean Return ({} Period Forward Return)'
               .format(periods if periods is not None else ""))
  
      if ax is None:
          f, ax = plt.subplots(figsize=(18, 6))
  
      mean_returns_spread_bps = mean_returns_spread * DECIMAL_TO_BPS
  
      mean_returns_spread_bps.plot(alpha=0.4, ax=ax, lw=0.7, color='forestgreen')
      mean_returns_spread_bps.rolling(window=22).mean().plot(
          color='orangered',
          alpha=0.7,
          ax=ax
      )
      ax.legend(['mean returns spread', '1 month moving avg'], loc='upper right')
  
      if std_err is not None:
          std_err_bps = std_err * DECIMAL_TO_BPS
          upper = mean_returns_spread_bps.values + (std_err_bps * bandwidth)
          lower = mean_returns_spread_bps.values - (std_err_bps * bandwidth)
          ax.fill_between(mean_returns_spread.index,
                          lower,
                          upper,
                          alpha=0.3,
                          color='steelblue')
  
      ylim = np.nanpercentile(abs(mean_returns_spread_bps.values), 95)
      ax.set(ylabel='Difference In Quantile Mean Return (bps)',
             xlabel='',
             title=title,
             ylim=(-ylim, ylim))
      ax.axhline(0.0, linestyle='-', color='black', lw=1, alpha=0.8)
  
      return ax