## pola-rs/polars — rs-0.51.0…rs-0.52.0

_324+ commits._

### Features
- **feat: Improve error message on unsupported SQL subquery comparisons (#25135)** (ed23bd6)
- **feat: Rewrite `IR::Scan` to `IR::DataFrameScan` in `expand_datasets` when applicable (#25106)** (7d5d966)
- **feat: Support `ewm_var/std` in streaming engine (#25109)** (890fc7a)
- **feat: Make DSL-hash skippable (#25140)** (d43dcdb)
- **feat: Streaming `{Expr,LazyFrame}.rolling` (#25058)** (fa0e9d0)
- **feat: Set polars/<version> user-agent (#25112)** (f72d1ea)
- **feat: Add `BIT_NOT` support to the SQL interface (#25094)** (9098920)
- **feat: Support BYTE_ARRAY backed Decimals in Parquet (#25076)** (afcf0c2)
- **feat(python): Allow `glimpse` to return a `DataFrame` (#24803)** (f9a1feb)
- **feat: Add `allow_empty` flag to `item` (#25048)** (f3180bf)
- **feat(python): Stabilize decimal (#25020)** (1257df0)
- **feat: Support `ewm_mean()` in streaming engine (#25003)** (f48394c)
- **feat: Improve row-count estimates (#24996)** (7173122)
- **feat: Remove filtered scan paths in IR when possible (#24974)** (d6d1802)
- **feat: Allow local scans on polars cloud (configurable) (#24962)** (ccebe8b)
- **feat: Add `Expr.item` to strictly extract a single value from an expression (#24888)** (0528f53)
- **feat: Add environment variable to roundtrip empty struct in Parquet (#24914)** (981600e)
- **feat(python): Fast-count for `scan_iceberg().select(len())` (#24602)** (28eff13)
- **feat: Add `glob` parameter to `scan_ipc` (#24898)** (5f4ad1f)
- **feat: Add `list.agg` and `arr.agg` (#24790)** (96a6470)

### Fixes
- **fix: Fix CSV `select(len())` off by 1 with comment prefix (#25069)** (5a4c0d2)
- **fix: Fix incorrect reshape on sliced lists (#25139)** (3011cad)
- **fix: Support "index" as column name in `group_by` iterator (#25138)** (2a48d78)
- **fix: DSL_SCHEMA_HASH should not changed by line endings (#25123)** (cad5304)
- **fix: Solve multiple issues relating to arena mutation in SQL subqueries (#25110)** (53eaf6c)
- **fix: Fix panic in `dt.truncate` for invalid duration strings (#25124)** (d0be4c0)
- **perf: Lazy gather for `{forward,backward}_fill` in group-by contexts (#25115)** (df69276)
- **fix: Don't trigger `DeprecationWarning` from SQL "IN" constraints that use subqueries (#25111)** (805cfcb)
- **fix: Return the correct string-case `Expr` reprs (#25101)** (6bf4153)
- **fix: Fix `groups` update on slices with different offsets (#25097)** (64bdeea)
- **fix: Fix handling `Null` dtype in `ApplyExpr` on `group_by` (#25077)** (5446ac7)
- **fix(rust): Raise error for all/any on list instead of panic (#25018)** (47f491b)
- **fix: Unique key names in streaming sort/top_k (#25082)** (b6348f4)
- **fix: The `SQL` interface should use logical, not bitwise, behaviour for unary "NOT" operator (#25091)** (a99ad34)
- **fix: Fix panic if scan predicate produces 0 length mask (#25089)** (7b423b6)
- **perf: Don't recompute full rolling moment window when NaNs/nulls leave the window (#25078)** (5ae1a1c)
- **fix: Ensure SQL table alias resolution checks against CTE aliases on fallback (#25071)** (92f67ca)
- **fix: Panic in `group_by_dynamic` with `group_by` and multiple chunks (#25075)** (f8eef2d)
- **fix(python): Minor improvement to internal `is_pycapsule` utility function (#25073)** (65e05e4)
- **fix: Fix panic when using struct field as join key (#25059)** (af65029)
- **fix: Allow broadcast in `group_by` for `ApplyExpr` and `BinaryExpr` (#25053)** (251c6b6)
- **fix: Fix field metadata for nested categorical PyCapsule export (#25052)** (f3c4dc7)
- **fix: Block predicate pushdown when `group_by` key values are changed (#25032)** (fbf3609)
- **fix: Group-By aggregation problems caused by `AmortSeries` (#25043)** (0c81569)
- **fix: Don't push down predicates passed inserted cache nodes (#25042)** (aaa11d6)
- **perf: Skip filtering scan IR if no paths were filtered (#25037)** (0ebfb72)
- **fix: Allow for negative time in `group_by_dynamic` iterator (#25041)** (71678b3)
- **perf: Optimize ipc stream read performance (#24671)** (48840c6)
- **Revert "ci: Fix benchmark ci" (#25023)** (cb447fd)
- **fix: Re-enable CPU feature check before import (#25010)** (a765e92)
- **fix(python): Implement `read_excel` workaround for fastexcel/calamine issue loading a column subset from a named table (#25012)** (61f6558)
- **perf: Bump foldhash to 0.2.0 and hashbrown to 0.16.0 (#25014)** (716d550)
- **fix: Correctness `any(ignore_nulls)` and OOB in `all` (#25005)** (5763665)
- **fix: Streaming any/all with ignore_nulls=False (#25008)** (6290adf)
- **fix: Fix incorrect `join_asof` on a casted expression (#25006)** (a341c9a)
- **fix: Optimize memory on rolling groups in `ApplyExpr` (#24709)** (b2b4866)
- **fix: Fallback `Pyarrow` scan to in-memory engine (#24991)** (058a294)
- **fix: Make `Operator::swap_operands` return correct operators for `Plus`, `Minus`, `Multiply` and `Divide` (#24997)** (01ea699)
- **fix: Capitalize letters after numbers in to_titlecase (#24993)** (803a24a)
- **fix: Preserve null values in `pct_change` (#24952)** (4e43ae7)
- **perf: Lower `unique` to native group-by and speed up `n_unique` in group-by context (#24976)** (2b24154)
- **perf: Better parallelize `take{_slice,}_unchecked` (#24980)** (5f71d15)
- **perf: Implement native `skew` and `kurtosis` in group-by context (#24961)** (e58cf12)
- **fix: Raise length mismatch on `over` with sliced groups (#24887)** (e91e1c5)
- **fix: Check duplicate name in transpose (#24956)** (adee364)
- **fix: Follow Kleene logic in `any` / `all` for group-by (#24940)** (f26cb94)
- **fix: Do not optimize cross join to iejoin if order maintaining (#24950)** (5574913)
- **perf: Use native group-by aggregations for `bitwise_*` operations (#24935)** (99e95ac)
- **fix(python): Fix typing of `scan_parquet` partially unknown (#24928)** (5ae44a7)
- **fix: Version** (a6fa669)
- **perf: Address `group_by_dynamic` slowness in sparse data (#24916)** (c6d29c8)
- **fix(python): Properly release the GIL for `read_parquet_metadata` (#24922)** (1f1a2d4)
- **perf(python): Push filters to PyIceberg (#24910)** (77254fc)
- **fix: Broadcast `partition_by` columns in `over` expression (#24874)** (189bca7)
- **perf: Native `filter/drop_nulls/drop_nans` in group-by context (#24897)** (e006aad)
- **fix: Clear index cache on stacked `df.filter` expressions (#24870)** (148f6c5)
- **perf: Implement `cumulative_eval` using the group-by engine (#24889)** (afdbf30)
- **perf: Prevent generation of copies of `Dataframe`s in `DslPlan` serialization (#24852)** (c954fc7)
- **fix: Fix 'explode' mapping strategy on scalar value (#24861)** (60c2fc1)
- **perf: Implement native `null_count`, `any` and `all` group-by aggregations (#24859)** (366dc3e)
- **fix: Fix repeated `with_row_index()` after `scan()` silently ignored (#24866)** (add11e8)
- **fix: Correctly return min and max for enums in groupby aggregation (#24808)** (1b54ffc)
- **fix: Refactor `BinaryExpr` in `group_by` dispatch logic (#24548)** (a143eb0)
- **fix: Fix aggstate for `gather` (#24857)** (80dc3e3)
- **perf: Speed up `reverse` in group-by context (#24855)** (a6e5b87)

### Backend
- **Python Polars 1.35.1 (#25090)** (84a0fee)
- **Python Polars 1.35 (#25017)** (5cc9b1a)
- **Python Polars 1.35-beta.1 (#24933)** (0c9a1b5)

### Tests
- **test: Update tests to be index type agnostic (#24891)** (1090f1f)
- **test(python): Fix failing delta test (#24867)** (2a4c153)

### Docs
- **docs: Mention Narwhals in ecosystem page (#25100)** (44760a4)
- **docs(python): Clarify bitwise behaviour of `and_`, `or_`, and `not_` Expressions on integer columns (#25092)** (6c11332)
- **docs: Fix typo in public dataset URL (#25044)** (51f8b4c)
- **docs: Introduce remote Polars MCP server (#24977)** (3fa7af8)
- **docs(python): Add `{arr,list}.agg` API references (#24970)** (a79ebd3)
- **docs(python): Support LLM in docs (#24958)** (870f0e0)
- **docs: Update Cloud docs with correct fn argument order (#24939)** (0d9afd9)
- **docs(python): Update `name.replace` examples (#24941)** (059b982)
- **docs: Add i128 and u128 features to user guide (#24938)** (251f4e3)
- **docs(python): Add partitioning examples for `sink_*` methods (#24918)** (1c7133e)
- **docs(python): Add more `{unique,value}_counts` examples (#24927)** (c8fad45)
- **docs(python): Indent the versionchanged (#24783)** (ee5890b)
- **docs: Relax fsspec wording (#24881)** (8e156b1)

### Chore
- **refactor(rust): Support for named/anonymous aggregations (#25118)** (48492c2)
- **refactor(python): Remove unused `optimization_toggle` (#25130)** (1d94c18)
- **build: Make building the docs on macOS more reliable (#25095)** (94b001a)
- **chore: Silence unused mut warning (#25093)** (2064121)
- **refactor(rust): Remove old join projection pushdown logic (#25088)** (b9e3136)
- **refactor: Disable recursive CSPE for now (#25085)** (ce396f4)
- **refactor(rust): Remove unused row-count (#25080)** (209d833)
- **chore(rust): Add `proptest` strategies for Series logical types (#24849)** (29b85ea)
- **refactor(rust): Add stateful `EwmCov` kernel (#25065)** (0c5518a)
- **refactor(rust): Add IR for `scan_lines` (#25066)** (a267c07)
- **refactor: Change group length mismatch error to `ShapeError` (#25004)** (b2c4099)
- **refactor(rust): Move asof `tolerance` type coercion to IR conversion (#25033)** (310a2fa)
- **refactor(rust): Move `EwmMeanState` to `polars-compute` (#25034)** (a5b50a9)
- **chore: Update toolchain (#25007)** (b1623ff)
- **build: Don't require file existence** (e9fce55)
- **build: Ensure `build_feature_flags.py` is included in artifact (#25024)** (b51b5e2)
- **ci: Fix benchmark ci (#25019)** (c94b525)
- **chore: Fix non-deterministic test (#25009)** (29023fb)
- **chore: Fix makefile arch detection (#25011)** (c0b3669)
- **chore: Make `LazyFrame.set_sorted` into a `FunctionIR::Hint` (#24981)** (a9899ed)
- **refactor(rust): Update row estimation and reader schema in `filter_scan_ir` (#24995)** (c76f54f)
- **refactor(rust): Insert casts for `ewm_mean` inputs in type coercion (#24992)** (fd0a6db)
- **refactor(rust): Remove unused `expr_eval` (#24988)** (84d66e9)
- **chore: Remove symbolic links (#24982)** (5594b81)
- **chore(python): Deprecate `Expr.agg_groups()` and `pl.groups()` (#24919)** (f7836ca)
- **refactor(rust): Add stateful `EwmMean` kernel (#24972)** (2f8badc)
- **refactor: Dispatch to no-op rayon thread-pool from streaming (#24957)** (c916fc7)
- **refactor(rust): Add function to filter `IR::Scan` based on indices (#24979)** (4a90b5f)
- **refactor(rust): Organize code for opaque functions in a module (#24978)** (3961ab4)
- **refactor(rust): Move scan filter code to `polars-mem-engine` (#24959)** (ff1dccd)
- **chore: Unpin pydantic (#24955)** (d59ec25)
- **refactor: Ensure safety of scan fast-count IR lowering in streaming (#24953)** (2954baf)
- **refactor(rust): Expose `polars_compute` from polars (#24556)** (43a10fe)
- **refactor: Re-use iterators in `set_` operations (#24850)** (62f3f51)
- **refactor(rust): Move order code to instance function (#24895)** (4d432a8)
- **refactor(rust): Visualization data generator for streaming physical plan (#24896)** (4364179)
- **refactor: Remove `GroupByPartitioned` and dispatch to streaming engine (#24903)** (7c786dd)
- **refactor(rust): Improve IR visualization for IEJoin (#24902)** (58f1282)
- **refactor: Turn `element()` into `{A,}Expr::Element` (#24885)** (2ffa695)
- **refactor: Pass `ScanOptions` to `new_from_ipc` (#24893)** (8f35ff7)
- **refactor(rust): Remove legacy `order_sensitive` code (#24894)** (6b5d580)
- **refactor(rust): Rename `text_plan_graph` to `visualization_data` (#24878)** (eb56dbe)
- **refactor(rust): Use `UnifiedScanArgs` in `new_from_ipc` and remove `LazyIpcReader` (#24883)** (1921f59)
- **build(python): Update pyo3 and numpy crates to version 0.26 (#24760)** (6849b6e)
- **refactor(rust): Document safety of `CategoricalToArrowConverter` (#24876)** (ab4d9c3)
- **refactor: Unset `Context` in `Window` expression (#24875)** (a0329a8)
- **refactor(rust): Unify expression order resolution (#24723)** (92b2a4b)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/pola-rs/polars?utm_source=github-action)._