black-jack

BlackJack is under development and PRs / issues are definitely welcome!

crates.io Build Status Coverage Status Dependabot Status License License

Rust API Documentation


BlackJack strives to be a full featured crate for general data processing.

Long term goal is to create a lightweight Pandas equivalent by and for the Rust community, but with slight differences in focus...

The project strives for a few key principles. When any implementation decisions are to be made, they are made with these principles in mind, and in this order: 1. Memory efficiency - Minimize memory use at every opportunity. 2. Usability - Strive for ergonomics; often done by modeling the Pandas API where possible. 3. Speedy - It comes naturally most times with Rust. :)

Eventually we'll have a Python wrapper: Lumber-Jack associated with this crate, but that time will come.

Example use:

```rust,skt-default

// We have a dataframe, of course... let mut df = DataFrame::new();

// Make some series, of different types let seriesi32: Series = Series::arange(0, 5); let mut seriesf64: Series = Series::from_vec(vec![1.0, 2.0, 3.0, 4.0, 5.0]);

// You can set a series name! seriesf64.setname("my-series");

// Or not... asserteq!(seriesi32.name(), None);

// And add them to the dataframe df.addcolumn(seriesf64).unwrap(); df.addcolumn(seriesi32).unwrap();

// And then get a reference to a Series let seriesf64ref: &Series = df.get_column("my-series").unwrap();

```

Read a CSV file:

Also supports reading .gz files

```rust,skt-default

// Define the path to file let path: &str = concat!(env!("CARGOMANIFESTDIR"), "/tests/data/medium_csv.csv");

// Use the Reader to read the dataframe let df = Reader::new(&path).read().expect("Failed to read file");

// Get a refrence to a specific column and assert the sum of that series let series2: &Series = df.get_column("col2").unwrap();

assert_eq!(series2.sum(), 3000);

```

Query/filter a dataframe

```rust,skt-default let mut s1 = Series::from(0..5); s1.set_name("col1");

let mut s2 = Series::from(10..15); s2.set_name("col2");

let mut s3 = Series::fromvec(vec![ "foo".tostring(), "bar".tostring(), "foo".tostring(), "bar".tostring(), "foo".tostring(), ]); s3.set_name("col3");

let mut df = DataFrame::new(); assert!(df.addcolumn(s1).isok()); assert!(df.addcolumn(s2).isok()); assert!(df.addcolumn(s3).isok());

// Before filtering, we're len 5 and first element of 'col1' is 0 assert_eq!(df.len(), 5);

df.filterbyrow(|row| row["col1"] == Datum::I32(&0));

// After filtering, we're len 4 and first element of 'col1' is now 1 assert_eq!(df.len(), 4);

// Filter by string foo, df.filterbyrow(|row| row["col3"] != Datum::STR(&"foo".tostring())); asserteq!(df.len(), 2); ```

and a whole lot more..


Development


Contributing

All contributions are welcome. Contributors of this project are expected to treat all others with respect and dignity; acknowledging there will be differences of opinion and strive to provide a welcoming environment for others, regardless of skill level.

Additionally, all contributions, unless otherwise stated, will be given under the Unlicense and/or MIT licenses.