code: def calc(self, *args, **kwargs):
          
          cases = kwargs.pop('_cases', [])
          if not isinstance(cases, Iterable):
              cases = [cases, ]
          result_callback = kwargs.pop('_result_callback', None)
          execute_now = kwargs.pop('execute_now', True)
  
          exec_id = self._get_exec_id()
          params = dict((k, v.value) for k, v in six.iteritems(self._parameters))
  
          obj_dict = self._map_inputs_from_args(*args, **kwargs)
          engine_kw = dict(p for p in six.iteritems(kwargs) if p[0] not in obj_dict)
  
          expr_kw = dict(_params=params, _exec_id=exec_id, _engine_kw=engine_kw)
          if cases:
              expr_kw['_cases'] = cases
  
          expr_kw.update((ML_ARG_PREFIX + k, v) for k, v in six.iteritems(obj_dict))
          if result_callback:
              expr_kw['_result_callback'] = result_callback
          expr = self._metrics_expr(**expr_kw)
  
          if execute_now:
              return expr.execute()
          else:
              return expr
docs: :type args: list[DataFrame]