mirror of
https://github.com/Magnus167/rustframe.git
synced 2025-08-20 08:19:59 +00:00
78 lines
2.3 KiB
Markdown
78 lines
2.3 KiB
Markdown
# Data Manipulation
|
|
|
|
Rustframe's `Frame` type couples tabular data with
|
|
column labels and a typed row index. Frames expose a familiar API for loading
|
|
data, selecting rows or columns and performing aggregations.
|
|
|
|
## Creating a Frame
|
|
|
|
```rust
|
|
# extern crate rustframe;
|
|
use rustframe::frame::{Frame, RowIndex};
|
|
use rustframe::matrix::Matrix;
|
|
|
|
let data = Matrix::from_cols(vec![vec![1.0, 2.0], vec![3.0, 4.0]]);
|
|
let frame = Frame::new(data, vec!["A", "B"], None);
|
|
assert_eq!(frame["A"], vec![1.0, 2.0]);
|
|
```
|
|
|
|
## Indexing Rows
|
|
|
|
Row labels can be integers, dates or a default range. Retrieving a row returns a
|
|
view that lets you inspect values by column name or position.
|
|
|
|
```rust
|
|
# extern crate rustframe;
|
|
# extern crate chrono;
|
|
use chrono::NaiveDate;
|
|
use rustframe::frame::{Frame, RowIndex};
|
|
use rustframe::matrix::Matrix;
|
|
|
|
let d = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
|
|
let data = Matrix::from_cols(vec![vec![1.0, 2.0], vec![3.0, 4.0]]);
|
|
let index = RowIndex::Date(vec![d(2024, 1, 1), d(2024, 1, 2)]);
|
|
let mut frame = Frame::new(data, vec!["A", "B"], Some(index));
|
|
assert_eq!(frame.get_row_date(d(2024, 1, 2))["B"], 4.0);
|
|
|
|
// mutate by row key
|
|
frame.get_row_date_mut(d(2024, 1, 1)).set_by_index(0, 9.0);
|
|
assert_eq!(frame.get_row_date(d(2024, 1, 1))["A"], 9.0);
|
|
```
|
|
|
|
## Column operations
|
|
|
|
Columns can be inserted, renamed, removed or reordered in place.
|
|
|
|
```rust
|
|
# extern crate rustframe;
|
|
use rustframe::frame::{Frame, RowIndex};
|
|
use rustframe::matrix::Matrix;
|
|
|
|
let data = Matrix::from_cols(vec![vec![1, 2], vec![3, 4]]);
|
|
let mut frame = Frame::new(data, vec!["X", "Y"], Some(RowIndex::Range(0..2)));
|
|
|
|
frame.add_column("Z", vec![5, 6]);
|
|
frame.rename("Y", "W");
|
|
let removed = frame.delete_column("X");
|
|
assert_eq!(removed, vec![1, 2]);
|
|
frame.sort_columns();
|
|
assert_eq!(frame.columns(), &["W", "Z"]);
|
|
```
|
|
|
|
## Aggregations
|
|
|
|
Any numeric aggregation available on `Matrix` is forwarded to `Frame`.
|
|
|
|
```rust
|
|
# extern crate rustframe;
|
|
use rustframe::frame::Frame;
|
|
use rustframe::matrix::{Matrix, SeriesOps};
|
|
|
|
let frame = Frame::new(Matrix::from_cols(vec![vec![1.0, 2.0], vec![3.0, 4.0]]), vec!["A", "B"], None);
|
|
assert_eq!(frame.sum_vertical(), vec![3.0, 7.0]);
|
|
assert_eq!(frame.sum_horizontal(), vec![4.0, 6.0]);
|
|
```
|
|
|
|
With the basics covered, continue to the [compute features](./compute.md)
|
|
chapter for statistics and analytics.
|