🚀 Performance improvements
- Adaptive size dispatch to hashset or radix sort + capacity-aware reset in
agg_n_unique(#27719)
✨ Enhancements
- Allow deeper expressions (#27768)
🐞 Bug fixes
- Raise length mismatch in multiple
sort_byingroup_by(#27772) - Respect min_samples for rolling_by ops with nulls (#27706)
- Fix memory usage regression affecting TPCH Q22 (#27758)
- Add
POLARS_ALLOW_NESTED_CSPEenv var and make nested CSPE opt-in (#27765) - Post-apply residual pyarrow predicates (#27764)
- Fix loss of precision for smaller floating types(#27662) (#27732)
- Filter at scan dropped in CSPE filter pushdown (#27763)
- Fix portstate assertion error on is_in (#27757)
- Fix incorrect when/then after forward fill / reverse in groupby (#27745)
- Accept empty Thrift list encoded as bare 0x00 byte in parquet metadata (#27754)
- Stabilize object store
credentialprovidercache key (#27712) - Add to
merge_sorteddocs that the input must be nulls first (#27743)
📖 Documentation
- Docs fixes (#27766)
- Sync from Polars Cloud (#27751)
- Add to
merge_sorteddocs that the input must be nulls first (#27743)
🛠️ Other improvements
- Attribute annotations for
CatalogCredentialProvider(#27739) - Solve
type: ignorein _AioDataFrameResult (#27311) - Remove dead code in
_write_utils.py(#27721) - Remove unnecessary
not isinstance(v, DataType)check (#27723)
Thank you to all our contributors for making this release possible!
@EndPositive, @JakubValtar, @MarcoGorelli, @NicoOhR, @azimafroozeh, @carnarez, @dsprenkels, @jorenham, @kdn36, @nameexhaustion, @orlp and @ritchie46