class_docstr: Calculate the difference between two columns.
  
  This calculation can be applied to :class:`.Number` columns to calculate
  numbers. It can also be applied to :class:`.Date`, :class:`.DateTime`, and
  :class:`.TimeDelta` columns to calculate time deltas.
  
  :param before_column_name:
      The name of a column containing the "before" values.
  :param after_column_name:
      The name of a column containing the "after" values.
class_docstr_tok: ["Calculate","the","difference","between","two","columns",".","This","calculation","can","be","applied","to",":","class",":","`",".Number","`","columns","to","calculate","numbers",".","It","can","also","be","applied","to",":","class",":","`",".Date","`",",",":","class",":","`",".DateTime","`",",","and",":","class",":","`",".TimeDelta","`","columns","to","calculate","time","deltas",".",":","param","before_column_name",":","The","name","of","a","column","containing","the","``","before","''","values",".",":","param","after_column_name",":","The","name","of","a","column","containing","the","``","after","''","values","."]
code: def validate(self, table):
      before_column = table.columns[self._before_column_name]
      after_column = table.columns[self._after_column_name]
  
      for data_type in (Number, Date, DateTime, TimeDelta):
          if isinstance(before_column.data_type, data_type):
              if not isinstance(after_column.data_type, data_type):
                  raise DataTypeError(
                      "Specified columns must be of the same type"
                  )
  
              if HasNulls(self._before_column_name).run(table):
                  warn_null_calculation(self, before_column)
  
              if HasNulls(self._after_column_name).run(table):
                  warn_null_calculation(self, after_column)
  
              return
  
      raise DataTypeError(
          "Change before and after columns must both contain data that is one of: "
          "Number, Date, DateTime or TimeDelta."
      )
  
file_path: agate/agate/computations/change.py
imports: from agate.aggregations.has_nulls import HasNulls
  from agate.computations.base import Computation
  from agate.data_types import Date, DateTime, Number, TimeDelta
  from agate.exceptions import DataTypeError
  from agate.warns import warn_null_calculation
label_desc: Use image node_id 3 for calling the Change obj's underlying member method code with example usage: obj.validate(table) without return types