code: def test_percentile_rank(self):
      rows = [(n,) for n in range(1, 1001)]
  
      table = Table(rows, ["ints"], [self.number_type])
      new_table = table.compute(
          [("percentiles", PercentileRank("ints"))]
      )
  
      self.assertEqual(len(new_table.rows), 1000)
      self.assertEqual(len(new_table.columns), 2)
  
      self.assertSequenceEqual(new_table.rows[0], (1, 0))
      self.assertSequenceEqual(new_table.rows[50], (51, 5))
      self.assertSequenceEqual(new_table.rows[499], (500, 49))
      self.assertSequenceEqual(new_table.rows[500], (501, 50))
      self.assertSequenceEqual(new_table.rows[998], (999, 99))
      self.assertSequenceEqual(new_table.rows[999], (1000, 100))
      self.assertIsInstance(
          new_table.columns["percentiles"][0], Decimal
      )
      self.assertIsInstance(
          new_table.columns["percentiles"][-1], Decimal
      )
  
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 21 for calling the TestTableComputation obj's underlying member method code with example usage: obj.test_percentile_rank() without return types