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.
```rust,skt-default
// We have a dataframe, of course... let mut df = DataFrame::new();
// Make some series, of different types
let seriesi32: Series
// 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
```
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
assert_eq!(series2.sum(), 3000);
```
```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); ```
sudo dnf install gsl-devel
sudo apt-get install libgsl-dev
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.