Skip to main content

polars-gdx

Lazy, prefiltered Polars access to GAMS GDX files — no GAMS installation required.

  • scan_gdx(path, symbol=...) returns a pl.LazyFrame; nothing is read until collect(), and column projection is pushed down via Polars' IO-source interface. read_gdx(...) is the eager convenience wrapper (scan_gdx(...).collect(), same arguments).
  • Predicates on key columns (key_filter={dim_index: allowed_labels}, filter(pl.col(key) == label) or filter(pl.col(key).is_in(labels))) are folded into a native, index-based prefilter inside the Rust read loop, so unwanted records are never materialized — unlike the official gamsapi reader, which must load everything into pandas first. The prefilter runs inside a bulk C callback (gdxDataReadRawFastEx): one FFI crossing for the whole symbol, with early termination for head(n).
  • threads=n (on scan_gdx/read_gdx) parallelises the raw read across n independent file handles: each worker scans a contiguous range of the first key dimension, results are concatenated in range order so record order matches the serial read exactly, and a first-dimension filter lets whole non-matching ranges be skipped without touching the file. Parallel scanning requires rebuilding the vendored GDX C library with its internal mutexes enabled (the default in this repo).
  • read_domains(path, symbol=...) lists the unique labels actually used per index dimension in a single bulk C scan (gdxGetDomainElements) — the cost of unique() over a key column without reading or materialising any records, valuable on very large symbols.
  • Under the hood: hand-written FFI to the vendored MIT-licensed GDX C library, extracted from lolow/gdxcomp, building on GAMS-dev/gdx.

Usage

import polars as pl
from polars_gdx import scan_gdx, list_symbols

list_symbols("trnsport.gdx").filter(pl.col("type") == "Param")

# lazy: nothing read yet
x = scan_gdx("trnsport.gdx", symbol="x")

# read only the seattle rows, skipping all others natively
x.filter(pl.col("dim_0") == "seattle").collect()

# eager convenience: read_gdx = scan_gdx(...).collect()
from polars_gdx import read_gdx
df = read_gdx("trnsport.gdx", symbol="x", key_filter={0: ["seattle"]})

# unique labels per index dimension without reading the records:
from polars_gdx import read_domains
read_domains("trnsport.gdx", symbol="x")

Label matching

Key labels (key_filter and filter(pl.col(key) == label) predicates) are matched case-insensitively (ASCII-folded), the way GAMS does — "SEATTLE" matches a stored "seattle". The labels in the produced frame always keep the file's original casing. For predicate filters whose label only differs in case from the stored one, the plugin deliberately skips the native prefilter and re-applies a case-folded predicate on the full read, because Polars' == is case-sensitive and would otherwise silently drop the rows.

File handle lifetime

scan_gdx keeps the GDX file open until the returned LazyFrame is collected and released (Polars may read the source more than once). Use read_gdx, or an explicit Reader with its close() / context-manager support, to release the handle eagerly — relevant on Windows, where an open handle locks the file.

Benchmark

vs gamsapi 54.5.0 (pandas-backed), on a 2M-record parameter (80 MB GDX); best of 5 runs. See benchmarks/bench_vs_gamsapi.py (run as a CI job on every push).

Scenario polars-gdx gamsapi (pandas)
Full read (2M rows) 0.128 s 0.086 s
filter(dim_0 == label) — 1000 of 2M rows 0.059 s 0.096 s¹
Explicit key_filter — 1000 rows 0.058 s —
head(1000) of 2M rows 0.001 s 0.101 s¹

¹ gamsapi has no lazy loading or pushdown: it must materialize the whole symbol, then filter. The advantage of polars-gdx grows with predicate selectivity; head(n)/n_rows terminates the native read after n records.

Build

maturin develop --release   # builds the vendored GDX C library + extension
pytest

Requires a C++17 compiler and CMake ≥ 3.5 at build time; runtime has no GAMS dependency.

Layout

crates/gdx-sys        # raw FFI; builds vendored GDX-dev/gdx via CMake
crates/gdx            # safe RAII wrapper (global lock; lazy UEL interning)
crates/polars-gdx     # PyO3 extension: symbol listing + Arrow streaming with prefiltering
python/polars_gdx     # Python layer: scan_gdx / list_symbols

Metadata

Release files for polars-gdx 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for polars-gdx 0.2.0
File Size Uploaded
polars_gdx-0.2.0.tar.gz 2.3 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for polars-gdx 0.2.0
File
polars_gdx-0.2.0-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details
polars_gdx-0.2.0-cp39-abi3-manylinux_2_28_x86_64.whl CPython 3.9 abi3 Linux glibc 2.28+ x86-64 Details
polars_gdx-0.2.0-cp39-abi3-manylinux_2_28_aarch64.whl CPython 3.9 abi3 Linux glibc 2.28+ ARM64 Details
polars_gdx-0.2.0-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details
polars_gdx-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details

Total release size: 5.3 MB

Release files / polars_gdx-0.2.0.tar.gz

Download URL polars_gdx-0.2.0.tar.gz
Size 2.3 MB
Tags Source
SHA-256 checksum
How to use checksums
812ab2f0f0176f7071ddb108c74e77668961be35858a301ddc58c008979d5087
BLAKE2b-256 checksum
How to use checksums
dd4181c66a96bb0abcc0bda87622f3f6f21d708c635a1eaec3b57fd026e21c7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / polars_gdx-0.2.0-cp39-abi3-win_amd64.whl

Download URL polars_gdx-0.2.0-cp39-abi3-win_amd64.whl
Size 729.7 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
d1f041edec1b72d2be82eed9695a3d013114fb4623b885f9bffddf14609e8055
BLAKE2b-256 checksum
How to use checksums
1a55cad594e92a400a39eb9df6603b55c38568664f34bd306a5de291d84e0381
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / polars_gdx-0.2.0-cp39-abi3-manylinux_2_28_x86_64.whl

Download URL polars_gdx-0.2.0-cp39-abi3-manylinux_2_28_x86_64.whl
Size 614.0 kB
Tags CPython 3.9 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
ed0d83a1c1caad0884ec4a6e166ec6b7a330dced2575b00c14511a71e18b6b27
BLAKE2b-256 checksum
How to use checksums
ec3da9bf4b9039506e5a0cf83549ba0790303a11e297585629fa914f66062167
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / polars_gdx-0.2.0-cp39-abi3-manylinux_2_28_aarch64.whl

Download URL polars_gdx-0.2.0-cp39-abi3-manylinux_2_28_aarch64.whl
Size 584.8 kB
Tags CPython 3.9 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
23551b70cb8f634c4312ab7be347c50ff54c409e1ab867af49a104a0436adda7
BLAKE2b-256 checksum
How to use checksums
14d033c68c015937fffeb792ac5f7ee9b61aadabdb5bf6f23a32cc545655b15a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / polars_gdx-0.2.0-cp39-abi3-macosx_11_0_arm64.whl

Download URL polars_gdx-0.2.0-cp39-abi3-macosx_11_0_arm64.whl
Size 511.2 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
fd2e637e99ae94e3fc0fd453ff8e58f2810786ea228238b26031b9ebb70ff134
BLAKE2b-256 checksum
How to use checksums
e0b546ecff11c8593e152c75829e9cbd75abac4c10e28b0f0d8c3d0f446b957b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / polars_gdx-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl

Download URL polars_gdx-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl
Size 552.8 kB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
4a6d66c582ae89e2c24b34cd5cb31614224dbd2160aae08134786a44ab48247d
BLAKE2b-256 checksum
How to use checksums
76676b0078863cd6dd7e4e5fb5502b15c0f5757b465697136015b8f9885a2151
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release history Release notifications | RSS feed

0.6.0

6 release files

0.5.0

6 release files

0.4.0

6 release files

0.3.1

6 release files

0.3.0

6 release files

This release

0.2.0 This release

6 release files

0.1.3

6 release files

0.1.2

6 release files

0.1.1

6 release files

0.1.0

6 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page