class_docstr: Streaming histogram.
  
  Parameters
  ----------
  max_bins
      Maximal number of bins.
  
  Attributes
  ----------
  n
      Total number of seen values.
  
  Examples
  --------
  
  >>> from river import sketch
  >>> import numpy as np
  
  >>> np.random.seed(42)
  
  >>> values = np.hstack((
  ...     np.random.normal(-3, 1, 1000),
  ...     np.random.normal(3, 1, 1000),
  ... ))
  
  >>> hist = sketch.Histogram(max_bins=15)
  
  >>> for x in values:
  ...     hist.update(x)
  
  >>> for bin in hist:
  ...     print(bin)
  [-6.24127, -6.24127]: 1
  [-5.69689, -5.19881]: 8
  [-5.12390, -4.43014]: 57
  [-4.42475, -3.72574]: 158
  [-3.71984, -3.01642]: 262
  [-3.01350, -2.50668]: 206
  [-2.50329, -0.81020]: 294
  [-0.80954, 0.29677]: 19
  [0.40896, 0.82733]: 7
  [0.84661, 1.25147]: 24
  [1.26029, 2.30758]: 178
  [2.31081, 3.05701]: 284
  [3.05963, 3.69695]: 242
  [3.69822, 5.64434]: 258
  [6.13775, 6.19311]: 2
  
  References
  ----------
  [^1]: [Ben-Haim, Y. and Tom-Tov, E., 2010. A streaming parallel decision tree algorithm. Journal of Machine Learning Research, 11(Feb), pp.849-872.](http://jmlr.org/papers/volume11/ben-haim10a/ben-haim10a.pdf)
  [^2]: [Go implementation](https://github.com/VividCortex/gohistogram)
docstr: Yields CDF values for a sorted iterable of values.
  
  This is faster than calling `cdf` with many values.
  
  Examples
  --------
  
  >>> from river import sketch
  
  >>> hist = sketch.Histogram()
  >>> for x in range(4):
  ...     hist.update(x)
  
  >>> print(hist)
  [0.00000, 0.00000]: 1
  [1.00000, 1.00000]: 1
  [2.00000, 2.00000]: 1
  [3.00000, 3.00000]: 1
  
  >>> X = [-1, 0, .5, 1, 2.5, 3.5]
  >>> for x, cdf in zip(X, hist.iter_cdf(X)):
  ...     print(x, cdf)
  -1 0.0
  0 0.25
  0.5 0.25
  1 0.5
  2.5 0.75
  3.5 1.0
docstr_tok: ["Yields","CDF","values","for","a","sorted","iterable","of","values",".","This","is","faster","than","calling","`","cdf","`","with","many","values",".","Examples","--","--","--","--",">",">",">","from","river","import","sketch",">",">",">","hist","=","sketch.Histogram","(",")",">",">",">","for","x","in","range","(","4",")",":","...","hist.update","(","x",")",">",">",">","print","(","hist",")","[","0.00000",",","0.00000","]",":","1","[","1.00000",",","1.00000","]",":","1","[","2.00000",",","2.00000","]",":","1","[","3.00000",",","3.00000","]",":","1",">",">",">","X","=","[","-1",",","0",",",".5",",","1",",","2.5",",","3.5","]",">",">",">","for","x",",","cdf","in","zip","(","X",",","hist.iter_cdf","(","X",")",")",":","...","print","(","x",",","cdf",")","-1","0.0","0","0.25","0.5","0.25","1","0.5","2.5","0.75","3.5","1.0"]
code: def iter_cdf(self, X, verbose=False):
      """Yields CDF values for a sorted iterable of values.
  
      This is faster than calling `cdf` with many values.
  
      Examples
      --------
  
      >>> from river import sketch
  
      >>> hist = sketch.Histogram()
      >>> for x in range(4):
      ...     hist.update(x)
  
      >>> print(hist)
      [0.00000, 0.00000]: 1
      [1.00000, 1.00000]: 1
      [2.00000, 2.00000]: 1
      [3.00000, 3.00000]: 1
  
      >>> X = [-1, 0, .5, 1, 2.5, 3.5]
      >>> for x, cdf in zip(X, hist.iter_cdf(X)):
      ...     print(x, cdf)
      -1 0.0
      0 0.25
      0.5 0.25
      1 0.5
      2.5 0.75
      3.5 1.0
  
      """
  
      bins = iter(self)
      b = next(bins)
      INF = Bin(math.inf, math.inf, 0)
  
      cdf = 0
  
      for x in X:
          while x >= b.right:
              cdf += b.count
              b = next(bins, INF)
  
          if x > b.left:
              yield (
                  cdf + b.count * (x - b.left) / (b.right - b.left)
              ) / self.n
              continue
  
          yield cdf / self.n
  
imports: from __future__ import annotations
  import collections
  import heapq
  import itertools
  import math
  from river import base
label_desc: Use image node_id 4 for calling the Histogram obj's underlying member method code with example usage: obj.iter_cdf(X, verbose) without return types