rust-dataframe
App Archived
A Rust DataFrame implementation, built on Apache Arrow
- Downloads
- Not measured
- Dependents
- Not applicable
- Stars
- 280
- Forks
- 18
- Contributors
- 4
- Commits
- 119
Why Archived
GitHub reports the repository as archived.
Exact rules: Instant archive. The check on applied thresholds version 9.
Every rule outcome, as the check records it
instant-archive: repository is archived
About
A dataframe implementation in Rust, powered by Apache Arrow.
What is a dataframe?
A dataframe is a 2-dimensional tabular data structure that is often used for computations and other data transformations. A dataframe often has columns of the same data type, similar to a SQL table.
Functionality
This project is inspired by Pandas and other dataframe libraries, but specifically currently borrows functions from Apache Spark.
It mainly focuses on computation, and aims to include:
- Scalar functions
- Aggregate function
- Window functions
- Array functions
As a point of reference, we use Apache Spark Python functions for function parity, and aim to be compatible with Apache Spark functions.
Eager vs Lazy Evaluation
The initial experiments of this project were to see if it's possible to create some form of dataframe. We're happy that this condition is met, however the initial version relied on eager evaluation, which would make it difficult to use in a REPL fashion, and make it slow.
Read the full README
We are mainly focusing on creating a process for lazy evaluation (the current LazyFrame), which involves reading an input's schema, then applying transformations on that schema until a materialising action is required.
While still figuring this out, there might not be much progress on the surface, as most of this exercise is happening offline.
The plan is to provide a reasonable API for lazily transforming data, and the ability to apply some optimisations on the computation graph (e.g. predicate pushdown, rearranging computations).
In the future, LazyFrame will probably be renamed to DataFrame, and the current DataFrame with eager evaluation removed/made private.
The ongoing experiments on lazy evaluation are in the master branch, and we would appreciate some help ๐๐พ.
Non-Goals
Although we use Apache Spark as a reference, we do not intend on supporting distributed computation beyond a single machine.
Spark is a convenience to reduce bikeshedding, but we will probably provide a more Rust idiomatic API in future.
Status
A low-level API can already be used for simple tasks that do not require aggregations, joins or sorts. A simpler API is currently not a priority until we have more capabilities to transform data.
One good potential immediate use of the library would be copying data from one supported data source to another (e.g. PostgreSQL to Arrow or CSV with minimal transformations).
Roadmap
- [ ] Lazy evaluation (H1 2020)
- [ ] Aggregations
- [ ] Joins
- [ ] Sorting
- [ ] Adding compute
fns (H1 2020) - [ ] Bindings to other languages (H2 2020)
IO
We are working on IO support, with priority for SQL read and write. PostgreSQL IO is supported using the binary protocol, although not all data types are supported (lists, structs, numeric, and a few other non-primitive types)
- IO Support
- [X] CSV
- [X] Read
- [X] Write
- [ ] JSON
- [X] Read
- [ ] Write
- [X] Arrow IPC
- [X] Read File
- [X] Write FIle
- [ ] Parquet
- [ ] Read File
- [ ] Write File
- [ ] SQL (part of an effort to create generic DB traits)
- [X] PostgreSQL (Primitive and temporal types supported, PRs welcome for other types)
- [X] Read
- [X] Write
- [ ] MSSQL (using tiberius)
- [ ] Read
- [ ] Write
- [ ] MySQL
- [ ] Read
- [ ] Write
- [X] PostgreSQL (Primitive and temporal types supported, PRs welcome for other types)
- [X] CSV
Functionality
DataFrame Operations
- [X] Select single column
- [X] Select subset of columns, drop columns
- [X] Add or remove columns
- [X] Rename columns
- [X] Create dataframe from record batches (a
Vec<RecordBatch>as well as an iterator) - [ ] Sort dataframes
- [ ] Grouped operations
- [ ] Filter dataframes
- [ ] Join dataframes
Scalar Functions
- [X] Trig functions (sin, cos, tan, asin, asinh, ...) (using the
numcrate where possible) - [X] Basic arithmetic (add, mul, divide, subtract) Implemented from Arrow
- [ ] Date/Time functions
- [ ] String functions
- [-] Basic string manipulation
- [ ] Regular expressions (leveraging
regex) - [ ] Casting to and from strings (using Arrow compute's
castkernel)
- [ ] Crypto/hash functions (md5, crc32, sha{x}, ...)
- [ ] Other functions (that we haven't classified)
- [X] Trig functions (sin, cos, tan, asin, asinh, ...) (using the
Aggregate Functions
- [X] Sum, max, min
- [X] Count
- [ ] Statistical aggregations (mean, mode, median, stddev, ...)
Window Functions
- [ ] Lead, lag
- [ ] Rank, percent rank
- [ ] Other
Array Functions
- [ ] Compatibility with Spark 2.4 functions
- [ ] Compatibility with Spark 3.0 functions
Performance
We plan on providing simple benchmarks in the near future. The current blockers are:
- [ ] IO
- [X] Text format (CSV)
- [X] Binary format (Arrow IPC)
- [ ] SQL
- [-] Lazy operations
- [ ] Aggregation
- [ ] Joins
Compatibility
- License
- Apache-2.0
- Crate facts
- Not measured
- Runs on, Native code and Python bindings read crates on crates.io. This entry lists no crate.
Compare with similar projects
Order: strongest tier first, then most downloads, then name, with unmeasured values last. A library counts downloads over 30 days. An app counts binary downloads per release. An app with none counts its crate downloads over 30 days. ML Rust runs this catalogue, so its closest project always gets a row.
| Project | Downloads | Dependents | Stars | Latest release | Runs on (GPU) | Native code | License |
|---|---|---|---|---|---|---|---|
|
A Rust DataFrame implementation, built on Apache Arrow |
Not measured | Not applicable | 280 | Not measured | Not measured | Not measured | Apache-2.0 |
|
arrow-rs Featured
Rust implementation of Apache Arrow Python bindings |
10,746,755 downloads over 30 days | 2,126 | 3,664 | 60.1.0 | GPU support unknown | Binds native code: ring (feature encryption), liblzma-sys (feature default), zstd-sys (feature default) | Apache-2.0 |
|
datafusion Featured
DataFusion is an in-memory query engine that uses Apache Arrow as the memory model |
2,992,524 downloads over 30 days | 484 | 9,578 | 55.2.0 | GPU support unknown | Binds native code: libmimalloc-sys, liblzma-sys (feature compression), zstd-sys (feature compression) | Apache-2.0 |
|
polars Featured
DataFrame library based on Apache Arrow Python bindings |
1,729,523 downloads over 30 days | 639 | 40,285 | 0.55.2 | GPU support unknown | Binds native code: zstd-sys (feature decompress) | MIT |
|
delta-rs Featured
Native Delta Lake implementation in Rust |
463,085 downloads over 30 days | 33 | 3,356 | 1.1.4 | GPU support unknown | Binds native code: lz4-sys (feature delta-cache), zstd-sys (feature delta-cache) | Apache-2.0 |
|
dlpark Listed
Pure Rust DLPack implementation for zero-copy tensor interoperability Python bindings |
68,157 downloads over 30 days | 5 | 66 | 0.10.0 | CUDA | No native code found | Apache-2.0 |
|
Model conversion and quantization with no Python: reads SafeTensors, GGUF, TCF and PyTorch state dicts, writes SafeTensors, GGUF and TCF, and quantizes to Q2_K through Q8_0 and IQ4 formats, including Q4_K_M mixes. GPTQ, AWQ, NF4, FP8, EXL2 and ONNX input are not implemented. Python bindings |
23 downloads over 30 days | Not applicable | 0 | 0.2.1 | GPU support unknown | No native code found | Apache-2.0 |
Measurements and sources
Each signal row shows the raw value, its source and the fetch date. The Sources list gathers every distinct source on this page. Movement needs more history.
Sources4 sources
- Description: the GitHub repository description
- GitHub repository, fetched
- GitHub releases, fetched
- GitHub contributors, fetched
AdoptionNot measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Active dependents | Not measured | Yes | ||
| New dependents (365 days) | Not measured | Yes | ||
| Peak active dependents | Not measured | Yes | ||
| Active dependents as a share of the peak | Not measured | Yes | ||
| Binary downloads per release | Not measured | Yes |
MaintenanceLatest human commit: 6 years ago8 not measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Latest human commit | 2020-10-26 | GitHub repository | Yes | |
| Latest release | Not measured | Yes | ||
| First release | Not measured | Yes | ||
| Latest version | Not measured | Yes | ||
| Days the oldest outside issue waits for a reply | 0 | GitHub repository | Yes | |
| Maintainer replies over 365 days | 0 | GitHub repository | Yes | |
| Repository archived | true | GitHub repository | Yes | |
| Repository gone | false | GitHub repository | Yes | |
| Release commit or manifest in the repo | Not measured | Yes | ||
| Published docs | Not measured | Yes | ||
| Latest release fails cargo check | Not measured | Yes | ||
| Build check date | Not measured | Yes | ||
| Build check toolchain | Not measured | Yes |
SecurityNot measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Unpatched vulnerabilities past the grace window | Not measured | Yes | ||
| RustSec unmaintained advisory | Not measured | Yes | ||
| Deprecation notice | Not measured | Yes | ||
| Deprecated requirement | Not measured | Yes |
Distribution0 binary downloads over the last 3 releases10 not measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| Releases | Not measured | Yes | ||
| Downloads over 30 days | Not measured | Yes | ||
| Binary downloads over the last 3 releases | 0 | GitHub releases | Yes | |
| Homebrew installs on request over 365 days | Not measured | Yes | ||
| Repology repository families | Not measured | Yes | ||
| Docker pull growth over 90 days | Not measured | Yes | ||
| Docker pulls at the growth baseline | Not measured | Yes | ||
| Every version a prerelease | Not measured | Yes | ||
| Every version 0.0.x | Not measured | Yes | ||
| Every version yanked | Not measured | Yes | ||
| Crate deleted from crates.io | Not measured | Yes |
Repository280 stars, 18 forks, 4 contributors, 119 commits. Stars alone never qualify a project.1 not measured
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| GitHub stars | 280 | GitHub repository | Yes โ one part of the repository route | |
| GitHub forks | 18 | GitHub repository | Yes โ one part of the repository route | |
| Contributors with a GitHub account | 4 | GitHub contributors | Yes โ one part of the repository route | |
| Commits on the default branch | 119 | GitHub repository | No | |
| Repository's main crate left out of the entry | Not measured | Yes |
Facts that never count
| Signal | Value | Source | Fetched | Counts |
|---|---|---|---|---|
| License | Apache-2.0 | GitHub repository | No | |
| Runs on, from listed crates and their direct dependencies | Not measured | No | ||
| What shows each backend | Not measured | No | ||
| Native code, from listed crates and their dependencies | Not measured | No | ||
| Python bindings, from direct dependencies of listed crates | Not measured | No | ||
| Crates that depend on a listed crate directly | Not measured | No |
Corrections and review history
No correction applies to this entry.
Judgments
A judgment enters only through an approved issue and a merged pull request.
No judgment applies to this entry.