docs: def build_report(self):
          """
          Calculates the pair of metrics for each threshold for each result.
          """
          thresholds = self.thresholds
          lower_quantile = self.config['lower_quantile']
          upper_quantile = self.config['upper_quantile']
  
          if self.n_current_results > self.n_cached_curves:
              # If there are new curves, recompute
              colnames = ['_'.join([metric, stat])
                          for metric in [self.metric1.name, self.metric2.name]
                          for stat in ['Mean', 'Median',
                                       '%d_Percentile' % (100*lower_quantile),
                                       '%d_Percentile' % (upper_quantile*100)]]
              self.ret = pd.DataFrame(columns=colnames, index=thresholds, dtype='float64')
  
              for threshold in thresholds:
                  m1s = Series([self.metric1.score(result, threshold) for result in self.results])
                  m2s = Series([self.metric2.score(result, threshold) for result in self.results])
                  self.ret.loc[threshold] = (m1s.mean(), m1s.quantile(.5), m1s.quantile(.05), m1s.quantile(.95),
                                             m2s.mean(), m2s.quantile(.5), m2s.quantile(.05), m2s.quantile(.95))
          self.build_curves()
          self.summary_df = self.ret
          return self.ret