code: def run(self):
          
  
          self._func, self._func_code = self.build()
  
          def process_row(row):
  
              try:
                  self._func(self._stats, row)
              except TypeError as e:
                  raise TypeError("Failed for '{}'; {}".format(self._func_code, e))
              except KeyError:
                  raise KeyError(
                      'Failed to find key in row. headers = "{}", code = "{}" '
                      .format(list(row.keys()), self._func_code))
              except Exception as e:
                  raise type(e)(
                      'General exception in stats. headers = "{}", code = "{}": {} '
                          .format(list(row.keys()), self._func_code, e))
  
          # Use all of the rows in the source
          if self._sample_size is None:
              for i, row in enumerate(self._source):
                  process_row(row)
          # Use a sample of rows, evenly distributed though the source
          else:
  
              skip_rate = self._sample_size / self._n_rows
  
              i = 0
              skip = skip_rate
              for j, row in enumerate(self._source):
                  skip += skip_rate
                  if skip >= 1:
                      skip -= 1
                      i += 1
                      process_row(row)
  
          if i < 5000:  # Since the hist bins aren't built until 5K row
              for k, v in self._stats.items():
                  v._build_hist_bins()
  
          return self
docs: Run the stats. The source must yield Row proxies.