code: def evaluate(self, verbose=False, decode=True, passes=None, num_threads=1, apply_experimental=True):
          
          # TODO: work on masking (branch masking) ~ evaluate the mask first and use on both index and data;
          # TODO right now the filter gets computed twice, once for index and once for the data
          evaluated_data = super(Series, self).evaluate(verbose, decode, passes, num_threads, apply_experimental)
          evaluated_index = self.index.evaluate(verbose, decode, passes, num_threads, apply_experimental)
  
          return Series(evaluated_data, evaluated_index, self.dtype, self.name)
docs: Evaluates by creating a Series containing evaluated data and index.
  
          See `LazyResult`
  
          Returns
          -------
          Series
              Series with evaluated data and index.
  
          Examples
          --------
          >>> sr = bl.Series(np.arange(3)) > 0
          >>> weld_code = sr.values  # accessing values now returns the weld code as a string
          >>> sr = sr.evaluate()
          >>> sr.values  # now it is evaluated to raw data
          array([False,  True,  True])