def percentileOfSeries(requestContext, *args): levels = [] seriesList = [] for arg in args: logging.info("Arg: %s", arg) if isinstance(arg, (int, long, float)): levels.append(arg) elif isinstance(arg, basestring): levels += [float(x) for x in arg.split(";")] else: seriesList += arg logging.info("Levels: %s", levels) logging.info("Series: %s", seriesList) result = [] for level in levels: if levels <= 0: raise ValueError('The requested percent is required to be greater than 0') name = 'percentilesOfSeries(%s,%g)' % (seriesList[0].pathExpression, level) (start, end, step) = functions.normalize([seriesList])[1:] values = [functions._getPercentile(row, level, False) for row in functions.izip(*seriesList)] resultSeries = TimeSeries(name, start, end, step, values) resultSeries.pathExpression = name result.append(resultSeries) return result
def testGetPercentile(self): seriesList = [ ([None, None, 15, 20, 35, 40, 50], 20), (range(100), 30), (range(200), 60), (range(300), 90), (range(1, 101), 31), (range(1, 201), 61), (range(1, 301), 91), (range(0, 102), 30), (range(1, 203), 61), (range(1, 303), 91), ] for index, conf in enumerate(seriesList): series, expected = conf result = functions._getPercentile(series, 30) self.assertEqual(expected, result, 'For series index <%s> the 30th percentile ordinal is not %d, but %d ' % (index, expected, result))