code: def test_percent_change_nulls(self):
      with self.assertWarns(NullCalculationWarning):
          new_table = self.table.compute(
              [("test", PercentChange("three", "four"))]
          )
  
      with self.assertWarns(NullCalculationWarning):
          new_table = self.table.compute(
              [("test", PercentChange("four", "three"))]
          )
  
      warnings.simplefilter("ignore")
  
      try:
          new_table = self.table.compute(
              [("test", PercentChange("three", "four"))]
          )
      finally:
          warnings.resetwarnings()
  
      self.assertIsNot(new_table, self.table)
      self.assertEqual(len(new_table.rows), 4)
      self.assertEqual(len(new_table.columns), 5)
  
      def to_one_place(d):
          return d.quantize(Decimal("0.1"))
  
      self.assertSequenceEqual(
          new_table.rows[2],
          ("a", Decimal("2"), Decimal("4"), None, None),
      )
      self.assertEqual(
          to_one_place(new_table.columns["test"][0]), Decimal("33.3")
      )
      self.assertEqual(new_table.columns["test"][1], None)
      self.assertEqual(new_table.columns["test"][2], None)
      self.assertEqual(new_table.columns["test"][3], None)
  
imports: import datetime
  import unittest
  import warnings
  from decimal import Decimal
  from agate import Table
  from agate.computations import Change, Formula, Percent, PercentChange, PercentileRank, Rank, Slug
  from agate.data_types import Boolean, Date, DateTime, Number, Text, TimeDelta
  from agate.exceptions import CastError, DataTypeError
  from agate.warns import NullCalculationWarning
label_desc: Use image node_id 15 for calling the TestTableComputation obj's underlying member method code with example usage: obj.test_percent_change_nulls() and returns: d