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