code: def factor_information_coefficient(factor_data,
                                     group_adjust=False,
                                     by_group=False):
      
  
      def src_ic(group):
          f = group['factor']
          _ic = group[utils.get_forward_returns_columns(factor_data.columns)] \
              .apply(lambda x: stats.spearmanr(x, f)[0])
          return _ic
  
      factor_data = factor_data.copy()
  
      grouper = [factor_data.index.get_level_values('date')]
  
      if group_adjust:
          factor_data = utils.demean_forward_returns(factor_data,
                                                     grouper + ['group'])
      if by_group:
          grouper.append('group')
  
      ic = factor_data.groupby(grouper).apply(src_ic)
  
      return ic
docs: Computes the Spearman Rank Correlation based Information Coefficient (IC)
      between factor values and N period forward returns for each period in
      the factor index.
  
      Parameters
      ----------
      factor_data : pd.DataFrame - MultiIndex
          A MultiIndex DataFrame indexed by date (level 0) and asset (level 1),
          containing the values for a single alpha factor, forward returns for
          each period, the factor quantile/bin that factor value belongs to, and
          (optionally) the group the asset belongs to.
          - See full explanation in utils.get_clean_factor_and_forward_returns
      group_adjust : bool
          Demean forward returns by group before computing IC.
      by_group : bool
          If True, compute period wise IC separately for each group.
  
      Returns
      -------
      ic : pd.DataFrame
          Spearman Rank correlation between factor and
          provided forward returns.