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} or filter()) 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.
  • 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"]})

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.1.2

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.1.2
File Size Uploaded
polars_gdx-0.1.2.tar.gz 2.3 MB Details

Built distributions (wheels)

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

Total release size: 5.2 MB

Release files / polars_gdx-0.1.2.tar.gz

Download URL polars_gdx-0.1.2.tar.gz
Size 2.3 MB
Tags Source
SHA-256 checksum
How to use checksums
ecc48a82983bf389ba1f7dcbae3994ad6d47174231b7cb9eb9d880ff4f502f44
BLAKE2b-256 checksum
How to use checksums
fd8f08ed6a7cd59f2e7c2f23d6595f49230743fb2529d3ae9b499150564539e9
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 3, 2026.

Transparency log

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

Download URL polars_gdx-0.1.2-cp39-abi3-win_amd64.whl
Size 698.2 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
cae82556b279508d0cdcc10fe906c1cd71b05a992b5406e1a92275b117a406dc
BLAKE2b-256 checksum
How to use checksums
5214e3598b1c3e6dcb05947362bce64f487a503fe715c672bc0409c2c9118785
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 3, 2026.

Transparency log

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

Download URL polars_gdx-0.1.2-cp39-abi3-manylinux_2_28_x86_64.whl
Size 584.5 kB
Tags CPython 3.9 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
7278164334da46ceda50830dfa2768422d5049f6040a526b91b1786db6bcf43f
BLAKE2b-256 checksum
How to use checksums
a4164e21515e581b72ef2f09cc40cd8acee97effdcb9c8d53b47d3c8b9502901
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 3, 2026.

Transparency log

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

Download URL polars_gdx-0.1.2-cp39-abi3-manylinux_2_28_aarch64.whl
Size 558.5 kB
Tags CPython 3.9 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
72bda91c3c170a2fc2c8711ae9dd159d33e7e2feb551549938e11bf725353987
BLAKE2b-256 checksum
How to use checksums
ca6f727f3e4e507f6a054d2201bbd13804151f0f18463229da8abb5eef4f4890
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 3, 2026.

Transparency log

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

Download URL polars_gdx-0.1.2-cp39-abi3-macosx_11_0_arm64.whl
Size 486.6 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e075c71e44f6079bbdb65ee1585d2203f95baf82f9b746cf5c0c2510a6639419
BLAKE2b-256 checksum
How to use checksums
f57fce94ea951da625c8746741fe356c843f4a216a41513bead61b49560f6868
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 3, 2026.

Transparency log

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

Download URL polars_gdx-0.1.2-cp39-abi3-macosx_10_12_x86_64.whl
Size 524.4 kB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
db8981ee28d2ca4740c9502e40de9a3f40672c2a6c45ef95b43708d9ef2f324b
BLAKE2b-256 checksum
How to use checksums
f40177f600226cb3a6751160b849a92ff707318cdf06c1a8c4e9ae9dc1ad59ee
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 3, 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

0.2.0

6 release files

0.1.3

6 release files

This release

0.1.2 This release

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