class_docstr: Calculate the percent difference between two columns.
  
  :param before_column_name:
      The name of a column containing the "before" :class:`.Number` values.
  :param after_column_name:
      The name of a column containing the "after" :class:`.Number` values.
class_docstr_tok: ["Calculate","the","percent","difference","between","two","columns",".",":","param","before_column_name",":","The","name","of","a","column","containing","the","``","before","''",":","class",":","`",".Number","`","values",".",":","param","after_column_name",":","The","name","of","a","column","containing","the","``","after","''",":","class",":","`",".Number","`","values","."]
code: def validate(self, table):
      before_column = table.columns[self._before_column_name]
      after_column = table.columns[self._after_column_name]
  
      if not isinstance(before_column.data_type, Number):
          raise DataTypeError(
              "PercentChange before column must contain Number data."
          )
  
      if not isinstance(after_column.data_type, Number):
          raise DataTypeError(
              "PercentChange after column must contain Number data."
          )
  
      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)
  
file_path: agate/agate/computations/percent_change.py
imports: from agate.aggregations.has_nulls import HasNulls
  from agate.computations.base import Computation
  from agate.data_types import Number
  from agate.exceptions import DataTypeError
  from agate.warns import warn_null_calculation
label_desc: Use image node_id 3 for calling the PercentChange obj's underlying member method code with example usage: obj.validate(table) without return types