diff --git a/Cargo.lock b/Cargo.lock
index b4197c3..edbbd32 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -431,6 +431,12 @@ version = "1.0.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
+[[package]]
+name = "foldhash"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
+
 [[package]]
 name = "getrandom"
 version = "0.2.15"
@@ -468,6 +474,19 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "hashbrown"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
+dependencies = [
+ "allocator-api2",
+ "equivalent",
+ "foldhash",
+ "rayon",
+ "serde",
+]
+
 [[package]]
 name = "heck"
 version = "0.5.0"
@@ -626,6 +645,16 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "matrixmultiply"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a"
+dependencies = [
+ "autocfg",
+ "rawpointer",
+]
+
 [[package]]
 name = "memchr"
 version = "2.7.4"
@@ -685,6 +714,21 @@ dependencies = [
  "target-features",
 ]
 
+[[package]]
+name = "ndarray"
+version = "0.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841"
+dependencies = [
+ "matrixmultiply",
+ "num-complex",
+ "num-integer",
+ "num-traits",
+ "portable-atomic",
+ "portable-atomic-util",
+ "rawpointer",
+]
+
 [[package]]
 name = "nom"
 version = "7.1.3"
@@ -713,12 +757,30 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "num-complex"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
+dependencies = [
+ "num-traits",
+]
+
 [[package]]
 name = "num-conv"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
 
+[[package]]
+name = "num-integer"
+version = "0.1.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+dependencies = [
+ "num-traits",
+]
+
 [[package]]
 name = "num-traits"
 version = "0.2.19"
@@ -849,6 +911,7 @@ name = "plotlars"
 version = "0.5.0"
 dependencies = [
  "bon",
+ "ndarray",
  "plotly",
  "polars",
  "serde",
@@ -887,8 +950,7 @@ dependencies = [
 [[package]]
 name = "polars"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e248cf2f0069277f8fe80d413cfb9240c7dd1cfa382b5674c1b4afa57222747"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "getrandom",
  "polars-arrow",
@@ -907,8 +969,7 @@ dependencies = [
 [[package]]
 name = "polars-arrow"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2981d5b2f34c84069a39fceca0d36dffeb97db8cadba101e7ea6605c8d42294d"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "ahash",
  "atoi",
@@ -921,7 +982,7 @@ dependencies = [
  "ethnum",
  "fast-float",
  "getrandom",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.0",
  "itoa",
  "itoap",
  "lz4",
@@ -953,8 +1014,7 @@ dependencies = [
 [[package]]
 name = "polars-compute"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a97b2a5c9b880ab7e52553c40a336fdb6e3244bf896b4d4917700defe8085d5"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "bytemuck",
  "either",
@@ -969,8 +1029,7 @@ dependencies = [
 [[package]]
 name = "polars-core"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5bc2cadcca904a9dc4d2c2b437c346712806e9a678bf17c7e94ebf622faae76"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "ahash",
  "bitflags",
@@ -980,6 +1039,7 @@ dependencies = [
  "comfy-table",
  "either",
  "hashbrown 0.14.5",
+ "hashbrown 0.15.0",
  "indexmap 2.5.0",
  "num-traits",
  "once_cell",
@@ -1001,8 +1061,7 @@ dependencies = [
 [[package]]
 name = "polars-error"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56b0a8eb9b1e56a4640de6887d613cb4de73c4e09d491f3b779855d4c3bcb9ba"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "polars-arrow-format",
  "regex",
@@ -1013,8 +1072,7 @@ dependencies = [
 [[package]]
 name = "polars-expr"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34e9c0e8c7ba93aac64051b92dc68eac5a0e9543cf44ca784467db2c035821fe"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "ahash",
  "bitflags",
@@ -1033,8 +1091,7 @@ dependencies = [
 [[package]]
 name = "polars-io"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "454ebbebe1cb8cb4768adca44b8fc9431abc3c91d5927f6824e73f916bced911"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "ahash",
  "atoi_simd",
@@ -1042,7 +1099,7 @@ dependencies = [
  "chrono",
  "fast-float",
  "glob",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.0",
  "home",
  "itoa",
  "memchr",
@@ -1065,8 +1122,7 @@ dependencies = [
 [[package]]
 name = "polars-lazy"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e61c062e833d2376de0a4cf745504449215cbf499cea293cb592e674ffb39ca"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "ahash",
  "bitflags",
@@ -1089,8 +1145,7 @@ dependencies = [
 [[package]]
 name = "polars-mem-engine"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0643812829cc990e1533a5bf48c21a1b3eaa46aabf2967b0f53f99097cbc74c"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "memmap2",
  "polars-arrow",
@@ -1108,8 +1163,7 @@ dependencies = [
 [[package]]
 name = "polars-ops"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ac14a136d87bea798f3db51d5987556deb2293da34bfc8b105ebffa05f6e810"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "ahash",
  "argminmax",
@@ -1118,7 +1172,7 @@ dependencies = [
  "chrono",
  "chrono-tz",
  "either",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.0",
  "hex",
  "indexmap 2.5.0",
  "memchr",
@@ -1138,14 +1192,13 @@ dependencies = [
 [[package]]
 name = "polars-parquet"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "491f5af321169259d5b1294c9fe8ed89faaeac34b4dec4abcedc0d1b3d11013a"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "ahash",
  "base64",
  "bytemuck",
  "ethnum",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.0",
  "num-traits",
  "parquet-format-safe",
  "polars-arrow",
@@ -1159,13 +1212,12 @@ dependencies = [
 [[package]]
 name = "polars-pipe"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29215c31f599295cc0f803c42fc812cc518db6d5ed4d6c7cc03daf3976a0add5"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "crossbeam-channel",
  "crossbeam-queue",
  "enum_dispatch",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.0",
  "num-traits",
  "polars-arrow",
  "polars-compute",
@@ -1184,8 +1236,7 @@ dependencies = [
 [[package]]
 name = "polars-plan"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3f728df4bc643492a2057a0a125c7e550cbcfe35b391444653ad294be9ab190"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "ahash",
  "bitflags",
@@ -1194,7 +1245,7 @@ dependencies = [
  "chrono",
  "chrono-tz",
  "either",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.0",
  "memmap2",
  "once_cell",
  "percent-encoding",
@@ -1214,8 +1265,7 @@ dependencies = [
 [[package]]
 name = "polars-row"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4eb931f0929ca7498b3ed5056357d2d364cad42cce95383a7e3983dbceb4bed1"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "bytemuck",
  "polars-arrow",
@@ -1226,8 +1276,7 @@ dependencies = [
 [[package]]
 name = "polars-schema"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c7e1234b942d3244024ecbac9c7f5a48a52a815f8ca4b9d075fbba16afb1a39"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "indexmap 2.5.0",
  "polars-error",
@@ -1238,8 +1287,7 @@ dependencies = [
 [[package]]
 name = "polars-sql"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce52bfd2ef1e2e18ac26d7d7ea3f9132b199cff06d975156703fa5badcfae187"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "hex",
  "once_cell",
@@ -1260,8 +1308,7 @@ dependencies = [
 [[package]]
 name = "polars-time"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9925ab75e1d859ae2283ca09d7683198b0b9ff5afecd03f2c9180f3e36e35056"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "atoi",
  "bytemuck",
@@ -1280,14 +1327,13 @@ dependencies = [
 [[package]]
 name = "polars-utils"
 version = "0.43.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b44846e1fc6ae1dfdc7f65a37af7d270d0a6a17a58fff76716561f5b887a8ad7"
+source = "git+https://github.com/pola-rs/polars?rev=1fa409c6c903c82a7265527c08a0683e2c2a3083#1fa409c6c903c82a7265527c08a0683e2c2a3083"
 dependencies = [
  "ahash",
  "bytemuck",
  "bytes",
  "compact_str",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.0",
  "indexmap 2.5.0",
  "libc",
  "memmap2",
@@ -1301,6 +1347,21 @@ dependencies = [
  "version_check",
 ]
 
+[[package]]
+name = "portable-atomic"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2"
+
+[[package]]
+name = "portable-atomic-util"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcdd8420072e66d54a407b3316991fe946ce3ab1083a7f575b2463866624704d"
+dependencies = [
+ "portable-atomic",
+]
+
 [[package]]
 name = "powerfmt"
 version = "0.2.0"
@@ -1392,6 +1453,12 @@ dependencies = [
  "bitflags",
 ]
 
+[[package]]
+name = "rawpointer"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
+
 [[package]]
 name = "rayon"
 version = "1.10.0"
diff --git a/Cargo.toml b/Cargo.toml
index d13e51f..e0d63a5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,8 +15,9 @@ categories = ["visualization"]
 
 [dependencies]
 bon = "2.3.0"
+ndarray = "0.16.1"
 plotly = "0.10.0"
-polars = { version = "0.43.1", features = [
+polars = { git = "https://github.com/pola-rs/polars", rev = "1fa409c6c903c82a7265527c08a0683e2c2a3083", features = [
     "dtype-categorical",
     "lazy",
     "strings",