def quantiles(self, *quantiles): """Return the estimated data value for the given quantile(s). The requested quantile(s) must be between 0 and 1. Note that even if a single quantile is input, a list is always returned. """ temp = bin_sums(self.bins) sums = list(accumulate(temp)) result = [] for x in quantiles: target_sum = x * self.total if x <= 0: qq = self._min elif x >= self.total: qq = self._max else: index = bisect_left(sums, target_sum) bin_i = self.bins[index] if index < len(sums): bin_i1 = self.bins[index+1] else: bin_i1 = self.bins[index] if index: prev_sum = sums[index-1] else: prev_sum = 0.0 qq = _compute_quantile(target_sum, bin_i, bin_i1, prev_sum+1) result.append(qq) return result
def quantiles(self, *quantiles): """Return the estimated data value for the given quantile(s). The requested quantile(s) must be between 0 and 1. Note that even if a single quantile is input, a list is always returned. """ temp = bin_sums(self.bins) sums = list(accumulate(temp)) result = [] for x in quantiles: target_sum = x * self.total if x <= 0: qq = self._min elif x >= self.total: qq = self._max else: index = bisect_left(sums, target_sum) bin_i = self.bins[index] if index < len(sums): bin_i1 = self.bins[index + 1] else: bin_i1 = self.bins[index] if index: prev_sum = sums[index - 1] else: prev_sum = 0.0 qq = _compute_quantile(target_sum, bin_i, bin_i1, prev_sum + 1) result.append(qq) return result
def sum(self, x): """Return the estimated number of points in the interval [−∞, b].""" x = float(x) if x < self._min: ss = 0.0 # Sum is zero! elif x >= self._max: ss = float(self.total) elif x == self.bins[-1].value: # Shortcut for when i == max bin (see Steps 3-6) last = self.bins[-1] ss = float(self.total) - (float(last.count) / 2.0) # elif x <= self.bins[0].value: # # Shortcut for when i == min bin (see Steps 3-6) # first = self.bins[0] # ss = float(first.count) / 2.0 else: bin_i = self.floor(x) if bin_i is None: bin_i = Bin(value=self._min, count=0) bin_i1 = self.higher(x) if bin_i1 is None: bin_i1 = Bin(value=self._max, count=0) if bin_i.value == self._min: prev_sum = self.bins[0].count / 2.0 else: temp = bin_sums(self.bins, less=x) if len(temp): prev_sum = sum(temp) else: prev_sum = 0.0 ss = _compute_sum(x, bin_i, bin_i1, prev_sum) return ss