NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #406 most downloaded on PyPI
Blazingly fast DataFrame library
Last release 14 days ago
20 Sep 2026
Ships fairly regularly
a new release about every 4 weeks
Nearly every release is documented
notes for 59 of the last 60 stable releases
67 versions withdrawn
withdrawn after publishing
6 years old
434 releases · first in 2021
One column per quarter.
Read Parquet ENUM type as pl.String
Map dtype (#28984)scan_lines (#29310)CloudScheme::Http sources (#29284)sort_in_place (#29343)posix_fadv to Normal (#29157)mmap with file I/O for parquet scan (#29091)head requests (#29131)scan_fn.io_source (#28897)join keys (#29233)APPROX_QUANTILE to the SQL frontend (#29288)approx_quantile in the streaming engine (#29237)scan_iceberg/delta-related attributes in the visitor for cudf_polars (#29297)collect and collect_batches using RemoteEngine (#28914)String to Time (#29215)organization to Config.enable_monitoring (#29221)Map dtype (#28984)read_database for Arrow-based drivers (#29273)Date and Decimal means between the streaming and in-memory engines (#29359)Struct supertypes per-field (#29261)auto (#29236)Wildcard selector (#29220)AnyValues through their field dtypes (#29185)OVER clause to multi-argument aggregates (#29160)DataFrame construction race (and generator data loss) (#29132)read_database Oracle regression, following introduction of Arrow fast-path (#29142)Decimal true division with integers (#29122)exp/log1p on non-numeric dtypes (#29112)offset_by when target date is out-of-range (#29059)is_empty/ has_nulls (#29152)fast-release profile without LTO (#29168)0.23.45 (#29303)test_fused_many_morsels_and_skew test (#29290)SpillFrames in DataFrameSearchBuffers (#29207)MapChunked storage handling (#29248)lf.collect().schema == lf.collect_schema() check (#29224)object_store for new DnsResolver trait (#29145)map_elements (#24925)Thank you to all our contributors for making this release possible!
@0guban0v, @ATL2001, @Aidavdw, @AlessandroKuz, @BitWeaverDev, @DeflateAwning, @EndPositive, @Kevin-Patyk, @MarcoGorelli, @SatvikMishra08, @aarushkandukoori, @abokhalill, @alexander-beedie, @atharva7905k, @ayushh0110, @borchero, @carnarez, @dancsi, @dsprenkels, @freundTech, @fsimkovic, @jonasdedden, @kafka1991, @kdn36, @lun3x, @madsbk, @matthewbayer, @mikhail5555, @mroeschke, @nameexhaustion, @orlp, @r-brink and @ritchie46
Python Polars 2.0.0-rc.2 Pre-release
Pre-release
Compare
Set the default engine for SQL to the streaming engine
meta namespace (#28091)Date feature gating (#29031)Series.sample order when with_replacement=True and shuffle=False (#28990)PostApplyExtraOps (#29049)combine_validities_and_many and add test (#28909)sink_batches lazy: Literal[False] overload a default (#28951)if for cfg(debug_assertions) to fix the benchmark job (#29002)Thank you to all our contributors for making this release possible!
@0guban0v, @0xC61, @Aniket-a14, @LarryHu0217, @MatteoPossamai, @NeejWeej, @TNieuwdorp, @WaterWhisperer, @adamreeve, @dsprenkels, @jonasdedden, @kdn36, @math-hiyoko, @matthewbayer, @nameexhaustion, @orlp, @ritchie46, @severinh and @sivakumar-mahalingam
Python Polars 2.0.0-rc.1 Pre-release
Pre-release
Compare
Thank you to all our contributors for making this release possible! @EndPositive , @dsprenkels , @kdn36 , @lun3x , @nameexhaustion and @orlp
Thank you to all our contributors for making this release possible!
@EndPositive, @dsprenkels, @kdn36, @lun3x, @nameexhaustion and @orlp
Thank you to all our contributors for making this release possible! @Kevin-Patyk , @henrytsanford , @jonasdedden , @orlp and @ritchie46
Thank you to all our contributors for making this release possible!
@Kevin-Patyk, @henrytsanford, @jonasdedden, @orlp and @ritchie46
Deprecate rechunk parameter for all read/scan functions
rechunk parameter for all read/scan functions (#28063)Expr.rechunk() (#28692)struct.rename_fields() with an incorrect number of fields (#28672)CloudRetryConfig for rate limit stability (#28885)mask for DataFrame filter (#28762)Partial metadata on filter (#28737)join_where (#28880)RemoteEngine and a common base class for all engines (#28800)scan_iceberg (#28772)sinked_paths_callback on sink_parquet as unstable parameter (#28814)infer_schema_files to CSV inference hint (#28809)struct.drop() (#28666)unpivot column selection aligns with the lazy engine (#28846)select() height (#28751)monitoring as an engine-level parameter (#28821)min and max (#28789)any and all (#28754)by column values in rolling_*_by (#27367)field in struct.with_fields with over (#28678)Utf8 and Binary (#28662)__arrow_c_stream__ (#28642)LargeList (#28632)read_database_uri requirements for SQLAlchemy (#28366)monitoring as an engine-level parameter (#28821)RemoteEngine and a common base class for all engines (#28800)CredentialProviderAWS and CredentialProviderAzure (#28790)ScanCastOptions (#27906)test_grouped_agg_parametric as slow (and add param ids) (#28715)expect in test_group_by_arg_max_boolean_26978 (#28690)struct.drop() in rename_fields() deprecation message (#28687)dist=loadgroup to the pytest config (#28676)may_fail_auto_streaming tests (#28675)test_extension() for streaming engine (#28611)test_hive_join_rewrite_semi_join test to work with streaming engine (#28610)Thank you to all our contributors for making this release possible!
@0guban0v, @JakubValtar, @Joosboy, @Kevin-Patyk, @MatteoPossamai, @NicoOhR, @TNieuwdorp, @VedantMadane, @aarushkandukoori, @alexander-beedie, @azimafroozeh, @borchero, @carnarez, @dancsi, @dependabot[bot], @dsprenkels, @gautamvarmadatla, @jonasdedden, @jorenham, @kdn36, @lzcmian, @malhotrashivam, @matthewbayer, @mikhail5555, @nameexhaustion, @orlp, @ritchie46, @subotac and dependabot[bot]
Deprecate casts from Categorical to integer dtypes
Categorical to integer dtypes (#28525)plan_stage argument in show_graph() (#28391)len() to concat/union inputs (#28570)from_arrow of ArrowStreamExportable (#28442)infer_schema_files parameter to scan_csv (#28440)Series(Array) (#28602)StringChunked substring kernels (#28573)Unknown(Int) and Unknown(Float) should result in Unknown(Float) (#28545)nulls_last after Expr.reverse() (#28572)SQLContext.execute() (#28549)nulls_last in function_expr_sortedness (#28544)Thank you to all our contributors for making this release possible! @BitWeaverDev, @Matt711, @Samoilov2004, @borchero, @dancsi, @dsprenkels, @kdn36, @masumi-ryugo, @nameexhaustion and @ritchie46
Optimize not(bool\_f) to not\_bool\_f
NOT IN interaction with NULL values and joins (#28484)SUM and CORR aggregates return NULL for all-null inputs, add TOTAL (#28475)null_count_dtype helper between Delta and Iceberg, fixing SchemaError (#28479)ruff and mypy package versions (#28456)Thank you to all our contributors for making this release possible! @AnirudhRahul, @EndPositive, @Jesse-Bakker, @alexander-beedie, @carnarez, @dancsi, @mdroogh, @mroeschke, @nameexhaustion, @nchammas, @orlp, @r-brink and @ritchie46
Deprecate casting numeric types to categoricals
cat.get_categories() and cat.to_local() (#28299)LazyFrame.profile() (#28275)list/arr.to_struct() calls that don't pass field names (#28243)missing_utf8_is_empty_string to empty_string_is_null (#28173)full_null() with small lengths (#28181)scan_arrow_c_stream (#28340)initial-default in native scan_iceberg (#28324)assert_frame_equal error (#27816)list expression which consistently packs elements together into new List type (#27990)read_database Arrow fast-path for "python-oracledb" (#28230)CastColumnsPolicy (#28084)dt.replace when there were multiple chunks (#28437)is_scalar from the input to the output of .sort() and .sort_by() (#28438)sort().reverse() to sort(descending=True) when maintain_order=True (#28403)write_json() null values in Array columns being written incorrectly as null (#28330)select(len()) (#28355)top_k/bottom_k (#28359)aws_checksum_algorithm when provided (#28328)pyarrow.feather.read_table (#28323)Object dtype instead of creating invalid List(Object) (#28246)ewm_var/ewm_std value (#28235)ADBC shouldn't require "CREATE" privileges unless the table is confirmed not to exist (#28228)rolling_rank position invalid if ost.len() < min_samples (#28142)merge_sorted() docs also for DataFrame (#28183)merge_sorted() null inputs should be nulls first (#28177)dev profile to line-tables-only (#28358)shuffle parameter for sample() (#27460)to_struct() in doctest (#28370)spin dependency to v0.10.1 (#28360)assert_frame_equal error (#27816)optimize (#28318)object_store custom DNS resolver patch to rev-based (#28241)*GroupBy (#27903)classinstmethod and attribute annotation (#27904)typos to v1.48.0 (#28162)Thank you to all our contributors for making this release possible! @0guban0v, @AnirudhRahul, @Bharath-970, @CodingSelim, @EndPositive, @Jesse-Bakker, @Kevin-Patyk, @LarryHu0217, @MarcoGorelli, @MatteoPossamai, @TNieuwdorp, @alex-h-sun, @alexander-beedie, @azimafroozeh, @borchero, @dancsi, @dependabot[bot], @dsprenkels, @harrywhalen, @jorenham, @kdn36, @makinzm, @malhotrashivam, @mdavis-xyz, @mikhail5555, @mkzung, @mroeschke, @nameexhaustion, @orlp, @r-brink, @raphaelroshan, @ritchie46, @tylerriccio33, @useredsa, @wence-, @yannbolliger, @zichen0116 and dependabot[bot]
Deprecate strict parameter of pl.concat, replace with new how='horizontal_extend'
strict parameter of pl.concat, replace with new how='horizontal_extend' (#27965)select(len()) after groupby (#28108)ResourceWarning leaks in database/iceberg tests (#28107)DeferredRefreshableCredentials (#28099)replace when old/new contain Expr or object dtype values (#27433)tokio::spawn in clippy (#28123)Makefile with respect to venv robustness (#28110)pd.TimeDelta segfault (#28125)mypy to the new 2.x release (#28116)pyrefly checks run as part of make pre-commit (#28095)test_select_explode_height_filter_order_by failure when POLARS_MAX_THREADS=2 (#28090)Thank you to all our contributors for making this release possible! @0guban0v, @Kevin-Patyk, @TNieuwdorp, @alexander-beedie, @azimafroozeh, @dsprenkels, @kdn36, @nameexhaustion, @orlp, @raphaelroshan, @ritchie46 and @sar-cheng
Deprecate casts from string to temporal dtypes
JOIN syntax (#27890)Expr.is_sorted (#26708)DataFrame.is_sorted() (#27870).explode() without empty_as_null argument (#28040)select(len()) incorrectly returned 0 when using scan_iceberg with pyiceberg as reader override (#28044)sink_* functions (#28042)dt.truncate and dt.round (#26120)file:// URIs with percent-encoded paths (#27876)[NOT] IN (subquery) to semi/anti join (#27888)sort.reverse() into single sort (#27918)eol_char docstrings (#27962)DataFrame.is_sorted() (#27913)sqlparser dependency (#28021)pyo3 and rust-numpy to 0.29.0 (#27970)2.0 branch as primary branch (#27978)deny.toml configuration (#27949)Vec instead of PlHashMap for ProjectionInfo.map (#27856)codegen-units (#27835)unbound-name Pyright/Pyrefly errors (#27827)Thank you to all our contributors for making this release possible! @0guban0v, @April-Sonnet, @BitWeaverDev, @EndPositive, @JakubValtar, @Kevin-Patyk, @Liyixin95, @MarcoGorelli, @Matt711, @TNieuwdorp, @alexander-beedie, @ankane, @azimafroozeh, @cBournhonesque, @carnarez, @dsprenkels, @gautamvarmadatla, @kdn36, @nameexhaustion, @orlp, @ritchie46, @tolleybot, @toreerdmann, @uurl and @xixixao
Do not materialize ScalarColumn in Column split_at
ScalarColumn in Column split_at (#27782)array.shift (#27740)list.sample(n) and list.sample(frac) (#27679)_utils and functions (#27789)Thank you to all our contributors for making this release possible! @ButteryPaws, @EndPositive, @Kevin-Patyk, @MarcoGorelli, @TNieuwdorp, @azimafroozeh, @carnarez, @kdn36, @lun3x, @orlp and @ritchie46
Adaptive size dispatch to hashset or radix sort + capacity-aware reset in agg_n_unique
agg_n_unique (#27719)sort_by in group_by (#27772)POLARS_ALLOW_NESTED_CSPE env var and make nested CSPE opt-in (#27765)credentialprovider cache key (#27712)merge_sorted docs that the input must be nulls first (#27743)merge_sorted docs that the input must be nulls first (#27743)CatalogCredentialProvider (#27739)type: ignore in _AioDataFrameResult (#27311)_write_utils.py (#27721)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
Nested common subplan elimination
{list,arr}.{unique,n_unique,reverse} to group_by engine (#27278)list.shift (#27628)json_decode Datetime string parsing (#27559)to_numpy C-order via cache-blocked transpose (#27522)select(len()) for non-strict horizontal concat (#27516)is_in row-group pruning precise on null-containing haystacks (#27495)is_in row-group pruning precise on multi-value lists (#27475)/ operator in Polars SQL (#27391)FILTER clause for aggregate functions, and STRING_AGG (#27564)FileMetadata prunable for IR-plan dispatch (#27535)list.slice (#27487)null_on_oob in {Expr/Series}.gather (#27327)arr.eval on overflow boundaries (#27496)list.eval on overflow boundaries (#27483)SLICED UNION in LazyFrame explain (#27467)merge_sorted panic when List in frame (#27568)TypeError when calling next() directly on GroupBy objects (#27562)Series::is_sorted() after row-encoding columns (#27614)HConcat (#27570)Finished if its sending port is Done (#27572)str.to_time was raising unnecessarily when input was all nulls (#27574)DataFrame.write_database(..., if_table_exists="append", engine="adbc") not handling missing tables correctly (#26913)json_decode doesn't fail for Date and Time string deserialization (#27554)suffix="" and coalesce=True (#27376)FastCount for csv if pre_slice is set (#27536)over (#27544)Sequence[int] from DataFrame.\_\_setitem\_\_ key (#27355)nulls_last for descending over(order_by) in group_by().agg() (#27486)scan_csv select(len()) when collected on streaming engine (#27504)to_arrow() in a multithreaded context (#27472)to_pandas() in multithreaded context (#27451)read_parquet/read_csv with pyarrow reader (#27397)sample() respects shuffle=False (#27248)DataFrame from concat_list with lit and empty column (#27305)MAP columns without LogicalType annotation (#27404)DuplicateError on parquet files with duplicate column names (#27399)join_asof docstring (#27682)engine options on LazyFrame collect/sink/explain methods (#27374)over:order_by description (#27520)write_ipc buffer behavior with file=None (#27430)allow_local_scans option for prepare_cloud_plan (#27663)deltalake and fix CI (#27660)impl IntoAExprBuilder for ExprIR (#27656)_expand_selector_dicts into multiple functions so return type is simple and accurate (#27618)DataFrame.__array__ and Series.__array__ (#27634)type: ignore statements (#27360)PhysNodeKind::AsOfJoin::{left_right}_by fields (#27400)udfs.py (#27341)Thank you to all our contributors for making this release possible! @0guban0v, @EndPositive, @JakubValtar, @Jesse-Bakker, @Kevin-Patyk, @Liyixin95, @MarcoGorelli, @NedJWestern, @Shoeboxam, @SuryaSunil1326, @TNieuwdorp, @alexander-beedie, @aryansri05, @ashler-herrick, @azimafroozeh, @carnarez, @coastalwhite, @dependabot[bot], @dsprenkels, @gab23r, @gautamvarmadatla, @ilya-pevzner, @jonathansergio, @junnythemarksman, @kdn36, @lun3x, @nameexhaustion, @orlp, @pablogsal, @ritchie46, @uurl, @waamm, @wence-, @wmoss, @xronocode and dependabot[bot]
Skip validity mask processing in \_\_array\_ufunc\_\_ when no inputs have nulls
maintain_order parameter to merge_sorted (#27263)having predicate in GroupBy iter (#27370)NumUnorderedImplodeReducer arrow ListArray (#27375)reduce_balanced for certain input length lists affecting pl.concat (#27352)list.sample() allows fraction > 1 when with_replacement=True (#27350)append() errors when upcast=False (#27346)DataFrame.__init__ and Series.__init__ so they don't require all optional dependencies to be installed (#27348)pyarrow calls (#27377)Thank you to all our contributors for making this release possible! @EndPositive, @Kevin-Patyk, @MarcoGorelli, @carnarez, @dsprenkels, @gab23r, @jonathanchang31, @kdn36, @mzjp2 and @ritchie46
Deprecate support for dataframe interchange protocol
drop_{nulls,nans} in streaming group_by aggregations (#27296)entropy to streaming reductions (#27174)interpolate (#27185)strptime with format=None (#27056)skew / kurtosis to streaming aggregations (#27176)drop_nulls().{first,last}() to {first,last}(ignore_nulls=True) (#27187)cut output Enum and mark as elementwise (#27173)cov and corr (#27008)maintain_order=True requirement in sink_delta (#27007)ignore_nulls to {list,arr}.{any,all} (#27186)is_unique to list/array dtypes (#27290)pl.merge_sorted operating on multiple frames (#27014)group_by() without key exprs (#27141)groups to correct length for Implode (#27282)pl.int_ranges (#27294)pivot dropping data for null on values (#27273)LazyFrame.map_batches to no optimizations (#27262)StructEval schema context in StackOptimizer (#27243)Series to Struct (#27241)scan_delta filter on empty dataframe (#27244)DataFrame creation panic on list[struct] with heterogenous types (#27217)__structify was being ignored (#27148)null group entries when collecting AsOf-by groups (#27215)sink_parquet (#27196)Binary arg_min/arg_max and String single-element arg indices (#27172)int96_to_i64_ns to prevent overflow panic (#27129)from_epoch scaling (#27118)clip when the Series bound contains nulls (#27087)ddof parameter in rolling_corr and deprecate (#27104)sql_expr (#27084)COUNT(<lit>) expressions return the correct value (#27085)test_group_by_arg_max_boolean_26978 non-flaky for max_by ties (#27048)transpose() with mixed List and non-List columns (#27038)src/ subdirectory to CI Python docs step (#27025)merge_sorted and union (#27018)pl.DataFrame.fill_null work on columns with Null dtype (#27020)set_sorted in projection pushdown (#27006)agg_arg_min/agg_arg_max for boolean data type (#26997)sample() respects the global set seed (#26992)LazyGroupBy.map_groups docstring (#27292)deny_anonymous_users to scheduler config (#27287)merge_sorted (#27224)Series docstring whitespace indents (#27082)write_parquet docstring for use_pyarrow (#26988)scan_ipc cache arguments as deprecated (#27216)test_dtype_concat_3735 not actually iterating through numeric dtypes (#27178)test_scan_lines (#27213)_balanced_reduce to Python utils (#27100)ty / pyrefly (#27050)ResourceWarning coverage (#27083)src/ subdirectory to CI Python docs step (#27025)POLARS_AUTO_NEW_STREAMING=1 (#26818)Thank you to all our contributors for making this release possible! @0xRozier, @EndPositive, @HCYT, @Kevin-Patyk, @MarcoGorelli, @NeejWeej, @RedZapdos123, @TNieuwdorp, @abhidotsh, @alexander-beedie, @andyjessen, @azimafroozeh, @borchero, @carnarez, @coastalwhite, @debnathshoham, @dpinol, @dsprenkels, @dydev012, @farouk-01, @gab23r, @gautamvarmadatla, @joaquinhuigomez, @kdn36, @nameexhaustion, @orlp, @ritchie46, @wence-, @xenzh, @yangsong97 and @yonatan-genai
Thank you to all our contributors for making this release possible! @ritchie46
Thank you to all our contributors for making this release possible! @ritchie46
Thank you to all our contributors for making this release possible! @nameexhaustion and @ritchie46
Thank you to all our contributors for making this release possible! @nameexhaustion and @ritchie46
Ensure read_csv_batched() prints deprecation warning
arg_{min,max} to streaming engine (#26845)scan_csv (#26637)scan_ndjson / scan_lines (#26563)AsOf join node (#26398).collect_schema() when arr.get() is out-of-bounds (#26866)Expr.reinterpret to all numeric types of the same size (#26401){min,max}_by (#26849)ARRAY init from typed literals (#26622)scan_iceberg() (#26826)make fresh command to the Makefile (#26809)write_excel (#26699)LazyFrame.sink_iceberg (#26799)pl.from_repr (#26806)contains_dtype() method for Schema (#26661)truncate as a "to_zero" rounding mode (#26677)Alignment TypeAlias (#26668)truncate Expression for numeric values (#26666)LPAD and RPAD string functions (#26631)SELECT query syntax (#26598)base_type typing (#26602)%.3f/%.6f/%.9f specifiers (#26075)assert_schema_equal in py-polars (#24869)corr (#26588)scan_ndjson / scan_lines (#26563)cast_options for scan_parquet (#26492)sas_token in Azure credential provider (#26565)get() for binary Series (#26514)AsOf join node (#26398)FETCH clause (#26449)Boolean arithmetic with integer literals producing Unknown type in streaming engine (#26878)UInt128 series (#26886)group_by().map_groups() (#26707)dbc in DataFrame.write_database (#26157).collect_schema() when arr.get() is out-of-bounds (#26866)LazyFrame.__contains__ (#26734)map_columns function parameter (#26487)timedelta when multiplying with a Series (#26830)function parameter in DataFrame.map_columns (#26372)JoinExec on deep plan (#26796)over context (#26827){min,max}_by in streaming engine for Boolean full {min,max} value column (#26848){arg_,}_{min,max} for Categoricals (#26856)on_columns (#26852)rolling_cov() and rolling_corr() with mixed input types (#26820)group_by fallback (#26801)RowEncodingContext::Struct when determining D::Struct encoded item len (#26817)collect(engine='streaming') with POLARS_AUTO_NEW_STREAMING (#26792)pd.Timedelta (#26785){column_name} and {index} placeholders in pl.format string (#26771)nulls_last is unknown (#26778)rolling (#26724).get() is out-of-bounds in group by context (#26752)bitwise_xor aggregation inverted when column contains nulls (#26749)nulls_last in sort_by within group_by().agg() slow path (#26681)NaN when using corr() with a literal and expr (#26697)PoisonError panic caused by reentrant usage of file cache (#26627)strict=False (#26674)Enum struct slicing (#26643)SQLContext typing overloads (#26658)pl.from_epoch losing fractional seconds (#26419)to_pandas() on empty enum Series did not preserve enum dictionary (#26610)f32 values with "HalfAwayFromZero" mode (#26624)OVER clause (#26570)dictionary_page_offset when dictionary encoding is used and point data_page_offset to the first data page (#26542)read_csv_batched() prints deprecation warning (#26530)PhysicalExpr for MinBy/MaxBy nodes (#26506)TotalOrd (#26497)replace_strict() (#26453)null when dividing literals by 0 (#26343)EXTRACT and DATE_PART functions (#26575)get() for binary Series (#26514).gitignore and .typos.toml exclude "_polars_runtime*" directories (#26842)_expand_paths scan function (#26798)Expr sortedness container to AExprSorted and add nulls_last to PyExpr.set_sorted() (#26781)stop_and_buffer_pipe_contents into joins/utils.rs (#26810)is_supported_type macro with a closure in predicate_pushdown/join.rs (#26812)pl.all() expansion (#26773){read, scan}_ndjson cache argument(s) as deprecated (#26711)importlib (#26603)assert_schema_equal (#26596)__init__.py files and docstrings to testing directories (#26408)LazyFrame.clear to clear sql (#26562)process_except_intersect during IR (#26516)POLARS_IDEAL_MORSEL_SIZE=4 (#26420)test_file and have tests create test.parquet in tmp_path (#26525)s3fs dev dependency (#26509)rechunk() if not allow_chunks (#26504)RevMapping) (#26508)ruff, mypy, typos (#26476)execute_isolated (#26455)Thank you to all our contributors for making this release possible! @BJohnBraddock, @EndPositive, @Jesse-Bakker, @Kevin-Patyk, @MarcoGorelli, @Matt711, @NathanHu725, @RenzoMXD, @TNieuwdorp, @Voultapher, @WaffleLapkin, @abishop1990, @alexander-beedie, @azimafroozeh, @boris324, @cBournhonesque, @carnarez, @coastalwhite, @daizutabi, @dependabot[bot], @dsprenkels, @erandagan, @etiennebacher, @gautamvarmadatla, @henryharbeck, @hutch3232, @itamarst, @jberg5, @johalnes, @kdn36, @leudz, @lukas-reining, @moktamd, @mqqz, @mroeschke, @nameexhaustion, @orlp, @pragun-ananda, @qxzcode, @ritchie46, @spock-yh, @stakeswky, @tlauli, @toroleapinc, @veeceey and dependabot[bot]
Add get() to retrieve a byte from binary data
scan_delta with filter (#26448)by_name selector selects only names (#26437)POLARS_IDEAL_MORSEL_SIZE monkeypatching in the parametric merge-join test (#26418)selector match patterns for multiline column names (#26320)sink_delta to API reference (#26446)Expr::Display as catch all for IR - DSL asymmetry (#26471)POLARS_IDEAL_MORSEL_SIZE monkeypatching in the parametric merge-join test (#26418)Thank you to all our contributors for making this release possible! @Voultapher, @alexander-beedie, @azimafroozeh, @cmdlineluser, @dependabot[bot], @dsprenkels, @hamdanal, @kdn36, @nameexhaustion, @orlp, @ritchie46 and dependabot[bot]
Deprecate retries=n in favor of storage_options={"max_retries": n}
retries=n in favor of storage_options={"max_retries": n} (#26155)put upload for IPC sink (#26288)scan_delta to use python dataset interface (#26190)arg_max/arg_min (#26093)arrow_schema parameter to sink_parquet (#26323)put upload for IPC sink (#26288)upload_concurrency through env var (#26263)LazyFrame.group_by(...).map_groups (#26275){sink/scan}_ipc (#26254)storage_options (#26204)scan_lines (#26112)str.split (#26060)scan_ipc/sink_ipc (#26079)height parameter to DataFrame/LazyFrame (#26014)PartitionBy with scalar key expressions and diff() (#26370)with_columns and collect_all (#26366)is_in with inlinable needles (#26361)xlsx2csv version temporarily (#26352)read_ods and read_excel (#26317)Union typing (#26303)rolling_rank_by (#26287)is_count_star flag between queries in collect_all (#26256)pl.duration scalar arguments case (#26213)DataFrame.slice with negative offset and length=None (#26215)scan_csv with multiple files and skip_rows + n_rows larger than total row count (#26128)allow_object flag after cache (#26196)hash_rows() of 0-width DataFrame (#26154)with_row_index or unpivot create duplicate columns on a LazyFrame (#26107)Expr.get referencing incorrect dtype for index parameter (#26364)Expr.quantile formatting (#26351)sphinx-llms-txt extension (#26285)cublet_id (#26260)make requirements-all (#26195)from_torch if module not installed (#26405)Operator::Divide to RustDivide (#26339)xlsx2csv dependency pin (#26355)POLARS_PANIC_ON_ERR (#26125)unused-ignore mypy lint (#26110)file://hostname/path (#26061)Thank you to all our contributors for making this release possible! @Atarust, @EndPositive, @Kevin-Patyk, @LeeviLindgren, @MarcoGorelli, @Matt711, @MrAttoAttoAtto, @Voultapher, @WaffleLapkin, @agossard, @alex-gregory-ds, @alexander-beedie, @azimafroozeh, @bayoumi17m, @c-peters, @carnarez, @dependabot[bot], @dsprenkels, @hallmason17, @hamdanal, @ion-elgreco, @kdn36, @lun3x, @mcrumiller, @nameexhaustion, @orlp, @qxzcode, @r-brink, @ritchie46, @sweb and dependabot[bot]
Speed up SQL interface "UNION" clauses
SQL interface "UNION" clauses (#26039)Thank you to all our contributors for making this release possible! @Voultapher, @alexander-beedie, @kdn36, @nameexhaustion, @orlp, @ritchie46 and @wtn
Fix display of deprecation warning
SQL interface "ORDER BY" clauses (#26037)sink_* functions to new-streaming by default (#25910)scan_csv/ndjson (#25757)pl.PartitionBy API (#26004)COUNT(*) fast path (#25988)collect_all (#25991)JOIN columns that are ambiguous (#25761){sink,write}_ipc (#25958)null_on_oob parameter to expr.get (#25957)SQLContext recognition of possible table objects in the Python globals (#25749)sql method for API consistency (#25792)shift support for Object data type (#25769)Series.arr.mean (#25774)struct.with_fields data model coherent (#25610)group_by names in upsample() (#25811)DataFrame.estimated_size not handling overlapping chunks correctly (#25775)midpoint interpolation (#25824)list.eval (#25826)group_by incorrectly introduced NULLs on group key columns (#25794)collect_schema for unpivot followed by join (#25782)arr namespace is called from array column (#25650)LazyFrame.serialize() unchanged after collect_schema() (#25780)rank (#25887)QUALIFY clause and SUBSTRING function to the SQL docs (#25779)lazy parameter to collect_all as unstable (#25999)ruff action and simplify version handling (#25940)scan_csv/ndjson (#25757)Thank you to all our contributors for making this release possible! @AndreaBozzo, @EndPositive, @Kevin-Patyk, @MarcoGorelli, @Voultapher, @alexander-beedie, @anosrepenilno, @arlyon, @azimafroozeh, @carnarez, @dependabot[bot], @dsprenkels, @edizeqiri, @eitanf, @gab23r, @henryharbeck, @hutch3232, @ion-elgreco, @jqnatividad, @kdn36, @lun3x, @m1guelperez, @mcrumiller, @nameexhaustion, @orlp, @ritchie46, @sachinn854, @yonikremer and dependabot[bot]
Tune partitioned sink\_parquet cloud performance
Object literal (#25690)boto3 extra from s3fs in dev requirements (#25667)bin_slice, bin_head, and bin_tail (#25697)drop_first in to_dummies when nulls present (#25435)how options in join() docstrings (#25678)lit fix earlier in the function (#25713)boto3 extra from s3fs in dev requirements (#25667)sqlparser-rs (#25673)Thank you to all our contributors for making this release possible! @AndreaBozzo, @Kevin-Patyk, @alexander-beedie, @dsprenkels, @jamesfricker, @mcrumiller, @nameexhaustion, @orlp and @ritchie46
Don't trigger DeprecationWarning from SQL "IN" constraints that use subqueries
🏆 Highlights
Schema.to_arrow() (#25149)JOIN constraints (#25132)Expr.rolling index_column (#25117)ewm_var/std in streaming engine (#25109)IR::Scan to IR::DataFrameScan in expand_datasets when applicable (#25106)unique frame method (#25099)BIT_NOT support to the SQL interface (#25094){Expr,LazyFrame}.rolling (#25058)LEAD and LAG functions (#23956)take_unchecked_impl (#25672){forward,backward}_fill in group-by contexts (#25115)ColumnPredicates generation for inequalities operating on integer columns (#25412)float Series (#25323)PyExpr to PyObject conversion (#25265)format_str in case of multiple chunks (#25162)pl.col.<colname> edge-cases (#25153)group_by iterator (#25138)dt.truncate for invalid duration strings (#25124)DeprecationWarning from SQL "IN" constraints that use subqueries (#25111)Expr reprs (#25101)groups update on slices with different offsets (#25097)select(len()) off by 1 with comment prefix (#25069)LazyFrame.remote signature (#25175)replace_all reference in replace docs (#25161)and_, or_, and not_ Expressions on integer columns (#25092)pl.format on multiple chunks (#25164)make fmt and make lint commands (#25200)proptest AnyValue strategies (#25510)proptest strategies for Series nested types (#25220)ruff and typos and made the necessary lint updates (#25196)proptest strategies for Series logical types (#24849)arg_sort() and Writeable::as_buffered() (#25583)parallelize_first_to_local (#25563)URL_ENCODE_CHARSET to HIVE_ENCODE_CHARSET (#25554)sync parameter in Writeable::close() (#25475)&dyn Any instead of Box<dyn Any> in python object converters (#25421)pipe_with_schema (#25388)pipe_with_schema work on Arced schema (#25155)scan_lines (#25136)optimization_toggle (#25130)scan_lines (#25066)EwmCov kernel (#25065)EwmMeanState to polars-compute (#25034)tolerance type coercion to IR conversion (#25033)date_range and related functions (#24084)Thank you to all our contributors for making this release possible! @AndreaBozzo, @DannyStoll1, @EndPositive, @JakubValtar, @Jesse-Bakker, @Kevin-Patyk, @MarcoGorelli, @TNieuwdorp, @Voultapher, @alexander-beedie, @borchero, @c-peters, @cBournhonesque, @camriddell, @carnarez, @cmdlineluser, @coastalwhite, @cr7pt0gr4ph7, @davanstrien, @davidia, @dsprenkels, @etiennebacher, @feliblo, @guilhem-dvr, @itamarst, @jannickj, @jetuk, @kdn36, @lun3x, @marinegor, @mcrumiller, @nameexhaustion, @orlp, @pomo-mondreganto, @ritchie46, @vyasr, @wtn, and more!
Don't trigger DeprecationWarning from SQL "IN" constraints that use subqueries
ROW_NUMBER, RANK, and DENSE_RANK functions (#25409)WINDOW references (#25400)BIT_NOT support to the SQL interface (#25094)LazyFrame.pivot (#25016)allow_empty flag to item (#25048)empty_as_null and keep_nulls flags to Expr.explode (#25289)empty_as_null and keep_nulls to {Lazy,Data}Frame.explode (#25369)having to group_by context (#23550)ignore_nulls to first / last (#25105)maintain_order to Expr.mode (#25377)quantile for missing temporals (#25464)str.replace_many / str.find_many / str.extract_many (#25398)Float16 dtype (#25185)Schema.to_arrow (#25149)Expr.rolling in aggregation contexts (#25258)Expr.unique on List/Array with non-numeric types (#25285)glimpse to return a DataFrame (#24803)hash for all List dtypes (#25372)implode and aggregation in aggregation context (#25357)slice on scalar in aggregation context (#25358)unique frame method (#25099)Expr.rolling index_column (#25117).row on a single-row DataFrame, equivalent to .item on a single-element DataFrame (#25229)Expr.over in aggregation context (#25402)map node (#25368)UNNEST support to handle multiple array expressions (#25418)UNNEST behaviour (#22546)as_struct repr (#25529)clear (#25266)IR::Scan to IR::DataFrameScan in expand_datasets when applicable (#25106){Expr,LazyFrame}.rolling (#25058)ewm_var/std in streaming engine (#25109)unique_counts for all datatypes (#25379)JOIN constraints (#25132)quantile in rolling context (#25479)LazyFrame.group_by_dynamic (#25342)group_by_dynamic with large offset (#25376)slice into streaming LazyFrame.rolling (#25338){forward,backward}_fill in group-by contexts (#25115)Expr.reshape((-1,)) as row separable (#25326)aexpr_to_leaf_names_iter (#25319)agg_min/agg_max when nulls present (#25374).rolling_rank support for temporal types and pl.Boolean (#25509)OVER clause behaviour for window functions (#25249)drop_nulls on literal (#25356)Null dtype values in scatter (#25245)group_by for ApplyExpr and BinaryExpr (#25053)sort_by in list.eval context (#25481)group_by_dynamic iterator (#25041)group_by key values are changed (#25032)drop_items for scalar input (#25351)eq_missing for struct with nulls (#25363){first,last}_non_null if there are empty chunks (#25279)SELECT clauses (#25282)DeprecationWarning from SQL "IN" constraints that use subqueries (#25111)select(len) off by 1 with comment prefix (#25069)arr.{eval,agg} in aggregation context (#25390)format_str in case of multiple chunks (#25162)groups update on slices with different offsets (#25097)group_by (#25179)write_ipc (#25497)sort_by with AggregatedScalar (#25503)Null dtype in ApplyExpr on group_by (#25077).list.eval after slicing operations (#25540)eval expressions in streaming engine (#25294).join_asof(strategy="nearest", allow_exact_matches=False, ...) (#25506)ColumnPredicates generation for inequalities operating on integer columns (#25412)dt.truncate for invalid duration strings (#25124)PyExpr to PyObject conversion (#25265)AmortSeries (#25043)pl.col.<colname> edge-cases (#25153)first/last with ignore_nulls (#25414){n_,}unique on bools (#25275)drop_nans filtering in group-by context (#25146)str.json_decode output deterministic with lists (#25240){forward,backward}_fill as length_preserving (#25352)is_pycapsule utility function (#25073)first_non_null/last_non_null (#25375)first/last (#25298)Expr.rolling in .over (#25283)group_by_dynamic with group_by and multiple chunks (#25075)is_in for mixed validity pages (#25313)Expr casts in pl.lit invocations (#25373)Expr reprs (#25101)struct (#25281)pl.format behavior with nulls (#25370)mean/median for temporals (#25512)asyncio if not inside a running loop (#25268)list.agg, unique and scalar (#25348)group_by iterator (#25138)AggregatedList in list.{eval,agg} context (#25385)SQL interface should use logical, not bitwise, behaviour for unary "NOT" operator (#25091)LazyFrame.pivot to reference guide (#25482)having API references (#25428)str.slice taking Expression params (#25461)and_, or_, and not_ Expressions on integer columns (#25092)datetime_range instead of date_range in resampling page (#25532)Categorical functions for lexical ordering and local checks (#25514)any_horizontal/all_horizontal docstring (#25469)markdown-link-check (#25314)replace_all reference in replace docs (#25161)LazyFrame.collect_schema docstring (#25508)LazyFrame.remote signature (#25175)assert_sql_matches coverage for SQL "DISTINCT" and "DISTINCT ON" syntax (#25440)pl.format on multiple chunks (#25164)group_by aggregations (#25290)group_by(...).having(...) (#25430)make fmt and make lint commands (#25200)Final type-qualifier to module-level constants (#25556)proptest AnyValue strategies (#25510)proptest DataFrame strategy (#25446)proptest strategies for Series logical types (#24849)proptest strategies for Series nested types (#25220)Column::Partitioned (#25324)maturin with --uv option (#25490)ruff and typos and made the necessary lint updates (#25196)pipe_with_schema (#25388)scan_lines (#25066)ElementExpr for _eval expressions (#25199)list.eval on multiple chunks with slicing (#25559)scan_lines (#25136)EwmCov kernel (#25065)ShapeError (#25004)CloudScheme in parse_cloud_options (#25304)Series.set to zip_with_same_dtype (#25327)pipe_with_schema work on Arced schema (#25155)EwmMeanState to polars-compute (#25034)tolerance type coercion to IR conversion (#25033)date_range and related functions (#24084)dt_range functions (#25225)ClosableFile (#25330)PyPartitioning (#25303)Context (#25424)optimization_toggle (#25130)URL_ENCODE_CHARSET to HIVE_ENCODE_CHARSET (#25554)&dyn Any instead of Box<dyn Any> in python object converters (#25421)sync parameter in Writeable::close (#25475)Thank you to all our contributors for making this release possible! @AndreaBozzo, @DannyStoll1, @EndPositive, @JakubValtar, @Jesse-Bakker, @Kevin-Patyk, @MarcoGorelli, @TNieuwdorp, @alexander-beedie, @borchero, @c-peters, @cBournhonesque, @carnarez, @cmdlineluser, @coastalwhite, @cr7pt0gr4ph7, @davanstrien, @dsprenkels, @etiennebacher, @feliblo, @itamarst, @jannickj, @jetuk, @kdn36, @lun3x, @marinegor, @mcrumiller, @nameexhaustion, @orlp, @ritchie46, @vyasr, @wtn and more!
Nothing published for this version
Fix incorrect drop_nans() result when used in group_by() / over()
drop_nans() result when used in group_by() / over() (https://github.com/pola-rs/polars/pull/25146)Null dtype in ApplyExpr on group_by(https://github.com/pola-rs/polars/pull/25077)group_by (https://github.com/pola-rs/polars/pull/25179)Thank you to all our contributors for making this release possible! @coastalwhite, @kdn36, @nameexhaustion and @ritchie46
Don't recompute full rolling moment window when NaNs/nulls leave the window
glimpse to return a DataFrame (#24803)allow_empty flag to item (#25048)SQL interface should use logical, not bitwise, behaviour for unary "NOT" operator (#25091)group_by_dynamic with group_by and multiple chunks (#25075)is_pycapsule utility function (#25073)group_by for ApplyExpr and BinaryExpr (#25053)group_by key values are changed (#25032)AmortSeries (#25043)group_by_dynamic iterator (#25041)ShapeError (#25004)Thank you to all our contributors for making this release possible! @Kevin-Patyk, @Liyixin95, @alexander-beedie, @coastalwhite, @kdn36, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Deprecate Expr.agg_groups() and pl.groups()
unique to native group-by and speed up n_unique in group-by context (#24976)take{_slice,}_unchecked (#24980)skew and kurtosis in group-by context (#24961)bitwise_* operations (#24935)group_by_dynamic slowness in sparse data (#24916)filter/drop_nulls/drop_nans in group-by context (#24897)cumulative_eval using the group-by engine (#24889)Dataframes in DslPlan serialization (#24852)null_count, any and all group-by aggregations (#24859)reverse in group-by context (#24855)first/last on Decimals, Categoricals and Enums (#24786)BitMapIter::nth (#24766)ewm_mean() in streaming engine (#25003)Expr.item to strictly extract a single value from an expression (#24888)scan_iceberg().select(len()) (#24602)glob parameter to scan_ipc (#24898)Dataframes in DslPlan serialization (#24852)list.agg and arr.agg (#24790){Expr,Series}.rolling_rank() (#24776)read_database_uri if ADBC engine version supports PyCapsule interface (#24029)Series init consistent with DataFrame init for string values declared with temporal dtype (#24785)arr.eval (#24472)read_database with the ADBC engine and support iter_batches with the ADBC engine (#24180)separator to {Data,Lazy}Frame.unnest (#24716)union() function for unordered concatenation (#24298)name.replace to the set of column rename options (#17942)np.ndarray -> AnyValue conversion (#24748)DataFrame load from list of dicts (#24739)read_excel workaround for fastexcel/calamine issue loading a column subset from a named table (#25012)any(ignore_nulls) and OOB in all (#25005)join_asof on a casted expression (#25006)ApplyExpr (#24709)Pyarrow scan to in-memory engine (#24991)Operator::swap_operands return correct operators for Plus, Minus, Multiply and Divide (#24997)pct_change (#24952)over with sliced groups (#24887)any / all for group-by (#24940)scan_parquet partially unknown (#24928)read_parquet_metadata (#24922)partition_by columns in over expression (#24874)df.filter expressions (#24870)with_row_index() after scan() silently ignored (#24866)BinaryExpr in group_by dispatch logic (#24548)gather (#24857)group_by (#24819)range feature depend on dtype-array feature (#24853)EvalExpr (#24650)AggState::LiteralScalar (#24820)group_aware for fallible expressions with masked out elements (#24815)arr.sum() on small integer Array dtypes containing nulls (#24478)write_database() to Snowflake due to unsupported string view type (#24622)Series init consistent with DataFrame init for string values declared with temporal dtype (#24785)overlapping instead of rolling (#24787)dynamic_group_by and rolling object (#24740)bitmask::nth_set_bit_u64 (#24775)Expr.sign for Decimal datatype (#24717)str.replace with missing pattern (#24768)schema_overrides is respected when loading iterable row data (#24721)decimal_comma on Decimal type in write_csv (#24718){arr,list}.agg API references (#24970)name.replace examples (#24941)sink_* methods (#24918){unique,value}_counts examples (#24927)pl.field into the api docs (#24846)build_feature_flags.py is included in artifact (#25024)LazyFrame.set_sorted into a FunctionIR::Hint (#24981)Expr.agg_groups() and pl.groups() (#24919)set_ operations (#24850)GroupByPartitioned and dispatch to streaming engine (#24903)element() into {A,}Expr::Element (#24885)ScanOptions to new_from_ipc (#24893)Context in Window expression (#24875)FunctionExpr dispatch from plan to expr (#24839)ApplyExpr (#24825)days_in_month to documentation (#24822)pl.format into proper elementwise expression (#24811)ApplyExpr in group_by context on multiple inputs (#24520)rolling groups to overlapping (#24577)DataType proptest strategies (#24763)union to documentation (#24769)Thank you to all our contributors for making this release possible! @EndPositive, @EnricoMi, @JakubValtar, @Kevin-Patyk, @MarcoGorelli, @Object905, @alexander-beedie, @borchero, @carnarez, @cmdlineluser, @coastalwhite, @craigalodon, @dsprenkels, @eitsupi, @etrotta, @henryharbeck, @jordanosborn, @kdn36, @math-hiyoko, @mjanssen, @nameexhaustion, @orlp, @pavelzw, @r-brink, @ritchie46, @thomasjpfan and @williambdean
Address group_by_dynamic slowness in sparse data
group_by_dynamic slowness in sparse data (#24916)filter/drop_nulls/drop_nans in group-by context (#24897)cumulative_eval using the group-by engine (#24889)Dataframes in DslPlan serialization (#24852)null_count, any and all group-by aggregations (#24859)reverse in group-by context (#24855)first/last on Decimals, Categoricals and Enums (#24786)BitMapIter::nth (#24766)scan_iceberg().select(len()) (#24602)glob parameter to scan_ipc (#24898)Dataframes in DslPlan serialization (#24852)list.agg and arr.agg (#24790){Expr,Series}.rolling_rank() (#24776)read_database_uri if ADBC engine version supports PyCapsule interface (#24029)Series init consistent with DataFrame init for string values declared with temporal dtype (#24785)arr.eval (#24472)read_database with the ADBC engine and support iter_batches with the ADBC engine (#24180)separator to {Data,Lazy}Frame.unnest (#24716)union() function for unordered concatenation (#24298)name.replace to the set of column rename options (#17942)np.ndarray -> AnyValue conversion (#24748)DataFrame load from list of dicts (#24739)read_parquet_metadata (#24922)partition_by columns in over expression (#24874)df.filter expressions (#24870)with_row_index() after scan() silently ignored (#24866)BinaryExpr in group_by dispatch logic (#24548)gather (#24857)group_by (#24819)range feature depend on dtype-array feature (#24853)EvalExpr (#24650)AggState::LiteralScalar (#24820)group_aware for fallible expressions with masked out elements (#24815)arr.sum() on small integer Array dtypes containing nulls (#24478)write_database() to Snowflake due to unsupported string view type (#24622)Series init consistent with DataFrame init for string values declared with temporal dtype (#24785)overlapping instead of rolling (#24787)dynamic_group_by and rolling object (#24740)bitmask::nth_set_bit_u64 (#24775)Expr.sign for Decimal datatype (#24717)str.replace with missing pattern (#24768)schema_overrides is respected when loading iterable row data (#24721)decimal_comma on Decimal type in write_csv (#24718)sink_* methods (#24918){unique,value}_counts examples (#24927)pl.field into the api docs (#24846)set_ operations (#24850)GroupByPartitioned and dispatch to streaming engine (#24903)element() into {A,}Expr::Element (#24885)ScanOptions to new_from_ipc (#24893)Context in Window expression (#24875)FunctionExpr dispatch from plan to expr (#24839)ApplyExpr (#24825)days_in_month to documentation (#24822)pl.format into proper elementwise expression (#24811)ApplyExpr in group_by context on multiple inputs (#24520)rolling groups to overlapping (#24577)DataType proptest strategies (#24763)union to documentation (#24769)Thank you to all our contributors for making this release possible! @JakubValtar, @Kevin-Patyk, @MarcoGorelli, @Object905, @alexander-beedie, @borchero, @cmdlineluser, @coastalwhite, @craigalodon, @dsprenkels, @eitsupi, @etrotta, @henryharbeck, @jordanosborn, @kdn36, @math-hiyoko, @nameexhaustion, @orlp, @pavelzw, @ritchie46, @thomasjpfan and @williambdean
Add LazyFrame.{sink,collect}_batches
LazyFrame.{sink,collect}_batches (#23980)gather_every (#24700)strptime if input is literal (#24694)groups call in aggregated (#24651)scan_iceberg with filter based on metadata statistics (#24547).mode() expression (#24459)dt.total_{}() duration values as fractionals (#24598)pyarrow dependency in read_excel when using the default "calamine" engine (#24655)file:/path URIs (#24603)LazyFrame.{sink,collect}_batches (#23980)hidden_file_prefix parameter to scan_parquet (#24507)pl.Config.set_default_credential_provider (#24434)BinaryOffset type through Parquet (#24344)Struct (#24320)unique / n_unique / arg_unique for array columns (#24406)Decimal with comma as decimal separator in CSV (#24685)Categories pickleable (#24691)AggregatedScalar in ApplyExpr single input (#24634)setuptools (#24656)GenericFirstLastGroupedReduction (#24590)dt.month_end was unnecessarily raising when the month-start timestamp was ambiguous (#24647)from_dicts to Iterable[Mapping[str, Any]] (#24584)unsupported arrow type Dictionary error in scan_iceberg() (#24573)polars-stream/diff to polars-plan/abs (#24613)-1) the dimension on any Expr.reshape dimension except the first (#24591)scan_iceberg() storage options not taking effect (#24574)log() prioritize the leftmost dtype for its output dtype (#24581)PlPath::join for cloud paths replace on absolute paths (#24514)AggState on all_literal in BinaryExpr (#24461)explain (#24465)ApplyExpr with single row literal in agg context (#24422)pl.Float32 by int (#24432)iterable_to_pydf(..., infer_schema_length=None) to scan all data (#23405)ignore_errors=False (#24404)approx_n_unique for temporal dtypes and Null (#24417)avg_birthday -> avg_age in examples aggregation (#23726)set_expr_depth_warning docstring (#24427)test_multiple_sorting_columns test runnable (#24719){Upper,Lower}Bound expressions in IR (#24701)uv pip option syntax (#24711)polars-expr output field resolution (#24661)sed ampersand in release script (#24631)UnknownKind::Ufunc (#24614)to_field for element and struct field context (#24592)pl.concat (#24487)as_struct on aggstates (#24493)PlanCallback in name.map_* (#24484)xlsvwriter to 3.2.5 or before (#24485)Thank you to all our contributors for making this release possible! @DeflateAwning, @Gusabary, @JakubValtar, @Kevin-Patyk, @MarcoGorelli, @Matt711, @alexander-beedie, @alonsosilvaallende, @andreseje, @borchero, @c-peters, @camriddell, @coastalwhite, @dangotbanned, @deanm0000, @dongchao-1, @dsprenkels, @eitsupi, @itamarst, @jan-krueger, @joshuamarkovic, @juansolm, @kdn36, @moizescbf, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Add LazyFrame.{sink,collect}_batches
LazyFrame.{sink,collect}_batches (#23980)strptime if input is literal (#24694)groups call in aggregated (#24651)scan_iceberg with filter based on metadata statistics (#24547).mode() expression (#24459)dt.total_{}() duration values as fractionals (#24598)pyarrow dependency in read_excel when using the default "calamine" engine (#24655)file:/path URIs (#24603)LazyFrame.{sink,collect}_batches (#23980)hidden_file_prefix parameter to scan_parquet (#24507)pl.Config.set_default_credential_provider (#24434)BinaryOffset type through Parquet (#24344)Struct (#24320)unique / n_unique / arg_unique for array columns (#24406)Categories pickleable (#24691)AggregatedScalar in ApplyExpr single input (#24634)setuptools (#24656)GenericFirstLastGroupedReduction (#24590)dt.month_end was unnecessarily raising when the month-start timestamp was ambiguous (#24647)from_dicts to Iterable[Mapping[str, Any]] (#24584)unsupported arrow type Dictionary error in scan_iceberg() (#24573)polars-stream/diff to polars-plan/abs (#24613)-1) the dimension on any Expr.reshape dimension except the first (#24591)scan_iceberg() storage options not taking effect (#24574)log() prioritize the leftmost dtype for its output dtype (#24581)PlPath::join for cloud paths replace on absolute paths (#24514)AggState on all_literal in BinaryExpr (#24461)explain (#24465)ApplyExpr with single row literal in agg context (#24422)pl.Float32 by int (#24432)iterable_to_pydf(..., infer_schema_length=None) to scan all data (#23405)ignore_errors=False (#24404)approx_n_unique for temporal dtypes and Null (#24417)avg_birthday -> avg_age in examples aggregation (#23726)set_expr_depth_warning docstring (#24427)polars-expr output field resolution (#24661)sed ampersand in release script (#24631)UnknownKind::Ufunc (#24614)to_field for element and struct field context (#24592)pl.concat (#24487)as_struct on aggstates (#24493)PlanCallback in name.map_* (#24484)xlsvwriter to 3.2.5 or before (#24485)Thank you to all our contributors for making this release possible! @DeflateAwning, @Gusabary, @JakubValtar, @Kevin-Patyk, @MarcoGorelli, @Matt711, @alexander-beedie, @alonsosilvaallende, @borchero, @c-peters, @camriddell, @coastalwhite, @dangotbanned, @deanm0000, @dongchao-1, @dsprenkels, @eitsupi, @itamarst, @jan-krueger, @joshuamarkovic, @juansolm, @kdn36, @moizescbf, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Add LazyFrame.{sink,collect}_batches
LazyFrame.{sink,collect}_batches (#23980)scan_iceberg with filter based on metadata statistics (#24547).mode() expression (#24459)file:/path URIs (#24603)LazyFrame.{sink,collect}_batches (#23980)hidden_file_prefix parameter to scan_parquet (#24507)pl.Config.set_default_credential_provider (#24434)BinaryOffset type through Parquet (#24344)Struct (#24320)unique / n_unique / arg_unique for array columns (#24406)from_dicts to Iterable[Mapping[str, Any]] (#24584)unsupported arrow type Dictionary error in scan_iceberg() (#24573)polars-stream/diff to polars-plan/abs (#24613)-1) the dimension on any Expr.reshape dimension except the first (#24591)scan_iceberg() storage options not taking effect (#24574)log() prioritize the leftmost dtype for its output dtype (#24581)PlPath::join for cloud paths replace on absolute paths (#24514)AggState on all_literal in BinaryExpr (#24461)explain (#24465)ApplyExpr with single row literal in agg context (#24422)pl.Float32 by int (#24432)iterable_to_pydf(..., infer_schema_length=None) to scan all data (#23405)ignore_errors=False (#24404)approx_n_unique for temporal dtypes and Null (#24417)avg_birthday -> avg_age in examples aggregation (#23726)set_expr_depth_warning docstring (#24427)sed ampersand in release script (#24631)UnknownKind::Ufunc (#24614)to_field for element and struct field context (#24592)pl.concat (#24487)as_struct on aggstates (#24493)PlanCallback in name.map_* (#24484)xlsvwriter to 3.2.5 or before (#24485)Thank you to all our contributors for making this release possible! @Gusabary, @Kevin-Patyk, @Matt711, @MoizesCBF, @alonsosilvaallende, @borchero, @c-peters, @camriddell, @coastalwhite, @dangotbanned, @deanm0000, @dongchao-1, @dsprenkels, @itamarst, @jan-krueger, @joshuamarkovic, @juansolm, @kdn36, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Add LazyFrame.{sink,collect}_batches
LazyFrame.{sink,collect}_batches (#23980)scan_iceberg with filter based on metadata statistics (#24547).mode() expression (#24459)file:/path URIs (#24603)LazyFrame.{sink,collect}_batches (#23980)hidden_file_prefix parameter to scan_parquet (#24507)pl.Config.set_default_credential_provider (#24434)BinaryOffset type through Parquet (#24344)Struct (#24320)unique / n_unique / arg_unique for array columns (#24406)from_dicts to Iterable[Mapping[str, Any]] (#24584)unsupported arrow type Dictionary error in scan_iceberg() (#24573)polars-stream/diff to polars-plan/abs (#24613)-1) the dimension on any Expr.reshape dimension except the first (#24591)scan_iceberg() storage options not taking effect (#24574)log() prioritize the leftmost dtype for its output dtype (#24581)PlPath::join for cloud paths replace on absolute paths (#24514)AggState on all_literal in BinaryExpr (#24461)explain (#24465)ApplyExpr with single row literal in agg context (#24422)pl.Float32 by int (#24432)iterable_to_pydf(..., infer_schema_length=None) to scan all data (#23405)ignore_errors=False (#24404)approx_n_unique for temporal dtypes and Null (#24417)avg_birthday -> avg_age in examples aggregation (#23726)set_expr_depth_warning docstring (#24427)sed ampersand in release script (#24631)UnknownKind::Ufunc (#24614)to_field for element and struct field context (#24592)pl.concat (#24487)as_struct on aggstates (#24493)PlanCallback in name.map_* (#24484)xlsvwriter to 3.2.5 or before (#24485)Thank you to all our contributors for making this release possible! @Gusabary, @Kevin-Patyk, @Matt711, @MoizesCBF, @alonsosilvaallende, @borchero, @c-peters, @camriddell, @coastalwhite, @dangotbanned, @deanm0000, @dongchao-1, @dsprenkels, @itamarst, @jan-krueger, @joshuamarkovic, @juansolm, @kdn36, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Nothing published for this version
Add LazyFrame.{sink,collect}_batches
LazyFrame.{sink,collect}_batches (#23980)scan_iceberg with filter based on metadata statistics (#24547).mode() expression (#24459)LazyFrame.{sink,collect}_batches (#23980)hidden_file_prefix parameter to scan_parquet (#24507)pl.Config.set_default_credential_provider (#24434)BinaryOffset type through Parquet (#24344)Struct (#24320)unique / n_unique / arg_unique for array columns (#24406)PlPath::join for cloud paths replace on absolute paths (#24514)AggState on all_literal in BinaryExpr (#24461)explain (#24465)ApplyExpr with single row literal in agg context (#24422)pl.Float32 by int (#24432)iterable_to_pydf(..., infer_schema_length=None) to scan all data (#23405)ignore_errors=False (#24404)approx_n_unique for temporal dtypes and Null (#24417)avg_birthday -> avg_age in examples aggregation (#23726)set_expr_depth_warning docstring (#24427)pl.concat (#24487)as_struct on aggstates (#24493)PlanCallback in name.map_* (#24484)xlsvwriter to 3.2.5 or before (#24485)Thank you to all our contributors for making this release possible! @Gusabary, @Kevin-Patyk, @Matt711, @alonsosilvaallende, @borchero, @c-peters, @camriddell, @coastalwhite, @dongchao-1, @dsprenkels, @itamarst, @jan-krueger, @joshuamarkovic, @juansolm, @kdn36, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Wrap deprecated top-level imports in TYPE\_CHECKING
__arrow_c_schema__ interface to pl.Schema (#24365)pre_execution_query parameter to read_database_uri (#23634)sink_ipc overload for compression (#24398)by parameter in join_asof (#24384)Series.__arrow_c_stream__ for Decimal and other logical types (#24120)Struct arithmetic (#23805)read_database_uri with ADBC works as expected with DuckDB URIs (#24097)Sequence for columns parameter in read_excel (#23967)is_pure parameter for register_io_source (#24311)polars module (#24332)Excel sheet data (#24145)read_database (#24094)InteractiveQuery to DirectQuery (#24287)PYPOLARS_VERSION on version assert test (#24313)Thank you to all our contributors for making this release possible! @Kevin-Patyk, @VictorAtIfInsurance, @alexander-beedie, @coastalwhite, @dsprenkels, @itamarst, @kdn36, @kuril, @mcrumiller, @nameexhaustion, @nesb1, @orlp, @r-brink and @ritchie46
Remove, deprecate or change eager Exprs to be lazy compatible
Exprs to be lazy compatible (#24027)int_range with len or count (#24280)arg_unique natively to the streaming engine (#24279)pipe_with_schema (#24213)arg_where natively to streaming engine (#24088)mkdir parameter on write_parquet (#24239)write_database with the ADBC engine (#24136)LazyFrame.pipe_with_schema (#24075)BytecodeParser function analysis (#24076)cum_* as native streaming nodes (#23977)DataFrame.map_columns for eager evaluation (#23821)dt.epoch('s') serializable (#24302)Expr.rechunk serializable (#24303)from_pandas overload for include_index (#24258)slice on Literal in agg context (#24137)filter(lit(True)) when scanning hive (#24237)gather inside groupby with invalid indices (#24182)LazyGroupBy.{head,tail} (#24221)concat_list on AggScalar implode (#24160)is_in predicate for Parquet plain strings (#24184)to_mutable_slice (#24173)sort_by for group_by_dynamic context (#24152)group_by/partition_by iterator keys tuple[Any, ...] to enable tuple-unpacking (#24113)reshape_list (#24078)merge_sorted for all types (#24077)row_encode expression (#24074).rolling() output type for non-aggregations (#24072)join_asof (#24071)fold and reduce (#24069)pl.Date default to microsecond precision (#23981)mean with strange input type (#24052)Exprs to be lazy compatible (#24027)LazyFrame.pipe_with_schema() on the website (#24285)doctest.ELLIPSIS so we don't have to add the inline directive each time (#24146)Seriers.rolling_*_by methods (#24254)DataFrame/Series constructors in from_arrow docstring (#22942)DataFrame.map_columns to API (#24128)str.find_many() docstring example (#24092)Wrap (#24214)order_sensitive property for AExpr (#24116)AggExpr::Count from tuple to struct (#24096)deltalake (#24018)Thank you to all our contributors for making this release possible! @Kevin-Patyk, @MarcoGorelli, @NeejWeej, @agossard, @alexander-beedie, @aparna2198, @borchero, @coastalwhite, @deanm0000, @dsprenkels, @eitsupi, @etiennebacher, @gab23r, @henryharbeck, @jjurm, @kdn36, @math-hiyoko, @mcrumiller, @mroeschke, @nameexhaustion, @orlp, @r-brink, @ritchie46, @stijnherfst, @vdrn and @wence-
Remove, deprecate or change eager Exprs to be lazy compatible
Exprs to be lazy compatible (#24027)pipe_with_schema (#24213)arg_where natively to streaming engine (#24088)mkdir parameter on write_parquet (#24239)write_database with the ADBC engine (#24136)LazyFrame.pipe_with_schema (#24075)BytecodeParser function analysis (#24076)cum_* as native streaming nodes (#23977)DataFrame.map_columns for eager evaluation (#23821)slice on Literal in agg context (#24137)filter(lit(True)) when scanning hive (#24237)gather inside groupby with invalid indices (#24182)LazyGroupBy.{head,tail} (#24221)concat_list on AggScalar implode (#24160)is_in predicate for Parquet plain strings (#24184)to_mutable_slice (#24173)sort_by for group_by_dynamic context (#24152)group_by/partition_by iterator keys tuple[Any, ...] to enable tuple-unpacking (#24113)reshape_list (#24078)merge_sorted for all types (#24077)row_encode expression (#24074).rolling() output type for non-aggregations (#24072)join_asof (#24071)fold and reduce (#24069)pl.Date default to microsecond precision (#23981)mean with strange input type (#24052)Exprs to be lazy compatible (#24027)DataFrame/Series constructors in from_arrow docstring (#22942)DataFrame.map_columns to API (#24128)str.find_many() docstring example (#24092)Wrap (#24214)order_sensitive property for AExpr (#24116)AggExpr::Count from tuple to struct (#24096)deltalake (#24018)Thank you to all our contributors for making this release possible! @Kevin-Patyk, @agossard, @alexander-beedie, @aparna2198, @borchero, @coastalwhite, @deanm0000, @dsprenkels, @henryharbeck, @jjurm, @kdn36, @math-hiyoko, @mcrumiller, @mroeschke, @nameexhaustion, @orlp, @r-brink, @ritchie46, @stijnherfst, @vdrn and @wence-
Lower .sort(maintain\_order=True).head() to streaming top\_k
peaks_{min,max} (#24039)DataTypeExpr.default_value (#23973)rle to a native streaming engine node (#23929)Int128 to pyo3-polars (#23959)null datatype (#24065)lit (#23941)eval.list in aggregation context (#23911)truediv dtypes so cast in list.eval is not dropped (#23936)return_dtype for expanded map expressions (#24010)map_elements with and without return_dtype (#24007)csv_write segfault on Categorical (#23986)LazyGroupBy.map_groups (#23964)PyCapsule (#23968)write function for windows (#23915)unpivot panic when index= column not found (#23958)_plr.pyi to remove mypy issues (#23970)atol and rtol to abs_tol and rel_tol (#23961)Row{Encode,Decode} as FunctionExpr (#23933)pl.map_batches and AnonymousColumnsUdf (#23867)Thank you to all our contributors for making this release possible! @JakubValtar, @Kevin-Patyk, @borchero, @cmdlineluser, @coastalwhite, @iishutov, @jarondl, @kdn36, @orlp, @rawhuul, @ritchie46 and @stijnherfst
Return correct python package version
arr.len() on the website (#23944)Thank you to all our contributors for making this release possible! @coastalwhite and @etiennebacher
Add DeprecationWarning on passing physical ordering to Categorical
BytecodeParser usage from warn_on_inefficient_map (#23809)rle_id to a native streaming node (#23894)endpoint_url loaded from CredentialProviderAWS to scan/write_delta (#23812)scan_iceberg to native by default (#23912)unique_counts and value_counts to streaming engine (#23890)__arrow_c_schema__ protocol in pl.Schema (#23879)show_versions (#23885)dt.days_in_month function (#23119)Expr.rolling_*_by methods available to pl.Series (#23742)scan_iceberg (#23811)rolling_map serializable (#23848)CachingCredentialProvider returns copied credentials dict (#23817).remote() from LazyFrameExt to LazyFrameRemote (#23825)repeat_by for Array and Null (#23794)BytecodeParser opcode awareness for upcoming Python 3.14 (#23782)Enum columns (#23925)read_csv ignoring Decimal schema for header-only data (#23886)collect() native Iceberg always scans latest when no snapshot_id is given (#23907)GROUP BY queries (#23191)scan_iceberg (#23811)hive_start_idx parameter (#23843)pl.Enum with smaller physicals (#23829)meta.pop operate on Expr only (#23808)DslPlan serde (#23801)pyo3 documentation page link (#23839)name.* methods on their removal of aliases (#23773)make requirements on Python 3.13 (#23810)clippy and rustfmt run in CI when changing pyo3-polars (#23930)evaluate_on_groups for .gather / .get (#23700)python-polars (#23876)LRUCache implementation and move into "_utils" module (#23813)numba (#23838)typos package (#23818)deserialize_with_unknown_fields (#23802)Thank you to all our contributors for making this release possible! @JakubValtar, @Kevin-Patyk, @Liyixin95, @alexander-beedie, @cgevans, @cmdlineluser, @coastalwhite, @eitsupi, @gfvioli, @itamarst, @jimmmmmmmmmmmy, @kdn36, @math-hiyoko, @mcrumiller, @mpasa, @mrkn, @nameexhaustion, @orlp, @pka, @pomo-mondreganto, @ritchie46 and @stijnherfst
Fix str.replace_many examples trigger deprecation warning
Selector a concrete part of the DSL (#23351)Column repr in ColumnTransform operations (#23648)is_in values in Parquet predicates (#23293)Bitmap::make_mut (#23138)DataTypeExpr (#23249)POLARS_DOT_SVG_VIEWER to automatically dispatch to SVG viewer (#23592)arr namespace (#23486)vec_hash for List and Array (#23578)pl.row_index() expression (#23556)return_dtype set (#23353)pathlib.Path as source for read/scan_delta() (#23411)ScanCastOptions for native scan_iceberg() (#23416)ExprRegistry (#23412)scan_delta() (#23398)cast_options is given (#23356)scan_parquet().collect_schema() for read_parquet_schema (#23359)arr.slice, arr.head and arr.tail methods to arr namespace (#23150)is_close method (#23273)drop_nulls option to to_dummies (#23215)length parameter in pad_start, pad_end, and zfill (#23182)_expiry_time from botocore Credentials in CredentialProviderAWS (#23753)to_datetime() fallible identification (#23735)dt.with_time_unit (#23734)interpolate on Decimal (#23706)with_exprs_and_input and pruning (#23710)cum_sum_horizontal (#23686)pl.struct in group-by (#23703)str.extract_groups with empty string pattern (#23698)rolling_map (#23702)DeltaTable._storage_options (#23673)BusinessDaycount (#23679)strptime (#23676)with_exprs_and_input (#23675)name.keep (#23670)Map containing timestamps (#23662)self part of list.eval (#23668)ToInteger (#23664)decimal_comma with , separator in read_csv (#23657)write_csv to IO[str] (#23647){Lazy,Data}Frame.filter (#23631)col().cast() (#23622)when/then in group_by context (#23628)agg_fn on null values in pivot (#23586)n=0 in all cases of str.replace (#23598)join_asof with by followed by head/slice (#23585)get_index_type() from DataType to PolarsIntegerType (#23558)Expr.append serializable (#23515)copy_exprs and with_exprs_and_input (#23511)pl.self_dtype (#23507)Int128 roundtrippable via Parquet (#23494)read_csv_batched respect skip_rows and skip_lines (#23484)cloudpickle for the python objects in cloud plans (#23474)finish_callback with nested datatypes (#23464)DeltaTable._storage_options if no storage_options are provided (#23456)_get_path_scheme (#23444)read_ods and tree_format (#23442)ScanCastOptions for native scan_iceberg() (#23416)nearest interpolation (#23418)eager default in Schema.to_frame was False instead of True (#23413)read_excel overloads so that passing list[str] to sheet_name does not raise (#23388)group_by aggregation on empty groups (#23358)min() in group_by aggregation (streaming) (#23344)map_elements (#23340)PlPath (#23350)bitwise aggregation on bools (#23324)glob=False (#23304)get_normal_components (#23284)concat_arr inputs expansion (#23271)dt.iso_year and dt.is_leap_year (#23125)str.replace_many examples trigger deprecation warning (#23695)from_pandas about data being cloned (#23552)Expr.language is in a different section (#23377)join_where (#23375)AExpr::is_expr_equal_to (#23740)ALLOW_GROUP_AWARE flag (#23690)evaluate_inline (#23687)AggregationContext (#23685)node_to_lp (#23678)agg_list in AExpr::to_field with is_scalar_ae (#23582)write_disk (#23566)list.to_struct and arr.to_struct serializable (#23504)arg_min, arg_max, arg_sort and product into concrete DSL and IR constructs (#23493)Selector a concrete part of the DSL (#23351)ExprIR once in with_columns (#23352)PlPath that abstracts over PathBuf and URI (#23280)may_fail_cloud mark for pytest (#23279)dsl_to_ir logic into modules (#23277)assert_dataframe_equal() to Rust back-end (#23207)dt.iso_year and dt.is_leap_year (#23125)Thank you to all our contributors for making this release possible! @Declow, @JakubValtar, @Kevin-Patyk, @Liyixin95, @MarcoGorelli, @Matt711, @TheLostLambda, @Washiil, @borchero, @c-peters, @cmdlineluser, @coastalwhite, @deanm0000, @eitsupi, @etiennebacher, @florian-klein, @gfvioli, @habaneraa, @itamarst, @kdn36, @ldhwaddell, @math-hiyoko, @mcrumiller, @mrkn, @nameexhaustion, @orlp, @othijssens, @r-brink, @ritchie46, @stijnherfst and @zyctree
Fix str.replace_many examples trigger deprecation warning
Selector a concrete part of the DSL (#23351)Column repr in ColumnTransform operations (#23648)is_in values in Parquet predicates (#23293)Bitmap::make_mut (#23138)DataTypeExpr (#23249)POLARS_DOT_SVG_VIEWER to automatically dispatch to SVG viewer (#23592)arr namespace (#23486)vec_hash for List and Array (#23578)pl.row_index() expression (#23556)return_dtype set (#23353)pathlib.Path as source for read/scan_delta() (#23411)ScanCastOptions for native scan_iceberg() (#23416)ExprRegistry (#23412)scan_delta() (#23398)cast_options is given (#23356)scan_parquet().collect_schema() for read_parquet_schema (#23359)arr.slice, arr.head and arr.tail methods to arr namespace (#23150)is_close method (#23273)drop_nulls option to to_dummies (#23215)length parameter in pad_start, pad_end, and zfill (#23182)_expiry_time from botocore Credentials in CredentialProviderAWS (#23753)to_datetime() fallible identification (#23735)dt.with_time_unit (#23734)interpolate on Decimal (#23706)with_exprs_and_input and pruning (#23710)cum_sum_horizontal (#23686)pl.struct in group-by (#23703)str.extract_groups with empty string pattern (#23698)rolling_map (#23702)DeltaTable._storage_options (#23673)BusinessDaycount (#23679)strptime (#23676)with_exprs_and_input (#23675)name.keep (#23670)Map containing timestamps (#23662)self part of list.eval (#23668)ToInteger (#23664)decimal_comma with , separator in read_csv (#23657)write_csv to IO[str] (#23647){Lazy,Data}Frame.filter (#23631)col().cast() (#23622)when/then in group_by context (#23628)agg_fn on null values in pivot (#23586)n=0 in all cases of str.replace (#23598)join_asof with by followed by head/slice (#23585)get_index_type() from DataType to PolarsIntegerType (#23558)Expr.append serializable (#23515)copy_exprs and with_exprs_and_input (#23511)pl.self_dtype (#23507)Int128 roundtrippable via Parquet (#23494)read_csv_batched respect skip_rows and skip_lines (#23484)cloudpickle for the python objects in cloud plans (#23474)finish_callback with nested datatypes (#23464)DeltaTable._storage_options if no storage_options are provided (#23456)_get_path_scheme (#23444)read_ods and tree_format (#23442)ScanCastOptions for native scan_iceberg() (#23416)nearest interpolation (#23418)eager default in Schema.to_frame was False instead of True (#23413)read_excel overloads so that passing list[str] to sheet_name does not raise (#23388)group_by aggregation on empty groups (#23358)min() in group_by aggregation (streaming) (#23344)map_elements (#23340)PlPath (#23350)bitwise aggregation on bools (#23324)glob=False (#23304)get_normal_components (#23284)concat_arr inputs expansion (#23271)dt.iso_year and dt.is_leap_year (#23125)str.replace_many examples trigger deprecation warning (#23695)from_pandas about data being cloned (#23552)Expr.language is in a different section (#23377)join_where (#23375)AExpr::is_expr_equal_to (#23740)ALLOW_GROUP_AWARE flag (#23690)evaluate_inline (#23687)AggregationContext (#23685)node_to_lp (#23678)agg_list in AExpr::to_field with is_scalar_ae (#23582)write_disk (#23566)list.to_struct and arr.to_struct serializable (#23504)arg_min, arg_max, arg_sort and product into concrete DSL and IR constructs (#23493)Selector a concrete part of the DSL (#23351)ExprIR once in with_columns (#23352)PlPath that abstracts over PathBuf and URI (#23280)may_fail_cloud mark for pytest (#23279)dsl_to_ir logic into modules (#23277)assert_dataframe_equal() to Rust back-end (#23207)dt.iso_year and dt.is_leap_year (#23125)Thank you to all our contributors for making this release possible! @Declow, @JakubValtar, @Kevin-Patyk, @Liyixin95, @MarcoGorelli, @Matt711, @TheLostLambda, @Washiil, @borchero, @c-peters, @cmdlineluser, @coastalwhite, @deanm0000, @eitsupi, @etiennebacher, @florian-klein, @gfvioli, @habaneraa, @itamarst, @kdn36, @ldhwaddell, @math-hiyoko, @mcrumiller, @mrkn, @nameexhaustion, @orlp, @othijssens, @r-brink, @ritchie46, @stijnherfst and @zyctree
Deprecate allow_missing_columns in scan_parquet in favor of missing_columns
allow_missing_columns in scan_parquet in favor of missing_columns (#22784)index_of (#22903)null scans and arg_max for bools (when chunked) (#22897)DataTypeExpr in Rust DSL (#23049)required: bool to ParquetFieldOverwrites (#23013)name.map_fields (#22997)Expr::RenameAlias (#22988)FetchedCredentialsCache (#22973)keys column in finish_callback (#22968)extra_columns parameter to scan_parquet (#22699)show_graph (#23218)show_graph (#23210)aggregate_function in pivot to pl.element() (#23155)SourceToken in in-memory sink linearize (#23201)truncate when mixing month/week/day/sub-daily units (#23176)list.eval with unknown type (#23186)list.concat (#23137)__HIVE_DEFAULT_PARTITION__ (#23074)AssertionError when using scan_delta() on AWS with storage_options (#23076)collect(background=True) / collect_concurrently() (#23075)file:// in LazyFrame node traverser (#23072)register_io_source schema (#23057)__arrow_c_array__ (#23069)sort with group_by and cum_sum (#23001)include_nulls to Agg::Count CSE check (#23032)pl.len() from scan_csv with skip_lines (#22949)str.zfill was inconsistent with Python and pandas when string contained leading '+' (#22985)propagate_nulls (#22986)compat_level=0 for sink_ipc (#22960)DataType.is_, improve Pyright's type completeness from 69% to 95% (#22962)pl.Expr.__array_ufunc__ when only single input (#22913)int_ranges to raise error on invalid inputs (#22894)write_csv with storage_options (#22881).over(mapping_strategy="join") with non-aggregations (#22875)Expr.replace_all in replace_strict docs (#23144)cum_count docstring example (#23099)DataFrame.__setitem__ to API reference (#22938)__getitem__ (#22924)top_k_by and bottom_k_by to Series reference (#22917)pyo3 and numpy crates to version 0.25 (#22763)ir_serde by default (#23046)serde_ignored (#22957)default_alloc feature to py-polars (#23202)FixedSizeList with Array (#23168)assert_series_equal() to Rust back-end (#23141)ir_serde instead of serde for IRFunctionExpr (#23148)FunctionExpr and IRFunctionExpr (#23140)AExpr::Alias (#23070)StructFunction::JsonEncode (#23060)pl.cumulative_eval into its own AExpr (#22994)Hash and use SpecialEq for RenameAliasFn (#22989)list.eval into an AExpr (#22911)expr.meta (#22906)Thank you to all our contributors for making this release possible! @Athsus, @DahaoALG, @FabianWolff, @JakubValtar, @Kevin-Patyk, @MarcoGorelli, @SanjitBasker, @alexander-beedie, @bschoenmaeckers, @coastalwhite, @deanm0000, @dsprenkels, @eitsupi, @florian-klein, @i1oveMyse1f, @ion-elgreco, @itamarst, @kdn36, @kutal10, @mcrumiller, @mroeschke, @nameexhaustion, @nikaltipar, @orlp, @paskhaver, @ritchie46, @stijnherfst and @thomasfrederikhoeck
Deprecate allow_missing_columns in scan_parquet in favor of missing_columns
allow_missing_columns in scan_parquet in favor of missing_columns (#22784)index_of (#22903)null scans and arg_max for bools (when chunked) (#22897)DataTypeExpr in Rust DSL (#23049)required: bool to ParquetFieldOverwrites (#23013)name.map_fields (#22997)Expr::RenameAlias (#22988)FetchedCredentialsCache (#22973)keys column in finish_callback (#22968)extra_columns parameter to scan_parquet (#22699)truncate when mixing month/week/day/sub-daily units (#23176)list.eval with unknown type (#23186)list.concat (#23137)__HIVE_DEFAULT_PARTITION__ (#23074)AssertionError when using scan_delta() on AWS with storage_options (#23076)collect(background=True) / collect_concurrently() (#23075)file:// in LazyFrame node traverser (#23072)register_io_source schema (#23057)__arrow_c_array__ (#23069)sort with group_by and cum_sum (#23001)include_nulls to Agg::Count CSE check (#23032)pl.len() from scan_csv with skip_lines (#22949)str.zfill was inconsistent with Python and pandas when string contained leading '+' (#22985)propagate_nulls (#22986)compat_level=0 for sink_ipc (#22960)DataType.is_, improve Pyright's type completeness from 69% to 95% (#22962)pl.Expr.__array_ufunc__ when only single input (#22913)int_ranges to raise error on invalid inputs (#22894)write_csv with storage_options (#22881).over(mapping_strategy="join") with non-aggregations (#22875)Expr.replace_all in replace_strict docs (#23144)cum_count docstring example (#23099)DataFrame.__setitem__ to API reference (#22938)__getitem__ (#22924)top_k_by and bottom_k_by to Series reference (#22917)pyo3 and numpy crates to version 0.25 (#22763)ir_serde by default (#23046)serde_ignored (#22957)FixedSizeList with Array (#23168)assert_series_equal() to Rust back-end (#23141)ir_serde instead of serde for IRFunctionExpr (#23148)FunctionExpr and IRFunctionExpr (#23140)AExpr::Alias (#23070)StructFunction::JsonEncode (#23060)pl.cumulative_eval into its own AExpr (#22994)Hash and use SpecialEq for RenameAliasFn (#22989)list.eval into an AExpr (#22911)expr.meta (#22906)Thank you to all our contributors for making this release possible! @Athsus, @DahaoALG, @FabianWolff, @JakubValtar, @Kevin-Patyk, @MarcoGorelli, @SanjitBasker, @alexander-beedie, @bschoenmaeckers, @coastalwhite, @deanm0000, @dsprenkels, @eitsupi, @florian-klein, @i1oveMyse1f, @ion-elgreco, @itamarst, @kdn36, @kutal10, @mroeschke, @nameexhaustion, @nikaltipar, @orlp, @paskhaver, @ritchie46, @stijnherfst and @thomasfrederikhoeck
Support PEP702 @deprecated decorator behaviour
list.eval (#22715)Mapping objects in from_records and frame/series constructors (#22638)maintain_order in group-by followed by sort (#22492)endpoint_url using boto3 (#22851)list.filter (#22749)nulls_equal flag to list/arr.contains (#22773)LazyFrame.match_to_schema (#22726).over to be called without partition_by (#22712)AnyValue translation from PyMapping values (#22722)Mapping objects in from_records and frame/series constructors (#22638)Int128 dtype from databases that support it (#22682)cast_options parameter to control type casting in scan_parquet (#22617)List<UInt8> to Binary (#22611)POLARS_REGEX_SIZE_LIMIT (#22651)Series.zip_with (#22632)@deprecated decorator behaviour (#22594)pl.Array (#22575)fill_null after when.then on structs (#22798)PartitionByKey and PartitionParted (#22778)Enum categories on append (#22765)Schema init (#22589)unnest error message (#22740)DataFrame, even if empty JSON (#22739)is_not_nan check made in drop_nans (#22707)count(*) with partition by (#22728)str.replace_many with Mapping as deprecated (#22697)index out of bounds panic when scanning hugging face (#22661)group_by with literal and empty rows (#22621)drop_nulls() and drop_nans() (#22469)get() SchemaMismatch panic (#22350)new_streaming feature to polars crate (#22601)dt.truncate (except weekly buckets which start on Mondays) (#22592)replace and replace_strict mapping use list literals (#22566)Time column (#22550)match_to_schema to API reference (#22777)value_counts "normalize" parameter (#22756)drop/fill for nulls/nans (#22657)RoundMode parameter in round (#22555)repeat_by to API reference, fixup list.get (#22698)scan_iceberg (#22694)insert_column docstring (description and examples) (#22551)join documentation (#22556)polars-lazy with certain features (#22846)nix build (#22809)list.eval performance test (#22729).write_* to .lazy().sink_*(engine='in-memory') (#22582)QueryOptFlags (#22680)str.replace_many (#22615)sink_* (#22643)proptest testing for for parquet decoding kernels (#22608).collect(_eager=True) (#22602)in-memory-map (#22552)Thank you to all our contributors for making this release possible! @IvanIsCoding, @JakubValtar, @Julian-J-S, @LucioFranco, @MarcoGorelli, @WH-2099, @alexander-beedie, @borchero, @bschoenmaeckers, @cmdlineluser, @coastalwhite, @etiennebacher, @florian-klein, @itamarst, @kdn36, @mcrumiller, @nameexhaustion, @nikaltipar, @orlp, @pavelzw, @r-brink, @ritchie46, @stijnherfst, @teotwaki, @timkpaine and @wence-
Support PEP702 @deprecated decorator behaviour
list.eval (#22715)Mapping objects in from_records and frame/series constructors (#22638)maintain_order in group-by followed by sort (#22492)nulls_equal flag to list/arr.contains (#22773)LazyFrame.match_to_schema (#22726).over to be called without partition_by (#22712)AnyValue translation from PyMapping values (#22722)Mapping objects in from_records and frame/series constructors (#22638)Int128 dtype from databases that support it (#22682)cast_options parameter to control type casting in scan_parquet (#22617)POLARS_REGEX_SIZE_LIMIT (#22651)Series.zip_with (#22632)@deprecated decorator behaviour (#22594)pl.Array (#22575)PartitionByKey and PartitionParted (#22778)Enum categories on append (#22765)Schema init (#22589)unnest error message (#22740)DataFrame, even if empty JSON (#22739)is_not_nan check made in drop_nans (#22707)count(*) with partition by (#22728)str.replace_many with Mapping as deprecated (#22697)index out of bounds panic when scanning hugging face (#22661)group_by with literal and empty rows (#22621)drop_nulls() and drop_nans() (#22469)get() SchemaMismatch panic (#22350)new_streaming feature to polars crate (#22601)dt.truncate (except weekly buckets which start on Mondays) (#22592)replace and replace_strict mapping use list literals (#22566)Time column (#22550)match_to_schema to API reference (#22777)value_counts "normalize" parameter (#22756)drop/fill for nulls/nans (#22657)RoundMode parameter in round (#22555)repeat_by to API reference, fixup list.get (#22698)scan_iceberg (#22694)insert_column docstring (description and examples) (#22551)join documentation (#22556)list.eval performance test (#22729).write_* to .lazy().sink_*(engine='in-memory') (#22582)QueryOptFlags (#22680)str.replace_many (#22615)sink_* (#22643)proptest testing for for parquet decoding kernels (#22608).collect(_eager=True) (#22602)in-memory-map (#22552)Thank you to all our contributors for making this release possible! @JakubValtar, @Julian-J-S, @MarcoGorelli, @WH-2099, @alexander-beedie, @borchero, @cmdlineluser, @coastalwhite, @etiennebacher, @florian-klein, @itamarst, @kdn36, @mcrumiller, @nameexhaustion, @nikaltipar, @orlp, @pavelzw, @r-brink, @ritchie46, @stijnherfst, @teotwaki, @timkpaine and @wence-
Deprecate str. collection functions with flat strings and mark as elementwise
IN and NOT IN expressions (#22487)DataFrame and Series init from torch Tensor objects (#22177)RoundMode for Decimal and Float (#22248)assert_frame_schema_equal() (#22529).unique() followed by .slice() (#22471)schema_overrides not taking effect in NDJSON (#22521)null in dt.to_date / dt.to_datetime (#22500)isinstance check is lazy (avoid forcing the dependency) (#22486)replace and replace_strict properly elementwise (#22465)array.get with idx overflow (#22449)str. collection functions with flat strings and mark as elementwise (#22461)list.gather and mark as elementwise (#22456)Thank you to all our contributors for making this release possible! @AH-Merii, @JakubValtar, @Julian-J-S, @Kevin-Patyk, @Liyixin95, @MarcoGorelli, @Matt711, @alexander-beedie, @brianmakesthings, @coastalwhite, @nameexhaustion, @orlp and @ritchie46
Reading of reencoded categorical in Parquet
pyo3 and numpy crates to version 0.24 (#22015)implode + over (#22437)pytorch package (#22355)Thank you to all our contributors for making this release possible! @bschoenmaeckers, @coastalwhite, @etiennebacher, @mcrumiller and @ritchie46
Deprecate using is_in with 2 equal types and mark as elementwise
rolling_skew kernel (#22333)parallel=prefiltered by default for new streaming (#22190)backward_fill / forward_fill (#22360)dict to Mapping (#19400) (#19436)rolling_kurtosis (#22335).sort(nulls_last=True) to booleans, categoricals and enums (#22300)implode + agg (#22230)write_excel correctly preserves null values in nested dtype data on export (#22379)LazyFrame.rename().select() (#22380)select(len()) performance regression (#22363)lit (#21785)merge_sorted (#22205)pl.corr (#22305)pl.duration to planner (#22304)NaN from Parquet Statistics (#22294)AnyValue to Series (#22293)__all__ entry to internal type definition module (#22254)str → date conversion when reading from spreadsheet (#22276)is_in with 2 equal types and mark as elementwise (#22178)ColumnNotFoundError for missing columns in join_where (#22268)hist (#22245)pl.when documentation (#22345)is_business_day to documentation reference (#22338)__all__ entry to internal type definition module (#22254)Thank you to all our contributors for making this release possible! @DavideCanton, @JakubValtar, @Jesse-Bakker, @MarcoGorelli, @NeejWeej, @Shoeboxam, @adamreeve, @alexander-beedie, @axellpadilla, @cmdlineluser, @coastalwhite, @d-reynol, @dongchao-1, @florian-klein, @kdn36, @math-hiyoko, @mcrumiller, @mroeschke, @nameexhaustion, @orlp, @ritchie46, @stijnherfst and @yiteng-guo
Improved expression autocomplete for IPython, Jupyter, and Marimo
IPython, Jupyter, and Marimo (#22221)min=max with is_in (#22213)LruCachedFunc for size=0 (#22215)Thank you to all our contributors for making this release possible! @Matt711, @alexander-beedie, @coastalwhite, @dependabot[bot], @orlp, @ritchie46 and dependabot[bot]
Add correct deprecation warning for .str.concat
hist (#22090)base_path and file_path (#21888)SPLIT_PART string function to the SQL interface (#22158)Expr.diff (#22142)STRING_TO_ARRAY function to the SQL interface (#22129)eager parameter to pl.cov (#22098)Int128 parsing/recognition to the SQL interface (#22104)eager parameter to pl.coalesce (#22092)eager parameter to pl.corr (#22097)io and fs classes (#21987)add_alp_optimize_exprs to IRBuilder (#22061)cat.slice (#21971)GilOnceCell with Mutex (#21927)join_where (#22112)list.set_* operations (#22163)Expr.repeat_by as elementwise (#22068)i128 as supertype to boolean (#22138)n=0 on list.gather_every (#22122)str.to_integer arguments (#22100)hist (#22090)merge_sorted (#21976)ewm_mean_by args (#22093)pl.repeat (#22088)n parameter of pl.repeat (#22071)bitwise_{count,leading,trailing}_{ones,zeros} as elementwise (#22044)pl.*_ranges functions correctly as element-wise (#22059)pl.arctan2 (#22060)pl.business_day_count as elementwise (#22055)str.extract_groups (#22032)fill_char in str.pad_{start,end} (#22036)str.to_decimal properly as non-elementwise (#22040)bin.encode and bin.decode (#22022)dt.offset_by() and dt.round() (#21982)collect_with_callback (#21941)cs.exclude() is SelectorType instead of Expr (#21892)MultiScanExec for in-memory (#22184)FunctionOptions from DSL calls (#22133)backward_fill and forward_fill (#22156)backward_fill and forward_fill interface (#22083)MaxBound and MinBound fill strategies (#22063)base_path and file_path (#21888)Thank you to all our contributors for making this release possible! @DeflateAwning, @EnricoMi, @Jacob640, @JakubValtar, @MarcoGorelli, @MaxJackson, @alexander-beedie, @amotzop, @anath2, @bschoenmaeckers, @cnpryer, @coastalwhite, @dependabot[bot], @eitsupi, @etiennebacher, @hemanth94, @kdn36, @mcrumiller, @nameexhaustion, @orlp, @r-brink, @rgertenbach, @ritchie46, @sebasv, @silannisik, @stijnherfst, @wence-, @zachlefevre and dependabot[bot]
Use views for binary hash tables and add single-key binary variant
PartitionParted (#21788)explain_all (#21797)repeat_by with (nested) lists and structs (#21206)DataFrame.nan_to_null work for tuple (#21861)pivot on empty frame for all integer index dtypes (#21890)sink_csv (#21814)streaming=False (#21813)None refer to uncompressed in sink_ipc (#21786)Thank you to all our contributors for making this release possible! @Kevin-Patyk, @MarcoGorelli, @alexander-beedie, @anath2, @borchero, @coastalwhite, @dongchao-cn, @kgv, @mcrumiller, @nameexhaustion, @orlp and @ritchie46
Enable common subplan elimination across plans in collect_all
collect_all (#21747)PartitionByKey for new streaming sinks (#21689)collect_all (#21747)PartitionByKey for new streaming sinks (#21689)mkdir flag to sinks (#21717)PartitionMaxSize sink (#21573)LazyFrame.profile (#21534)token in storage_options for GCP cloud (#21560)join_asof when 'by' groups supplied, but issue warning (#21724)list.mean and list.median returning Float64 for temporal types (#21144)Future attached to different loop error on read_database_uri (#21641)read_().lazy() antipattern (#21623)Plotnine example to the visualization docs (#21597)datetime_range Nanosecond Overflow (#21354)Thank you to all our contributors for making this release possible! @GaelVaroquaux, @Kevin-Patyk, @MarcoGorelli, @Matt711, @NathanHu725, @alexander-beedie, @coastalwhite, @dependabot[bot], @jrycw, @kdn36, @lukemanley, @mcrumiller, @nameexhaustion, @orlp, @r-brink, @ritchie46, @wence- and dependabot[bot]
Nothing published for this version
Nothing published for this version
Provide a fallback skip batch predicate for constant batches
read_csv for non-utf8 encodings (#21433)DataFrame.write_iceberg (#15018)is_in (#21426)rolling_{std, var, cov, corr} (#21528)Time type in json (#21454)AssertionError variant to PolarsError in polars-error (#21460)Expr.list.diff (#21484)read_excel not handling URL paths correctly (#21428)merge_sorted (#21501)statistics=True doesn't enable all statistics in sink_parquet() (#21434).is_in predicate filter (#21455)Thank you to all our contributors for making this release possible! @Kevin-Patyk, @MarcoGorelli, @Matt711, @alexander-beedie, @banflam, @braaannigan, @coastalwhite, @dependabot[bot], @etiennebacher, @ghuls, @kevinjqliu, @lukemanley, @mcrumiller, @nameexhaustion, @orlp, @ritchie46, @stijnherfst, @thomasjpfan and dependabot[bot]
Add feature gate to old streaming deprecation warning
rolling + group-by performance and memory explosion (#21403)align_frames (#21209)remove method for DataFrame and LazyFrame (#21259)credentials parameter to credential in CredentialProviderAzure (#21295)merge_sorted for struct (#21205)DELETE statement (#21190)dt.ordinal_day was returning UTC results as opposed to those on the local timestamp (#21410)n and fill_value parameters in shift (#21292)pl.datetime and pl.date (#21013)gather in aggregation context (#21369)fast_unique in EnumBuilder (#21366)len() after semi/anti join (#21355)dt.offset_by was discarding month and year info if day was included in offset for timezone-aware columns (#21291)polars.col on Python versions <3.11 (#21333)join_where (#21308)to_physical for series of arrays and lists (#21289)Int128 path for join_asof (#21282)is_finite, is_infinite, and is_nan when dtype is pl.Null (#21253)connectorx release (#21277)strptime() if format ends with '%' (#21176)Expr.name.map docstring example (#21309)packaging dependency (#21223)Thank you to all our contributors for making this release possible! @GiovanniGiacometti, @JakubValtar, @MarcoGorelli, @Matt711, @Shoeboxam, @YichiZhang0613, @alexander-beedie, @bschoenmaeckers, @coastalwhite, @edwinvehmaanpera, @erikbrinkman, @etiennebacher, @hemanth94, @henryharbeck, @jqnatividad, @lukemanley, @mcrumiller, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @ydagosto
Deprecate the old streaming engine
DataFrame height and width checks (#21071)list.min and list.max performance for logical types (#20972)from_arrow (#21128)POLARS_MAX_CONCURRENT_SCANS in multiscan for new streaming (#21127)linear_spaces (#20941)write_table() function to Unity catalog client (#21089)is_object method to Polars DataType class (#21074)merge_sorted for binary (#21045)schema to namespace (#20993)json_normalize function, minor speedup (#20966)aws_profile in storage_options (#20965)concat alignment strategies more generic (#20644)POLARS_AUTO_USE_AZURE_STORAGE_ACCOUNT_KEY to error message (#20942)ParquetColumnExpr (#20714)Expr.over applying scale incorrectly for Decimal types (#21140)lit handles datetimes with tzinfo that represents a fixed offset from UTC (#21003)SELECT COUNT(*) FROM (#21108)join_where incorrectly dropping transformations on RHS of equality expressions (#21067)top_k on list type panics (#21043)set_tbl_width_chars panicking with negative width (#20906)write_excel recognises the Array dtype and writes it out as a string (#20994)merge_sorted producing incorrect results or panicking for some logical types (#21018)INTERVAL is not a fixed duration (#20958)is_in expressions (#20948)patterns in str.extract_many() (#20953)pl.Array shape argument types (#20915)from_numpy returning Null dtype for empty 1D numpy array (#20907)write_excel function (#20909)map_elements panicking with Decimal type (#20905)where with mask in Migrating -> Coming from Pandas (#21085)write_delta with delta_lake.WriterProperties (#20746)shape param to Array docstring (#20747)set_sorted description references single-column behavior (#20709)dt.replace tests to dedicated file, add "typing :: typed" classifier, remove unused testing function (#20945)BitmapBuilder (#20896)verify_dict_indices codegen (#20920)Thank you to all our contributors for making this release possible! @FBruzzesi, @MarcoGorelli, @aberres, @alexander-beedie, @arnabanimesh, @bschoenmaeckers, @coastalwhite, @deanm0000, @dependabot[bot], @dimfeld, @eitsupi, @etiennebacher, @henryharbeck, @itamarst, @lmmx, @lukemanley, @mcrumiller, @mullimanko, @nameexhaustion, @orlp, @petrosbar, @ritchie46, @siddharth-vi, @skritsotalakis, @taureandyernv and dependabot[bot]
Your coding agent can read these notes before it upgrades. Set up the MCP server →