Skip to content

0.20.0 - 2023-11-09

  • River's mini-batch methods now support pandas v2. In particular, River conforms to pandas' new sparse API.
  • Dropped support for Python 3.8.
  • Added support for Python 3.12.




  • Add fixes to cluster.DBSTREAM algorithm, including:
  • Addition of the - sign before the fading_factor in accordance with the algorithm 2 proposed by Hashler and Bolanos (2016) to allow clusters with low weights to be removed.
  • The new micro_cluster is added with the key derived from the maximum key of the existing micro clusters. If the set of micro clusters is still empty (len = 0), a new micro cluster is added with key 0.
  • cluster_is_up_to_date is set to True at the end of the self._recluster() function.
  • Shared density graph update timestamps are initialized with the current timestamp value
  • neighbour_neighbours are appended correctly to the seed_set when generating cluster labels
  • When building weighted adjacency matrix the algorithm accounts for possibly orphaned entries in shared density graph


  • Added datasets.WebTraffic, which is a dataset that counts the occurrences of events on a website. It is a multi-output regression dataset with two outputs.


  • Add drift.NoDrift to allow disabling the drift detection capabilities of models. This detector does nothing and always returns False when queried whether or not a concept drift was detected.



  • Simplify inner the structures of forest.ARFClassifier and forest.ARFRegressor by removing redundant class hierarchy. Simplify how concept drift logging can be accessed in individual trees and in the forest as a whole.




  • Fix a bug in tree.splitter.NominalSplitterClassif that generated a mismatch between the number of existing tree branches and the number of tracked branches.
  • Fix a bug in tree.ExtremelyFastDecisionTreeClassifier where the split re-evaluation failed when the current branch's feature was not available as a split option. The fix also enables the tree to pre-prune a leaf via the tie-breaking mechanism.


  • Implementation of the incremental Kolmogorov-Smirnov statistics (at stats.KolmogorovSmirnov), with the option to calculate either the original KS or Kuiper's test.


  • Removed utils.dict2numpy and utils.numpy2dict functions. They were not used anywhere in the library.
  • utils.TimeRolling now works correctly if two samples with the same timestamp are added in a row.