changepoint 0.11.0

Change Point Detection in Rust

changepoint - Change point detection for Rust

Changepoint is a library for doing change point detection for streams of data.

Gitlab pipeline status (branch)


Includes the following change point detection algorithms:

  • Bocpd -- Online Bayesian Change Point Detection Reference.
  • BocpdTruncated -- Same as Bocpd but truncated the run-length distribution when those lengths are unlikely.


//! A demo of the online Bayesian change point detection on
//! the 3-month Treasury Bill Secondary Market Rate from
//! After this example is run, the file `trasury_bill.ipynb` can be run to generate
//! plots for this dataset.
//! > Board of Governors of the Federal Reserve System (US), 3-Month Treasury Bill: Secondary
//! > Market Rate [TB3MS], retrieved from FRED, Federal Reserve Bank of St. Louis;
//! >, August 5, 2019.

use changepoint::{utils::*, BocpdTruncated, BocpdLike};
use rv::prelude::*;
use std::io;
use std::path::PathBuf;
use std::fs::read_to_string;

fn main() -> io::Result<()> {
    // Parse the data from the TB3MS dataset
    let mut csv_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
    let data: String = read_to_string(&csv_path)?;
    let (dates, pct_change): (Vec<&str>, Vec<f64>) = data
        .map(|line| {
            let split: Vec<&str> = line.splitn(2, ',').collect();
            let date = split[0];
            let raw_pct = split[1];
            (date, raw_pct.parse::<f64>().unwrap())

    // Create the Bocpd processor
    let mut cpd = BocpdTruncated::new(
        NormalGamma::new_unchecked(0.0, 1.0, 1.0, 1.0),

    // Feed data into change point detector and generate a sequence of run-length distributions
    let rs: Vec<Vec<f64>> = pct_change
        .map(|d| cpd.step(d).into())

    // Determine most likely change points
    let change_points: Vec<usize> = map_changepoints(&rs);
    let change_dates: Vec<&str> =
        change_points.iter().map(|&i| dates[i]).collect();

    // Write output for processing my `trasury_bill.ipynb`.

    println!("Most likely dates of changes = {:#?}", change_dates);


To run this example, from the source root, run cargo run --example treasury_bill. The partner notebook can be used to generate the following plots:

Treasury Bill Plots