def run(self, table): """ :returns: An instance of :class:`Quantiles`. """ column = table.columns[self._column_name] data = column.values_without_nulls_sorted() if not data: return Quantiles([None for percentile in range(101)]) # Zeroth percentile is first datum quantiles = [data[0]] for percentile in range(1, 100): k = len(data) * (float(percentile) / 100) low = max(1, int(math.ceil(k))) high = min(len(data), int(math.floor(k + 1))) # No remainder if low == high: value = data[low - 1] # Remainder else: value = (data[low - 1] + data[high - 1]) / 2 quantiles.append(value) # Hundredth percentile is final datum quantiles.append(data[-1]) return Quantiles(quantiles)
def run(self, column): """ :returns: An array of :class:`decimal.Decimal`. """ if column.aggregate(HasNulls()): warn_null_calculation(self, column) data = column.values_without_nulls_sorted() # Zeroth percentile is first datum quantiles = [data[0]] for percentile in range(1, 100): k = len(data) * (float(percentile) / 100) low = max(1, int(math.ceil(k))) high = min(len(data), int(math.floor(k + 1))) # No remainder if low == high: value = data[low - 1] # Remainder else: value = (data[low - 1] + data[high - 1]) / 2 quantiles.append(value) # Hundredth percentile is final datum quantiles.append(data[-1]) return Quantiles(quantiles)
def run(self, table): """ :returns: An instance of :class:`Quantiles`. """ percentiles = Percentiles(self._column_name).run(table) return Quantiles([percentiles[i] for i in range(0, 101, 25)])
class TestQuantiles(unittest.TestCase): def setUp(self): self.values = [0, 10, 20, 30, 40, 50] self.quantiles = Quantiles(self.values) def test_methods(self): self.assertEqual(len(self.quantiles), 6) self.assertEqual(self.quantiles[2], 20) self.assertSequenceEqual(list(self.quantiles), self.values) self.assertEqual(repr(self.quantiles), repr(self.values)) def test_locate(self): self.assertEqual(self.quantiles.locate(25), 2) self.assertEqual(self.quantiles.locate(40), 4) with self.assertRaises(ValueError): self.quantiles.locate(-10) with self.assertRaises(ValueError): self.quantiles.locate(51)
def setUp(self): self.values = [0, 10, 20, 30, 40, 50] self.quantiles = Quantiles(self.values)
def test_deciles_all_nulls(self): self.assertEqual( Deciles('four').run(self.table), Quantiles([None] * 11))
def test_quintiles_all_nulls(self): self.assertEqual( Quintiles('four').run(self.table), Quantiles([None] * 6))
def test_percentiles_all_nulls(self): self.assertEqual( Percentiles('four').run(self.table), Quantiles([None] * 101))
def run(self, column): percentiles = column.aggregate(Percentiles()) return Quantiles([percentiles[i] for i in range(0, 101, 10)])