Symmetric roll-up on both axes
Rows and columns are dimensions that group, subtotal, expand, and collapse the same way. Pivot a year column into quarter → month; collapse a region → country → city row hierarchy — both are first-class.
Symmetric roll-up on both axes
Rows and columns are dimensions that group, subtotal, expand, and collapse the same way. Pivot a year column into quarter → month; collapse a region → country → city row hierarchy — both are first-class.
Aggregations from trivial to heavy
Built-ins (sum / mean / min / max / count / median / std…), arbitrary Python callables, and a safe formula DSL for calculated measures (margin = profit / revenue, weighted averages, ratios).
Drill-through & editing
From any aggregated cell, retrieve the underlying source rows — then edit them inline with server-validated write-back that recomputes every aggregate.
One engine, every framework
A byte-for-byte Polars engine (Python) with a parity-verified TypeScript port powering React, Vue, and zero-dependency vanilla adapters — plus a plug-and-play Dash component.
Agnostic ingestion
Drop in a Polars DataFrame/LazyFrame, a pandas DataFrame, a list[dict], or a JSON string — normalised once, zero reshaping.
The frontend does zero math
All aggregation happens in the engine. The frontend owns view state (what’s expanded); the backend owns data (what the values are). Correct sorting, exact money, NaN/Inf handled deliberately.
Dash (Python)
TensorGrid(id=..., data=df, rows=[...], columns=[...], measures=[...]) and a single callback for server-side modes. Get started →
React / Vue / Vanilla
@tensorgrid/react, @tensorgrid/vue, and a zero-dependency @tensorgrid/vanilla. Get started →