in src/main/scala/com/amazon/deequ/analyzers/QuantileNonSample.scala [246:278]
def quantiles(q: Int) : Array[T] = {
if (output.isEmpty) {
return Array.empty
}
val sortedItems = output.sortBy({
case (item, _) => item
})
val totalWeight = sortedItems.map({
case (_, weight) => weight
}).sum
var nextThresh = totalWeight/q
var curq = 1
var i = 0
var sumSoFar: Long = 0
val (initializedValue, _) = sortedItems(0)
val quantiles = Array.fill[T](q - 1)(initializedValue)
while (i < sortedItems.length && curq < q) {
while (sumSoFar < nextThresh) {
val (_, weight) = sortedItems(i)
sumSoFar += weight
i += 1
}
val (item, _) = sortedItems(math.min(i, sortedItems.length - 1))
quantiles(curq - 1) = item
curq += 1
nextThresh = curq * totalWeight / q
}
quantiles
}