Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
620e724
fix(python): Allow `DataTypeExpr` in `pl.lit()` (#26740)
Kevin-Patyk Mar 13, 2026
3ee3f1b
fix: Fix panic on lazy concat->filter->slice with CSPE (#26907)
nameexhaustion Mar 13, 2026
c5825d6
docs: Query Profiler addition to User Guide (#26623)
TNieuwdorp Mar 16, 2026
1a6e6b9
build(rust): Bump up numpy and pyo3 to 0.28 (#26743)
florianvazelle Mar 16, 2026
2b825ad
fix: Propagate null in `min_by` / `max_by` for all-null by groups (#2…
gautamvarmadatla Mar 16, 2026
b38f5a7
fix: Fix error passing `Series` of dates to business functions (#26927)
nameexhaustion Mar 16, 2026
2e83690
test(python): Set stricter `maintain_order` in `test_schema_row_index…
dsprenkels Mar 16, 2026
72a083f
fix: Default engine as streaming for `collect_batches` (#26932)
nameexhaustion Mar 16, 2026
106bd21
fix: Fix the loop bounds in `BitmapBuilder::extend_each_repeated_from…
dsprenkels Mar 16, 2026
a13b8c9
fix(python): Fix `search_sorted` typing when used with `list[float]` …
gab23r Mar 17, 2026
910644f
fix: Fix panic on upsample() with group_by parameter on empty DataFra…
Kevin-Patyk Mar 17, 2026
cbad9d6
build: Bump lz4_flex from 0.12.0 to 0.12.1 (#26940)
dependabot[bot] Mar 17, 2026
3dad3f0
fix: Fix ColumnNotFound due to projection between filter/cache in CSP…
nameexhaustion Mar 17, 2026
79a5333
fix: Follow-up on streaming range-join PR (#26944)
dsprenkels Mar 17, 2026
3f96e7f
feat: Support casting Duration to String in ISO 8601 format (#26860)
kanenorman Mar 18, 2026
c14c58b
perf: Optimize `.replace()` from a single value (#26948)
Kevin-Patyk Mar 18, 2026
b448902
feat: Support Decimal32/64 in scan_parquet (#26941)
tmimmanuel Mar 18, 2026
1128e2b
fix: Preserve height when unnesting empty struct columns (#26947)
moktamd Mar 18, 2026
2f06807
feat: Support Delta deletion vectors in `scan_delta` (#26867)
kdn36 Mar 18, 2026
91a532b
perf: Drop unused filter column above cache (#26955)
nameexhaustion Mar 18, 2026
7b2c704
perf: Native streaming `forward_fill` (#26922)
coastalwhite Mar 18, 2026
e264a11
feat: Error if PartitionBy path provider returns absolute path that d…
nameexhaustion Mar 18, 2026
1bd62eb
feat: Truncate large binary/utf8 Parquet statistics values (#26764)
jonasdedden Mar 18, 2026
5a30568
feat(python): Raise ChronoFormatWarning when using `%f` time format s…
yuuuxt Mar 18, 2026
cebe499
fix: Raise for duplicate columns in `over()` (#26968)
0xRozier Mar 19, 2026
6eaca5a
perf: Streaming native `backward_fill` (#26967)
coastalwhite Mar 19, 2026
4c4c029
perf: Lower `index_of` to streaming engine (#26923)
coastalwhite Mar 19, 2026
7fc9f18
chore: Polars version (#26971)
ritchie46 Mar 19, 2026
175208e
feat: Use UUIDv7 for sink_iceberg directory name generation (#26958)
nameexhaustion Mar 19, 2026
b6ae115
fix: Informative error for multi-quantile in `group_by` (#26957)
gautamvarmadatla Mar 19, 2026
89f351c
docs(python): Fix formatting of unstable warning for write/sink_ipc r…
ohmdelta Mar 20, 2026
c46e013
fix: Validate fraction is between `0.0` and `1.0` in `list.sample` (#…
Kevin-Patyk Mar 20, 2026
f7c5781
fix: Raise error instead of panic for unsupported pivot aggregate (#2…
RenzoMXD Mar 20, 2026
5326086
chore: Polars versions (#26980)
ritchie46 Mar 20, 2026
99bc55d
refactor: Remove indirection in calling python scans (#26981)
ritchie46 Mar 20, 2026
cd9de5d
refactor(rust): Replace `clippy::never_loop` with break on named scop…
nameexhaustion Mar 20, 2026
33939c4
docs(python): Improve `write_parquet` docstring for `use_pyarrow` (#2…
0xRozier Mar 23, 2026
a26b99c
fix(python): Ensure `sample()` respects the global set seed (#26992)
Kevin-Patyk Mar 23, 2026
5cd4ba6
chore: Fix CI by excluding missing wheel version of pyiceberg (#27001)
orlp Mar 23, 2026
218f75e
chore: Enable hypothesis tests when `POLARS_AUTO_NEW_STREAMING=1` (#2…
dsprenkels Mar 23, 2026
31b9302
refactor(rust): Naming for named scopes (#26999)
nameexhaustion Mar 23, 2026
081a591
fix: Implement `agg_arg_min`/`agg_arg_max` for `boolean` data type (#…
azimafroozeh Mar 23, 2026
2a00f86
fix: Correct suggestion in multi-expr filter error (#27003)
orlp Mar 23, 2026
5ee71f3
fix: Infer nulls when df create from empty-struct (#26991)
debnathshoham Mar 23, 2026
a8b27b8
perf: Drop `maintain_order=True` requirement in `sink_delta` (#27007)
kdn36 Mar 24, 2026
9cc61b4
fix: Don't remove `set_sorted` in projection pushdown (#27006)
coastalwhite Mar 24, 2026
74bf8b9
docs: Change Polars Cloud API to 0.6.0 (#27005)
TNieuwdorp Mar 24, 2026
94a6dc1
fix: Covariance with constant is zero, not NaN (#27015)
orlp Mar 24, 2026
e8b5023
fix: Fix repeated word typos in comments (#26917)
yangsong97 Mar 24, 2026
537fcd8
chore: Really do not install pyiceberg-core 0.9.0 (#27017)
dsprenkels Mar 24, 2026
4cd2447
fix(rust): Fix initial MutableBooleanArray::extend_constant(count, No…
xenzh Mar 24, 2026
711a87e
fix: Make `pl.DataFrame.fill_null` work on columns with `Null` dtype …
gab23r Mar 24, 2026
4ee5ee1
fix: Resolve stack overflow on `merge_sorted` and `union` (#27018)
kdn36 Mar 24, 2026
12791d4
chore: Missing `src/` subdirectory to CI Python docs step (#27025)
carnarez Mar 24, 2026
4a25cac
perf: Collapse consecutive Sort nodes (#26965)
dsprenkels Mar 24, 2026
7b69a19
fix: Set sorted flag for Boolean and Time (#27035)
coastalwhite Mar 25, 2026
3ac8d87
perf: Ensure Expr.append is lowered in streaming engine (#27022)
orlp Mar 25, 2026
dbb2903
fix: Prevent panic in `transpose()` with mixed List and non-List colu…
Kevin-Patyk Mar 25, 2026
b0f974c
perf: Add sorted-unique node to streaming engine (#26990)
coastalwhite Mar 25, 2026
8c7fcc0
fix: Panic in streaming MergeSortedNode (#27024)
orlp Mar 25, 2026
a441a9a
fix: Null count for aggregated list inside count aggregation (#27032)
NeejWeej Mar 25, 2026
019d66f
fix: Make `test_group_by_arg_max_boolean_26978` non-flaky for `max_by…
azimafroozeh Mar 25, 2026
777245e
chore: Pin maturin due to compile time regression (#27062)
orlp Mar 26, 2026
85d7d38
feat(python): Make unnest() effective on all columns by default (#27029)
gab23r Mar 26, 2026
0f3a1d5
perf: Streaming `cov` and `corr` (#27008)
coastalwhite Mar 26, 2026
95691e9
fix: Regression in replace_strict for enums (#27066)
orlp Mar 27, 2026
3e16e78
refactor: Add sinked paths callback (#26995)
nameexhaustion Mar 27, 2026
7335a6c
perf: Streaming is_first_distinct and unique(maintain_order=True) (#2…
orlp Mar 27, 2026
dd821ae
fix: Ensure SQL `COUNT(<lit>)` expressions return the correct value (…
alexander-beedie Mar 30, 2026
e3d880a
fix: Reject invalid input to `sql_expr` (#27084)
alexander-beedie Mar 30, 2026
0f9aee0
test(python): Add explicit `ResourceWarning` coverage (#27083)
alexander-beedie Mar 30, 2026
052d4b8
docs(python): Normalise `Series` docstring whitespace indents (#27082)
alexander-beedie Mar 30, 2026
b920d23
docs(python): Add missing docstrings for Expr.struct.__getitem__ and …
cyh7789 Mar 30, 2026
b535c62
chore(python): Improve internal typing ahead of using `ty` / `pyrefly…
MarcoGorelli Mar 30, 2026
0a5a8a0
perf: Take into account size per row in join sampling (#27098)
orlp Mar 30, 2026
89b1646
fix: Preserve casts for horizontal ops with untyped literals (#27011)
abhidotsh Mar 31, 2026
4cbbdfa
docs: Put first-time contribution requirements in its own linkable se…
orlp Mar 31, 2026
58a8364
fix: Ignore `ddof` parameter in `rolling_corr` and deprecate (#27104)
Kevin-Patyk Mar 31, 2026
8bdbabb
fix: Apply scalar bound in `clip` when the Series bound contains null…
gautamvarmadatla Mar 31, 2026
e7b9616
refactor(rust): Add memory usage tracking to global allocator (#27103)
orlp Mar 31, 2026
67d0022
feat(python): Change default scan/read_lines column name from "lines"…
nameexhaustion Mar 31, 2026
bedd896
docs: Make the files used in docs available locally (#27121)
TNieuwdorp Mar 31, 2026
264dc83
perf: Use delta stats for mixed hive and non-hive predicate pushdown …
kdn36 Mar 31, 2026
659815c
fix: Fix incorrect IO metrics on multi-phase streaming execution (#27…
nameexhaustion Mar 31, 2026
21b24fc
perf: Remove unused expression sorts (#27075)
nameexhaustion Apr 1, 2026
bdb989d
chore(python): Add None & Dataframe to FrameInitTypes (#27126)
dpinol Apr 1, 2026
a4d366f
fix(python): Address a potential overflow in `from_epoch` scaling (#2…
alexander-beedie Apr 1, 2026
c05981b
chore(python): Make internal typing more precise (part ii) (#27117)
MarcoGorelli Apr 1, 2026
c508c56
refactor: Simplify pyarrow scan and process in batches (#26982)
ritchie46 Apr 1, 2026
27694e4
fix: Skip extension types for min/max in describe (#27120)
orlp Apr 1, 2026
a15b6d9
fix: Output SVG if output_path ends with '.svg' in show_graph (#27144)
orlp Apr 1, 2026
67422be
chore: Update nightly Rust compiler version (#27145)
Kevin-Patyk Apr 1, 2026
a06064c
feat: Allow `group_by()` without key exprs (#27141)
nameexhaustion Apr 2, 2026
8b986c7
feat: add HF Storage Bucket support via OpenDAL
davanstrien Apr 2, 2026
be12ff8
chore: switch opendal deps from local path to kszucs/opendal fork
davanstrien Apr 7, 2026
ae14881
ci: add wheel build workflow with hf feature
davanstrien Apr 7, 2026
99d763c
chore: switch opendal deps from kszucs fork to apache/opendal main
davanstrien Apr 14, 2026
1d215fe
chore: switch opendal deps to released 0.56.0
davanstrien May 6, 2026
2807339
fix: bump recursion_limit for hf feature
davanstrien May 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/issue-labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ A-panic:
A-plugin:
- '/plugin/i'
A-sql:
- '/\bsql\b|sqlcontext/i'
- '/\bsql\b|sql_expr|sqlcontext/i'
A-selectors:
- '/selector/i'
A-streaming:
Expand Down
173 changes: 173 additions & 0 deletions .github/workflows/build-hf-sink-wheels.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
name: Build HF Sink Wheels

on:
workflow_dispatch:
inputs:
dry-run:
description: Build with minimal optimization (faster, for testing)
type: boolean
default: false

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
PYTHON_VERSION: '3.10'
CARGO_INCREMENTAL: 0
CARGO_NET_RETRY: 10
RUSTUP_MAX_RETRIES: 10
# CPU features for x86_64 (modern CPUs with AVX2)
NONCOMPAT_TUNE_CPU: 'skylake'
NONCOMPAT_FEATURES: '+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt,+cmpxchg16b,+avx,+avx2,+fma,+bmi1,+bmi2,+lzcnt,+pclmulqdq,+movbe'
NONCOMPAT_CC_FEATURES: '-msse3 -mssse3 -msse4.1 -msse4.2 -mpopcnt -mcx16 -mavx -mavx2 -mfma -mbmi -mbmi2 -mlzcnt -mpclmul -mmovbe'

defaults:
run:
shell: bash

jobs:
# Build the base polars Python package (pure Python wrapper)
base-package:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}

- name: Install uv
run: pip install uv

- name: Build base package
run: uv build py-polars --out-dir dist

- name: Upload base package
uses: actions/upload-artifact@v4
with:
name: base-package
path: dist

# Build Linux x64 wheel
build-wheel-linux-x64:
needs: [base-package]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Download base package
uses: actions/download-artifact@v4
with:
name: base-package
path: dist

# Avoid potential out-of-memory errors during compilation
- name: Set swap space
uses: pierotofy/set-swap-space@master
with:
swap-size-gb: 10

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}

- name: Install base polars package
run: |
pip install --force-reinstall --no-dependencies dist/polars-*.whl
rm -rf dist/*

- name: Set RUSTFLAGS for x86-64
run: |
echo "RUSTFLAGS=-C target-feature=$NONCOMPAT_FEATURES -Z tune-cpu=$NONCOMPAT_TUNE_CPU" >> $GITHUB_ENV
echo "CFLAGS=$NONCOMPAT_CC_FEATURES -mtune=$NONCOMPAT_TUNE_CPU" >> $GITHUB_ENV

- name: Build wheel
uses: PyO3/maturin-action@v1
with:
command: build
target: x86_64-unknown-linux-gnu
args: >
--profile ${{ inputs.dry-run == true && 'mindebug-dev' || 'dist-release' }}
--manifest-path py-polars/runtime/polars-runtime-32/Cargo.toml
--features hf
--out dist
manylinux: auto
maturin-version: 1.8.3

- name: Test wheel
run: |
pip install --force-reinstall --verbose dist/*.whl
python -c 'import polars; polars.show_versions()'
# Quick sanity check for HF sink feature
python -c 'import polars as pl; df = pl.DataFrame({"a": [1,2,3]}); print("Polars loaded OK")'

- name: Upload wheel
uses: actions/upload-artifact@v4
with:
name: wheel-linux-x64
path: dist/*.whl

# Build Linux ARM64 wheel
build-wheel-linux-arm64:
needs: [base-package]
runs-on: ubuntu-24.04-arm
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Download base package
uses: actions/download-artifact@v4
with:
name: base-package
path: dist

# Avoid potential out-of-memory errors during compilation
- name: Set swap space
uses: pierotofy/set-swap-space@master
with:
swap-size-gb: 10

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}

- name: Install base polars package
run: |
pip install --force-reinstall --no-dependencies dist/polars-*.whl
rm -rf dist/*

- name: Set jemalloc page size for aarch64
run: |
echo "JEMALLOC_SYS_WITH_LG_PAGE=16" >> $GITHUB_ENV

- name: Build wheel
uses: PyO3/maturin-action@v1
with:
command: build
target: aarch64-unknown-linux-gnu
args: >
--profile ${{ inputs.dry-run == true && 'mindebug-dev' || 'dist-release' }}
--manifest-path py-polars/runtime/polars-runtime-32/Cargo.toml
--features hf
--out dist
manylinux: auto
maturin-version: 1.8.3

- name: Test wheel
run: |
pip install --force-reinstall --verbose dist/*.whl
python -c 'import polars; polars.show_versions()'
# Quick sanity check for HF sink feature
python -c 'import polars as pl; df = pl.DataFrame({"a": [1,2,3]}); print("Polars loaded OK")'

- name: Upload wheel
uses: actions/upload-artifact@v4
with:
name: wheel-linux-arm64
path: dist/*.whl
4 changes: 2 additions & 2 deletions .github/workflows/docs-python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ on:
pull_request:
paths:
- py-polars/docs/**
- py-polars/polars/**
- py-polars/src/polars/**
- .github/workflows/docs-python.yml
push:
branches:
- main
paths:
- py-polars/docs/**
- py-polars/polars/**
- py-polars/src/polars/**
- .github/workflows/docs-python.yml
repository_dispatch:
types:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/test-coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ jobs:
run: >
pytest
-n auto
-m "not may_fail_auto_streaming and not slow and not write_disk and not release and not docs and not hypothesis and not benchmark and not ci_only"
-m "not may_fail_auto_streaming and not slow and not write_disk and not release and not benchmark and not docs"
-k 'not test_polars_import'
--cov --cov-report xml:auto-streaming.xml --cov-fail-under=0

Expand All @@ -170,7 +170,7 @@ jobs:
run: >
pytest
-n auto
-m "not may_fail_auto_streaming and not slow and not write_disk and not release and not docs and not hypothesis and not benchmark and not ci_only"
-m "not may_fail_auto_streaming and not slow and not write_disk and not release and not benchmark and not docs"
-k 'not test_polars_import'
--cov --cov-report xml:small-morsel.xml --cov-fail-under=0

Expand Down
27 changes: 21 additions & 6 deletions .github/workflows/test-python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,28 @@ jobs:
os: [ubuntu-latest]
python-version: ['3.10', '3.12', '3.13', '3.14', '3.14t']
ideal_morsel_size: [100000]
auto_new_streaming: [false]
include:
- os: windows-latest
python-version: '3.14'
ideal_morsel_size: 100000
auto_new_streaming: false
- os: windows-latest
python-version: '3.14'
ideal_morsel_size: 100000
auto_new_streaming: true
- os: ubuntu-latest
python-version: '3.14'
ideal_morsel_size: 4
auto_new_streaming: false
- os: ubuntu-latest
python-version: '3.14'
ideal_morsel_size: 100000
auto_new_streaming: true
- os: ubuntu-latest
python-version: '3.14'
ideal_morsel_size: 4
auto_new_streaming: true

steps:
- uses: actions/checkout@v6
Expand Down Expand Up @@ -114,33 +129,33 @@ jobs:
maturin develop --manifest-path runtime/polars-runtime-32/Cargo.toml

- name: Run doctests
if: github.ref_name != 'main' && matrix.python-version == '3.14' && matrix.os == 'ubuntu-latest'
if: github.ref_name != 'main' && matrix.python-version == '3.14' && matrix.os == 'ubuntu-latest' && !matrix.auto_new_streaming
run: |
python tests/docs/run_doctest.py
pytest tests/docs/test_user_guide.py -m docs

- name: Run tests
if: github.ref_name != 'main' && matrix.python-version != '3.14t'
if: github.ref_name != 'main' && matrix.python-version != '3.14t' && !matrix.auto_new_streaming
env:
POLARS_TIMEOUT_MS: 60000
run: pytest -n auto -m "not release and not benchmark and not docs"

- name: Run tests with new streaming engine
if: github.ref_name != 'main' && matrix.python-version != '3.14t'
if: github.ref_name != 'main' && matrix.python-version != '3.14t' && matrix.auto_new_streaming
env:
POLARS_AUTO_NEW_STREAMING: 1
POLARS_TIMEOUT_MS: 60000
run: pytest -n auto -m "not may_fail_auto_streaming and not slow and not write_disk and not release and not docs and not hypothesis and not benchmark and not ci_only"
run: pytest -n auto -m "not may_fail_auto_streaming and not release and not benchmark and not docs"

- name: Run tests async reader tests
if: github.ref_name != 'main' && matrix.os != 'windows-latest' && matrix.python-version != '3.14t'
if: github.ref_name != 'main' && matrix.os != 'windows-latest' && matrix.python-version != '3.14t' && !matrix.auto_new_streaming
env:
POLARS_FORCE_ASYNC: 1
POLARS_TIMEOUT_MS: 60000
run: pytest -n auto -m "not release and not benchmark and not docs" tests/unit/io/

- name: Run tests multiscan force empty capabilities
if: github.ref_name != 'main' && matrix.python-version != '3.14t'
if: github.ref_name != 'main' && matrix.python-version != '3.14t' && !matrix.auto_new_streaming
env:
POLARS_FORCE_EMPTY_READER_CAPABILITIES: 1
POLARS_TIMEOUT_MS: 60000
Expand Down
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,14 @@ target/
*.tbl

# Project
/docs/assets/data/
/docs/assets/data/*
!/docs/assets/data/alltypes_plain.parquet
!/docs/assets/data/apple_stock.csv
!/docs/assets/data/iris.csv
!/docs/assets/data/monopoly_props_groups.csv
!/docs/assets/data/monopoly_props_prices.csv
!/docs/assets/data/pokemon.csv
!/docs/assets/data/reddit.csv
/docs/assets/people.md

# User specific source setups
Expand Down
Loading
Loading