docs: def _analyze(self):
          '''Run-once function to generate analysis over all series, considering both full and partial data.
             Initializes the self.analysis dict which maps:
                 (non-reference) column/series -> 'full' and/or 'partial' -> stats dict returned by get_xy_dataset_statistics
          '''
  
          if not self.analysis:
              for dseries in self.data_series:
  
                  # Count number of non-NaN rows
                  dseries_count = self.df[dseries].count()
                  assert(len(self.df_pruned) <= dseries_count <= len(self.df) or dseries_count)
                  self.analysis[dseries] = dict(
                      partial = None,
                      full = None,
                  )
  
                  # Compute the statistics for the common records
                  stats = get_xy_dataset_statistics_pandas(self.df_pruned, self.reference_series, dseries,
                                                           fcorrect_x_cutoff = 1.0, fcorrect_y_cutoff = 1.0,
                                                           bootstrap_data = False,
                                                           x_fuzzy_range = 0.1,
                                                           y_scalar = 1.0, ignore_null_values = True)
  
                  if (len(self.df_pruned) == len(self.df)):
                      # There are no pruned records so these are actually the full stats
                      self.analysis[dseries]['full'] = dict(data = stats, description = format_stats(stats, floating_point_format = '%0.3f', sci_notation_format = '%.2E', return_string = True))
                  else:
                      # Store the results for the partial dataset
                      self.analysis[dseries]['partial'] = dict(data = stats, description = format_stats(stats, floating_point_format = '%0.3f', sci_notation_format = '%.2E', return_string = True))
                      if dseries_count > len(self.df_pruned):
                          # This dataset has records which are not in the pruned dataset
                          stats = get_xy_dataset_statistics_pandas(self.df, self.reference_series, dseries,
                                                                   fcorrect_x_cutoff = 1.0, fcorrect_y_cutoff = 1.0,
                                                                   bootstrap_data = False,
                                                                   x_fuzzy_range = 0.1,
                                                                   y_scalar = 1.0, ignore_null_values = True)
                          self.analysis[dseries]['full'] = dict(data = stats, description = format_stats(stats, floating_point_format = '%0.3f', sci_notation_format = '%.2E', return_string = True))
  
          return self.analysis