The DataFrame layer of the COOLJAPAN scientific stack just grew up — and it grew up enterprise.
Today we released PandRS 0.2.0 — a major milestone that takes our pure Rust DataFrame library from a fast pandas alternative to a production-hardened, security-first foundation, delivering all planned v1.0.0 features with the public API now frozen for v1.0.0 compatibility.
No C. No Cython. No pandas/NumPy C-extensions.
No Python GIL. No FFI surprises at deploy time.
Just clean, blazing-fast columnar data that compiles to a single static binary (or WASM) and runs the same on your laptop, in CI, and in production.
Why PandRS 0.2.0 is a game changer
For decades, “data work” in the Python world meant pandas — powerful, ubiquitous, and built on a stack of C/Cython extensions that leak through every abstraction. You get the GIL, fragile installs, silent type coercions, and KeyError surprises in production. And when you need authorization, multi-tenancy, or auditable error handling, you’re entirely on your own.
PandRS 0.2.0 closes that gap. This is the “Major Milestone — Production-Ready Enterprise Features” release, and the wins are concrete:
- ReBAC authorization built in. Relationship-Based Access Control, Google Zanzibar-style: hierarchical relationships, transitive permission resolution, multi-tenant namespace isolation, and LRU permission caching — fine-grained authz inside your data layer.
- 6,984
unwrap()calls eliminated. 100% removal from production code paths. Errors areResults, not panics, end to end. - A zero-vulnerability default build. SQL is now opt-in (security-first), database backends are split into granular features, and the default build ships with zero known vulnerabilities.
- SciRS2 integration. PandRS now plugs into the SciRS2 scientific stack via an optional
scirs2feature, putting real statistics and linear algebra a feature flag away. - 24-month LTS. The 0.2.x series gets long-term support with security updates and API stability guarantees.
And it’s still fast: 3-5x faster CSV reading than pandas, 3-4x GroupBy, 4x Join, 8-9x string operations, and up to 89% memory reduction.
Technical Deep Dive: How We Hardened a DataFrame for Production
PandRS 0.2.0 is structured in layers, each carrying its own guarantee.
-
The production-hardened error model
The headline engineering effort: 6,984unwrap()calls removed — 100% from production code paths — and replaced withResult-based error handling throughout. Nothing in a hot path panics on bad input anymore; every fallible operation hands you an error you can match on. This is the difference between a prototype and something you page on. -
ReBAC, security, and multi-tenant isolation
The new Relationship-Based Access Control layer is modeled on Google Zanzibar: you declare hierarchical relationships, the engine resolves transitive permissions, and multi-tenant namespace isolation keeps tenants cleanly separated. An LRU permission cache keeps repeated checks cheap. Authorization lives where the data lives. -
The SciRS2 statistics & linalg tier
New in 0.2.0: an optional dependency on scirs2-core / scirs2-stats / scirs2-linalg 0.3.1, gated behind thescirs2feature. Enable it and your DataFrames sit directly on the SciRS2 scientific stack — the same stack NumRS2 builds on — bringing advanced statistical routines and linear algebra to your columns without leaving pure Rust. -
Feature-flag modularity and a zero-vuln default
Security-first means optional-by-default. SQL is now disabled unless you ask for it, and database backends are split into granularsql-mysql/sql-postgres/sql-sqlitefeatures. Making MySQL out-of-default mitigates the RSA timing attack (RUSTSEC-2023-0071), andbyteswas updated for RUSTSEC-2026-0007. The result: a default build with zero known vulnerabilities, plus curated bundles (stable,test-safe,all-safe) so you opt into exactly what you need.
This release is large and thoroughly tested: 233,963 lines of Rust (186,042 code) across 635 files, 999 lib tests plus ~155 integration tests and 144 doc tests all passing with --all-features, 95%+ coverage, zero clippy warnings (-D warnings), and CI green on Linux, macOS, and Windows.
Getting Started
Install it:
cargo add pandrs
A first taste — note the production-grade error handling:
use pandrs::{DataFrame, Series};
fn main() -> pandrs::error::Result<()> {
let mut df = DataFrame::new();
df.add_column(
"city".to_string(),
Series::from_vec(vec!["Tokyo", "Osaka", "Kyoto"], Some("city")),
)?;
df.add_column(
"population".to_string(),
Series::from_vec(vec![13_960_000, 2_750_000, 1_460_000], Some("population")),
)?;
// Production-grade error handling — no panics, just Results
let big = df.filter("population > 2000000")?;
let total: f64 = df.column("population")?.sum()?;
println!("{} large cities, total population {}", big.shape().0, total);
Ok(())
}
Want the new SciRS2 statistics and linear algebra integration? Enable the feature:
cargo add pandrs --features scirs2
There are 118 production-ready example files to crib from, and 300+ pages of documentation — a ~148-page User Guide, a ~105-page pandas Migration Guide, an Enterprise Support Guide, and an LTS Policy — with 95%+ rustdoc coverage.
What’s New in 0.2.0
- Major milestone: delivers all planned v1.0.0 features; public API frozen for v1.0.0 compatibility, with a 2-release deprecation cycle.
- ReBAC authorization: Google Zanzibar-style fine-grained access control — hierarchical relationships, transitive permission resolution, multi-tenant namespace isolation, LRU permission caching.
- Security-first SQL: SQL is now optional and disabled by default; backends split into granular
sql-mysql/sql-postgres/sql-sqlitefeatures. SQL remains available as an opt-in. - 6,984
unwrap()calls eliminated: 100% removal from production code paths;Result-based error handling throughout. - SciRS2 integration: optional scirs2-core / scirs2-stats / scirs2-linalg 0.3.1 via the
scirs2feature. - Zero-vulnerability default build:
bytesupdated for RUSTSEC-2026-0007; RSA timing attack (RUSTSEC-2023-0071) mitigated by moving MySQL out of the default. - Documentation: 300+ pages — User Guide (~148 pages / 2,955 lines), pandas Migration Guide (~105 pages / 2,108 lines), Enterprise Support Guide (~31 pages), LTS Policy (~17 pages); 95%+ rustdoc coverage; 6,986+ lines of markdown docs.
- 118 production-ready example files.
- Benchmarks vs pandas: CSV reading 3-5x faster, GroupBy 3-4x, Join 4x, string operations 8-9x, up to 89% memory reduction.
- Tests: 999 lib tests + ~155 integration tests + 144 doc tests, all passing with
--all-features; 95%+ coverage; zero clippy warnings; CI on Linux/macOS/Windows. - Feature bundles:
stable,test-safe,all-safe. MSRV 1.70.0 (recommended 1.75+). - LTS: 24-month long-term support for the 0.2.x series — security updates and API stability guarantees.
- Project size: 233,963 lines of Rust (186,042 code), 244,974 total lines across 635 files.
Tips
- Turn on
scirs2for real stats.cargo add pandrs --features scirs2wires in scirs2-stats and scirs2-linalg 0.3.1 — advanced statistical and linear algebra routines on your columns, still 100% pure Rust. - Use the
stablebundle for production. It gives you a vetted, zero-vuln-default feature set without hand-picking flags; reach fortest-safeorall-safewhen you need more. - Reach for ReBAC for multi-tenant authz. If you’re serving data across tenants, the Zanzibar-style relationship model with namespace isolation lets you express fine-grained permissions natively instead of bolting on an external service.
- SQL is opt-in now — add only what you need. Want Postgres?
cargo add pandrs --features sql-postgres. Leaving SQL (and MySQL especially) out of the default keeps your build at zero known vulnerabilities. - Lean on the pandas Migration Guide. ~105 pages mapping pandas idioms to PandRS — the fastest path off pandas without relearning data manipulation from scratch.
- Pin 0.2.x for stability. With a 24-month LTS and an API frozen for v1.0.0 compatibility, staying on the 0.2.x line gets you security updates and stability guarantees with no churn. Upgrading from 0.1.0 is fully backward compatible — new features are opt-in, and you can expect a ~10-20% performance improvement across the board.
This is the foundation
PandRS is the DataFrame layer of the COOLJAPAN scientific computing stack — and as of 0.2.0 it’s wired directly into SciRS2 0.3.1, sitting alongside NumRS2 in the same pure Rust scientific ecosystem:
- SciRS2 — the scientific computing core (stats, linalg), now an optional PandRS dependency
- NumRS2 — the N-dimensional numerical foundation
- OptiRS — optimization and training loops
- OxiMedia — media and computer vision pipelines
- OxiBLAS / OxiCode / OxiARC / OxiFFT / OxiZ — pure Rust BLAS, serialization, compression, FFT, and SMT
- Plus VoiRS, TenRSo, TensorLogic, and Spintronics across the wider stack
Tabular data, statistics, and numerics — all sovereign, all panic-free in production, all one cargo add away.
Repository: https://github.com/cool-japan/pandrs
Star the repo if you want production-grade DataFrames without pandas’ C/Cython baggage, the Python GIL, or surprise panics in production.
The era of “just pip install pandas” — with all its native dependencies and silent failures — is ending.
Pure Rust data engineering is here — fast, safe, and sovereign.
— KitaSan at COOLJAPAN OÜ March 10, 2026