def test_percentiles(self): with warnings.catch_warnings(): warnings.simplefilter('error') with self.assertRaises(NullCalculationWarning): Percentiles('one').validate(self.table) with self.assertRaises(DataTypeError): Percentiles('three').validate(self.table) warnings.simplefilter('ignore') try: Percentiles('two').validate(self.table) finally: warnings.resetwarnings() rows = [(n, ) for n in range(1, 1001)] table = Table(rows, ['ints'], [self.number_type]) percentiles = Percentiles('ints').run(table) self.assertEqual(percentiles[0], Decimal('1')) self.assertEqual(percentiles[25], Decimal('250.5')) self.assertEqual(percentiles[50], Decimal('500.5')) self.assertEqual(percentiles[75], Decimal('750.5')) self.assertEqual(percentiles[99], Decimal('990.5')) self.assertEqual(percentiles[100], Decimal('1000'))
def prepare(self, table): column = table.columns[self._column_name] if not isinstance(column.data_type, Number): raise DataTypeError( 'PercentileRank column must contain Number data.') self._percentiles = Percentiles(self._column_name).run(table)
def run(self, table): """ :returns: :class:`int` """ percentiles = Percentiles(self._column_name).run(table) new_column = [] for row in table.rows: new_column.append(percentiles.locate(row[self._column_name])) return new_column
def prepare(self, table): column = table.columns[self._column_name] if not isinstance(column.data_type, Number): raise DataTypeError('PercentileRank column must contain Number data.') self._percentiles = Percentiles(self._column_name).run(table)
def test_percentiles_locate(self): rows = [(n, ) for n in range(1, 1001)] table = Table(rows, ['ints'], [self.number_type]) percentiles = Percentiles('ints').run(table) self.assertEqual(percentiles.locate(251), Decimal('25')) self.assertEqual(percentiles.locate(260), Decimal('25')) self.assertEqual(percentiles.locate(261), Decimal('26')) with self.assertRaises(ValueError): percentiles.locate(0) with self.assertRaises(ValueError): percentiles.locate(1012)
class PercentileRank(Rank): """ Assign each value in a column to the percentile into which it falls. See :class:`.Percentiles` for implementation details. """ def prepare(self, table): column = table.columns[self._column_name] if not isinstance(column.data_type, Number): raise DataTypeError('PercentileRank column must contain Number data.') self._percentiles = Percentiles(self._column_name).run(table) def run(self, row): """ :returns: :class:`int` """ return self._percentiles.locate(row[self._column_name])
class PercentileRank(Rank): """ Assign each value in a column to the percentile into which it falls. See :class:`.Percentiles` for implementation details. """ def prepare(self, table): column = table.columns[self._column_name] if not isinstance(column.data_type, Number): raise DataTypeError( 'PercentileRank column must contain Number data.') self._percentiles = Percentiles(self._column_name).run(table) def run(self, row): """ :returns: :class:`int` """ return self._percentiles.locate(row[self._column_name])
def test_percentiles_all_nulls(self): self.assertEqual( Percentiles('four').run(self.table), Quantiles([None] * 101))