# Table of Contents - [Index - Polars user guide](#index-polars-user-guide) - [Start trial period - Polars user guide](#start-trial-period-polars-user-guide) - [Set up organization - Polars user guide](#set-up-organization-polars-user-guide) - [Workspace configuration - Polars user guide](#workspace-configuration-polars-user-guide) - [Permissions - Polars user guide](#permissions-polars-user-guide) - [Introducing Polars on-premises - Polars user guide](#introducing-polars-on-premises-polars-user-guide) - [Query profiling - Polars user guide](#query-profiling-polars-user-guide) - [Execute remote query - Polars user guide](#execute-remote-query-polars-user-guide) - [Python environment - Polars user guide](#python-environment-polars-user-guide) - [Environment variables - Polars user guide](#environment-variables-polars-user-guide) - [Getting started - Polars user guide](#getting-started-polars-user-guide) - [Manage team - Polars user guide](#manage-team-polars-user-guide) - [Concepts - Polars user guide](#concepts-polars-user-guide) - [Changelog - Polars user guide](#changelog-polars-user-guide) - [About - Polars user guide](#about-polars-user-guide) - [Getting started - Polars user guide](#getting-started-polars-user-guide) - [Version 0.19 - Polars user guide](#version-0-19-polars-user-guide) - [Ecosystem - Polars user guide](#ecosystem-polars-user-guide) - [Expressions - Polars user guide](#expressions-polars-user-guide) - [Distributed queries - Polars user guide](#distributed-queries-polars-user-guide) - [Config file reference - Polars user guide](#config-file-reference-polars-user-guide) - [GPU Support [Open Beta] - Polars user guide](#gpu-support-open-beta-polars-user-guide) - [Version 0.20 - Polars user guide](#version-0-20-polars-user-guide) - [Installation - Polars user guide](#installation-polars-user-guide) - [Lazy API - Polars user guide](#lazy-api-polars-user-guide) - [Streaming - Polars user guide](#streaming-polars-user-guide) - [Google BigQuery - Polars user guide](#google-bigquery-polars-user-guide) - [IO - Polars user guide](#io-polars-user-guide) - [Version 1 - Polars user guide](#version-1-polars-user-guide) - [Folds - Polars user guide](#folds-polars-user-guide) - [Categorical data and enums - Polars user guide](#categorical-data-and-enums-polars-user-guide) - [Expressions and contexts - Polars user guide](#expressions-and-contexts-polars-user-guide) - [Excel - Polars user guide](#excel-polars-user-guide) - [Databases - Polars user guide](#databases-polars-user-guide) - [Casting - Polars user guide](#casting-polars-user-guide) - [Lazy - Polars user guide](#lazy-polars-user-guide) - [Optimizations - Polars user guide](#optimizations-polars-user-guide) - [GPU Support - Polars user guide](#gpu-support-polars-user-guide) - [CSV - Polars user guide](#csv-polars-user-guide) - [Basic operations - Polars user guide](#basic-operations-polars-user-guide) - [Google Sheets (via Colab) - Polars user guide](#google-sheets-via-colab-polars-user-guide) - [Hive - Polars user guide](#hive-polars-user-guide) - [Query execution - Polars user guide](#query-execution-polars-user-guide) - [DataType Expressions - Polars user guide](#datatype-expressions-polars-user-guide) - [Usage - Polars user guide](#usage-polars-user-guide) - [Sources and sinks - Polars user guide](#sources-and-sinks-polars-user-guide) - [Hugging Face - Polars user guide](#hugging-face-polars-user-guide) - [JSON files - Polars user guide](#json-files-polars-user-guide) - [User-defined Python functions - Polars user guide](#user-defined-python-functions-polars-user-guide) - [Numpy functions - Polars user guide](#numpy-functions-polars-user-guide) - [Aggregation - Polars user guide](#aggregation-polars-user-guide) - [Parquet - Polars user guide](#parquet-polars-user-guide) - [Generating Polars code with LLMs - Polars user guide](#generating-polars-code-with-llms-polars-user-guide) - [Coming from Apache Spark - Polars user guide](#coming-from-apache-spark-polars-user-guide) - [Missing data - Polars user guide](#missing-data-polars-user-guide) - [Plugins - Polars user guide](#plugins-polars-user-guide) - [Common Table Expressions - Polars user guide](#common-table-expressions-polars-user-guide) - [Comparison with other tools - Polars user guide](#comparison-with-other-tools-polars-user-guide) - [Getting started - Polars user guide](#getting-started-polars-user-guide) - [CREATE - Polars user guide](#create-polars-user-guide) - [Arrow producer/consumer - Polars user guide](#arrow-producer-consumer-polars-user-guide) - [Cloud storage - Polars user guide](#cloud-storage-polars-user-guide) - [SHOW TABLES - Polars user guide](#show-tables-polars-user-guide) - [Transformations - Polars user guide](#transformations-polars-user-guide) - [Multiprocessing - Polars user guide](#multiprocessing-polars-user-guide) - [IO Plugins - Polars user guide](#io-plugins-polars-user-guide) - [Strings - Polars user guide](#strings-polars-user-guide) - [Multiple - Polars user guide](#multiple-polars-user-guide) - [Lists and arrays - Polars user guide](#lists-and-arrays-polars-user-guide) - [Introduction - Polars user guide](#introduction-polars-user-guide) - [SELECT - Polars user guide](#select-polars-user-guide) - [Coming from Pandas - Polars user guide](#coming-from-pandas-polars-user-guide) - [Expression Plugins - Polars user guide](#expression-plugins-polars-user-guide) - [Structs - Polars user guide](#structs-polars-user-guide) - [Pivots - Polars user guide](#pivots-polars-user-guide) - [Styling - Polars user guide](#styling-polars-user-guide) - [Time zones - Polars user guide](#time-zones-polars-user-guide) - [Parsing - Polars user guide](#parsing-polars-user-guide) - [Filtering - Polars user guide](#filtering-polars-user-guide) - [Concatenation - Polars user guide](#concatenation-polars-user-guide) - [Data types and structures - Polars user guide](#data-types-and-structures-polars-user-guide) - [Unpivots - Polars user guide](#unpivots-polars-user-guide) - [Resampling - Polars user guide](#resampling-polars-user-guide) - [Schema - Polars user guide](#schema-polars-user-guide) - [Grouping - Polars user guide](#grouping-polars-user-guide) - [Multiplexing queries - Polars user guide](#multiplexing-queries-polars-user-guide) - [Visualization - Polars user guide](#visualization-polars-user-guide) - [Query plan - Polars user guide](#query-plan-polars-user-guide) - [Expression expansion - Polars user guide](#expression-expansion-polars-user-guide) - [Joins - Polars user guide](#joins-polars-user-guide) - [Window functions - Polars user guide](#window-functions-polars-user-guide) - [Redirecting...](#redirecting-) - [Python API reference — Polars documentation](#python-api-reference-polars-documentation) - [polars - Rust](#polars-rust) - [Data types — Polars documentation](#data-types-polars-documentation) - [Functions — Polars documentation](#functions-polars-documentation) - [Catalog — Polars documentation](#catalog-polars-documentation) - [Schema — Polars documentation](#schema-polars-documentation) - [DataType expressions — Polars documentation](#datatype-expressions-polars-documentation) - [Input/output — Polars documentation](#input-output-polars-documentation) - [Config — Polars documentation](#config-polars-documentation) - [Plugins — Polars documentation](#plugins-polars-documentation) - [SQL Interface — Polars documentation](#sql-interface-polars-documentation) - [Extending the API — Polars documentation](#extending-the-api-polars-documentation) - [Exceptions — Polars documentation](#exceptions-polars-documentation) - [Testing — Polars documentation](#testing-polars-documentation) - [List of all items in this crate](#list-of-all-items-in-this-crate) - [Expressions — Polars documentation](#expressions-polars-documentation) - [polars_lazy - Rust](#polars-lazy-rust) - [Metadata — Polars documentation](#metadata-polars-documentation) - [polars::chunked_array - Rust](#polars-chunked-array-rust) - [polars_time - Rust](#polars-time-rust) - [polars_io - Rust](#polars-io-rust) - [polars::datatypes - Rust](#polars-datatypes-rust) - [polars::docs - Rust](#polars-docs-rust) - [polars::error - Rust](#polars-error-rust) - [polars::frame - Rust](#polars-frame-rust) - [polars::functions - Rust](#polars-functions-rust) - [polars::series - Rust](#polars-series-rust) - [polars::prelude - Rust](#polars-prelude-rust) - [Schema — Polars documentation](#schema-polars-documentation) - [polars::testing - Rust](#polars-testing-rust) - [Input/output — Polars documentation](#input-output-polars-documentation) - [apply_method_all_arrow_series in polars - Rust](#apply-method-all-arrow-series-in-polars-rust) - [Catalog — Polars documentation](#catalog-polars-documentation) - [Extending the API — Polars documentation](#extending-the-api-polars-documentation) - [Config — Polars documentation](#config-polars-documentation) - [Plugins — Polars documentation](#plugins-polars-documentation) - [SQL Interface — Polars documentation](#sql-interface-polars-documentation) - [Exceptions — Polars documentation](#exceptions-polars-documentation) - [Metadata — Polars documentation](#metadata-polars-documentation) - [df in polars - Rust](#df-in-polars-rust) - [Testing — Polars documentation](#testing-polars-documentation) - [VERSION in polars - Rust](#version-in-polars-rust) - [polars_lazy::dsl - Rust](#polars-lazy-dsl-rust) - [List of all items in this crate](#list-of-all-items-in-this-crate) - [polars_lazy::frame - Rust](#polars-lazy-frame-rust) - [fallible in polars_lazy - Rust](#fallible-in-polars-lazy-rust) - [polars_lazy::prelude - Rust](#polars-lazy-prelude-rust) - [polars_io::catalog - Rust](#polars-io-catalog-rust) - [polars_io::path_utils - Rust](#polars-io-path-utils-rust) - [polars_io::avro - Rust](#polars-io-avro-rust) - [polars_io::csv - Rust](#polars-io-csv-rust) - [polars_io::cloud - Rust](#polars-io-cloud-rust) - [polars_time::chunkedarray - Rust](#polars-time-chunkedarray-rust) - [polars_io::file_cache - Rust](#polars-io-file-cache-rust) - [polars_io::hive - Rust](#polars-io-hive-rust) - [polars_io::ipc - Rust](#polars-io-ipc-rust) - [polars_io::mmap - Rust](#polars-io-mmap-rust) - [polars_io::ndjson - Rust](#polars-io-ndjson-rust) - [polars_io::parquet - Rust](#polars-io-parquet-rust) - [polars_io::scan_lines - Rust](#polars-io-scan-lines-rust) - [impl_page_walk in polars_io - Rust](#impl-page-walk-in-polars-io-rust) - [polars_io::utils - Rust](#polars-io-utils-rust) - [polars_time::series - Rust](#polars-time-series-rust) - [get_upload_chunk_size in polars_io - Rust](#get-upload-chunk-size-in-polars-io-rust) - [polars_io::pl_async - Rust](#polars-io-pl-async-rust) - [polars_io::predicates - Rust](#polars-io-predicates-rust) - [polars_io::json - Rust](#polars-io-json-rust) - [schema_to_arrow_checked in polars_io - Rust](#schema-to-arrow-checked-in-polars-io-rust) - [polars_time::prelude - Rust](#polars-time-prelude-rust) - [PolarsRound in polars_time - Rust](#polarsround-in-polars-time-rust) - [ArrowReader in polars_io - Rust](#arrowreader-in-polars-io-rust) - [SerWriter in polars_io - Rust](#serwriter-in-polars-io-rust) - [SerReader in polars_io - Rust](#serreader-in-polars-io-rust) - [PolarsUpsample in polars_time - Rust](#polarsupsample-in-polars-time-rust) - [ClosedWindow in polars_time - Rust](#closedwindow-in-polars-time-rust) - [RowIndex in polars_io - Rust](#rowindex-in-polars-io-rust) - [HiveOptions in polars_io - Rust](#hiveoptions-in-polars-io-rust) - [List of all items in this crate](#list-of-all-items-in-this-crate) - [polars_io::prelude - Rust](#polars-io-prelude-rust) - [Window in polars_time - Rust](#window-in-polars-time-rust) - [Duration in polars_time - Rust](#duration-in-polars-time-rust) - [List of all items in this crate](#list-of-all-items-in-this-crate) --- # Index - Polars user guide [Skip to content](https://docs.pola.rs/#key-features) ![logo](https://raw.githubusercontent.com/pola-rs/polars-static/master/banner/polars_github_banner.svg) Blazingly Fast DataFrame Library ================================ [![Rust docs latest](https://docs.rs/polars/badge.svg)](https://docs.rs/polars/latest/polars/) [![Rust crates Latest Release](https://img.shields.io/crates/v/polars.svg)](https://crates.io/crates/polars) [![PyPI Latest Release](https://img.shields.io/pypi/v/polars.svg)](https://pypi.org/project/polars/) [![DOI Latest Release](https://zenodo.org/badge/DOI/10.5281/zenodo.7697217.svg)](https://doi.org/10.5281/zenodo.7697217) Polars is a blazingly fast DataFrame library for manipulating structured data. The core is written in Rust, and available for Python, R and NodeJS. Key features ------------ * **Fast**: Written from scratch in Rust, designed close to the machine and without external dependencies. * **I/O**: First class support for all common data storage layers: local, cloud storage & databases. * **Intuitive API**: Write your queries the way they were intended. Polars, internally, will determine the most efficient way to execute using its query optimizer. * **Out of Core**: The streaming API allows you to process your results without requiring all your data to be in memory at the same time. * **Parallel**: Utilises the power of your machine by dividing the workload among the available CPU cores without any additional configuration. * **Vectorized Query Engine** * **GPU Support**: Optionally run queries on NVIDIA GPUs for maximum performance for in-memory workloads. * **[Apache Arrow support](https://arrow.apache.org/) **: Polars can consume and produce Arrow data often with zero-copy operations. Note that Polars is not built on a Pyarrow/Arrow implementation. Instead, Polars has its own compute and buffer implementations. Users new to DataFrames A DataFrame is a 2-dimensional data structure that is useful for data manipulation and analysis. With labeled axes for rows and columns, each column can contain different data types, making complex data operations such as merging and aggregation much easier. Due to their flexibility and intuitive way of storing and working with data, DataFrames have become increasingly popular in modern data analytics and engineering. Philosophy ---------- The goal of Polars is to provide a lightning fast DataFrame library that: * Utilizes all available cores on your machine. * Optimizes queries to reduce unneeded work/memory allocations. * Handles datasets much larger than your available RAM. * A consistent and predictable API. * Adheres to a strict schema (data-types should be known before running the query). Polars is written in Rust which gives it C/C++ performance and allows it to fully control performance-critical parts in a query engine. Example ------- Python Rust [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) · [`filter`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.filter.html) · [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) · [`collect`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.collect.html) `import polars as pl q = ( pl.scan_csv("docs/assets/data/iris.csv") .filter(pl.col("sepal_length") > 5) .group_by("species") .agg(pl.all().sum()) ) df = q.collect()` [`LazyCsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyCsvReader.html) · [`filter`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.filter) · [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) · [`collect`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html#method.collect) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") · [Available on feature streaming](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag streaming") `use polars::prelude::*; let q = LazyCsvReader::new(PlRefPath::new("docs/assets/data/iris.csv")) .with_has_header(true) .finish()? .filter(col("sepal_length").gt(lit(5))) .group_by(vec![col("species")]) .agg([col("*").sum()]); let df = q.collect()?;` A more extensive introduction can be found in the [next chapter](https://docs.pola.rs/user-guide/getting-started/) . Community --------- Polars has a very active community with frequent releases (approximately weekly). Below are some of the top contributors to the project: [![ritchie46](https://avatars.githubusercontent.com/u/3023000?v=4&s=40)](https://github.com/ritchie46) [![stinodego](https://avatars.githubusercontent.com/u/3502351?v=4&s=40)](https://github.com/stinodego) [![alexander-beedie](https://avatars.githubusercontent.com/u/2613171?v=4&s=40)](https://github.com/alexander-beedie) [![coastalwhite](https://avatars.githubusercontent.com/u/6944009?v=4&s=40)](https://github.com/coastalwhite) [![nameexhaustion](https://avatars.githubusercontent.com/u/93244543?v=4&s=40)](https://github.com/nameexhaustion) [![orlp](https://avatars.githubusercontent.com/u/202547?v=4&s=40)](https://github.com/orlp) [![MarcoGorelli](https://avatars.githubusercontent.com/u/33491632?v=4&s=40)](https://github.com/MarcoGorelli) [![reswqa](https://avatars.githubusercontent.com/u/19502505?v=4&s=40)](https://github.com/reswqa) [![mcrumiller](https://avatars.githubusercontent.com/u/1896992?v=4&s=40)](https://github.com/mcrumiller) [![zundertj](https://avatars.githubusercontent.com/u/11277667?v=4&s=40)](https://github.com/zundertj) [![ghuls](https://avatars.githubusercontent.com/u/1299177?v=4&s=40)](https://github.com/ghuls) [![universalmind303](https://avatars.githubusercontent.com/u/21327470?v=4&s=40)](https://github.com/universalmind303) [![kdn36](https://avatars.githubusercontent.com/u/184849070?v=4&s=40)](https://github.com/kdn36) [![lukemanley](https://avatars.githubusercontent.com/u/8519523?v=4&s=40)](https://github.com/lukemanley) [![c-peters](https://avatars.githubusercontent.com/u/22658776?v=4&s=40)](https://github.com/c-peters) [![itamarst](https://avatars.githubusercontent.com/u/3266662?v=4&s=40)](https://github.com/itamarst) [![JakubValtar](https://avatars.githubusercontent.com/u/3177098?v=4&s=40)](https://github.com/JakubValtar) [![dsprenkels](https://avatars.githubusercontent.com/u/439973?v=4&s=40)](https://github.com/dsprenkels) [![wence-](https://avatars.githubusercontent.com/u/1126981?v=4&s=40)](https://github.com/wence-) [![cmdlineluser](https://avatars.githubusercontent.com/u/99486669?v=4&s=40)](https://github.com/cmdlineluser) [![eitsupi](https://avatars.githubusercontent.com/u/50911393?v=4&s=40)](https://github.com/eitsupi) [![henryharbeck](https://avatars.githubusercontent.com/u/59268910?v=4&s=40)](https://github.com/henryharbeck) [![Kevin-Patyk](https://avatars.githubusercontent.com/u/74557243?v=4&s=40)](https://github.com/Kevin-Patyk) [![r-brink](https://avatars.githubusercontent.com/u/18343213?v=4&s=40)](https://github.com/r-brink) [![matteosantama](https://avatars.githubusercontent.com/u/13473688?v=4&s=40)](https://github.com/matteosantama) [![borchero](https://avatars.githubusercontent.com/u/22455425?v=4&s=40)](https://github.com/borchero) [![deanm0000](https://avatars.githubusercontent.com/u/37878412?v=4&s=40)](https://github.com/deanm0000) [![Dandandan](https://avatars.githubusercontent.com/u/163737?v=4&s=40)](https://github.com/Dandandan) [![ion-elgreco](https://avatars.githubusercontent.com/u/15728914?v=4&s=40)](https://github.com/ion-elgreco) [![magarick](https://avatars.githubusercontent.com/u/1757124?v=4&s=40)](https://github.com/magarick) [![stijnherfst](https://avatars.githubusercontent.com/u/8471644?v=4&s=40)](https://github.com/stijnherfst) [![etiennebacher](https://avatars.githubusercontent.com/u/52219252?v=4&s=40)](https://github.com/etiennebacher) [![moritzwilksch](https://avatars.githubusercontent.com/u/58488209?v=4&s=40)](https://github.com/moritzwilksch) [![braaannigan](https://avatars.githubusercontent.com/u/10512793?v=4&s=40)](https://github.com/braaannigan) [![jorgecarleitao](https://avatars.githubusercontent.com/u/2772607?v=4&s=40)](https://github.com/jorgecarleitao) [![Voultapher](https://avatars.githubusercontent.com/u/6864584?v=4&s=40)](https://github.com/Voultapher) [![mickvangelderen](https://avatars.githubusercontent.com/u/5444990?v=4&s=40)](https://github.com/mickvangelderen) [![rodrigogiraoserrao](https://avatars.githubusercontent.com/u/5621605?v=4&s=40)](https://github.com/rodrigogiraoserrao) [![petrosbar](https://avatars.githubusercontent.com/u/24761419?v=4&s=40)](https://github.com/petrosbar) [![Julian-J-S](https://avatars.githubusercontent.com/u/25177421?v=4&s=40)](https://github.com/Julian-J-S) [![jonashaag](https://avatars.githubusercontent.com/u/175722?v=4&s=40)](https://github.com/jonashaag) [![marcvanheerden](https://avatars.githubusercontent.com/u/11750833?v=4&s=40)](https://github.com/marcvanheerden) [![cnpryer](https://avatars.githubusercontent.com/u/14341145?v=4&s=40)](https://github.com/cnpryer) [![cjermain](https://avatars.githubusercontent.com/u/4521567?v=4&s=40)](https://github.com/cjermain) [![josh](https://avatars.githubusercontent.com/u/137?v=4&s=40)](https://github.com/josh) [![barak1412](https://avatars.githubusercontent.com/u/4324219?v=4&s=40)](https://github.com/barak1412) [![ryanrussell](https://avatars.githubusercontent.com/u/523300?v=4&s=40)](https://github.com/ryanrussell) [![flisky](https://avatars.githubusercontent.com/u/656711?v=4&s=40)](https://github.com/flisky) [![messense](https://avatars.githubusercontent.com/u/1556054?v=4&s=40)](https://github.com/messense) Contributing ------------ We appreciate all contributions, from reporting bugs to implementing new features. Read our [contributing guide](https://docs.pola.rs/development/contributing/) to learn more. License ------- This project is licensed under the terms of the [MIT license](https://github.com/pola-rs/polars/blob/main/LICENSE) . --- # Start trial period - Polars user guide [Skip to content](https://docs.pola.rs/polars-cloud/organization/start-trial/#start-trial-period) Start trial period ================== Your Polars Cloud free trial begins automatically the moment you connect your first workspace to your AWS environment. No credit card required. What's Included During the Trial -------------------------------- During the 30-day free trial, you have full access to Polars Cloud to explore the platform in detail. This includes: * Complete feature access: Use all Polars Cloud capabilities without restrictions * Team collaboration: Invite team members to collaborate in your workspace * Serverless compute: Run queries remotely without infrastructure management * Distributed engine: Scale your Polars queries beyond a single machine Cost Considerations During Trial -------------------------------- Polars Cloud is free during the trial. However, AWS may charge for the compute resources your queries consume, depending on your AWS agreement. Monitor your AWS billing dashboard to track resource usage during the trial. Checking Your Trial Status -------------------------- You can find more information about your trial on your Organization dashboard under `Billing`. Here you can find the current status and end date. You will also be prompted to set up billing here. Subscribe After Trial --------------------- When your 30-day trial concludes, you'll be prompted to subscribe via the AWS Marketplace. Your data and workspace configurations remain intact, but new query execution pauses until subscription activation. Once subscribed, all functionality immediately returns. For more information about subscription options, see the [Payment and Billing page](https://docs.pola.rs/polars-cloud/organization/billing/) . --- # Set up organization - Polars user guide [Skip to content](https://docs.pola.rs/polars-cloud/organization/organizations/#set-up-organization) Set up organization =================== Organizations in Polars Cloud are the top-level entity and typically represent a company. They can have members, contain multiple workspaces and are used to manage billing. To set up an organization you can either use [the dashboard](https://cloud.pola.rs/portal/) or the following CLI commands: * If you're just starting with Polars Cloud then you need to set up both an organization and workspace: `pc setup` * Or if you only want to set up an organization: `pc organization setup` For other subcommands you can execute the help command: `pc organization --help usage: pc organization [-h] [-v] [-t TOKEN] [-p TOKEN_PATH] {list,setup,delete,details} ... positional arguments: {list,setup,delete,details} list List all active organizations setup Set up an organization delete Delete an organization details Print the details of an organization` --- # Workspace configuration - Polars user guide [Skip to content](https://docs.pola.rs/polars-cloud/workspace/settings/#workspace-configuration) Workspace configuration ======================= On the workspace settings page you can set cluster defaults, create labels, add service accounts and change other workspace related settings. Workspace configuration ----------------------- Configure workspace identity through the name and description fields. Use descriptive naming conventions that align with your project structure or data domains for easier workspace discovery and management. Default Compute Configuration ----------------------------- Set default computational resources to standardize job execution without requiring explicit compute context configuration for each operation. Two configuration modes are available: **Resource-based** configuration allows precise specification of vCPUs, RAM, storage, and cluster size. Use this approach when you require control over resource allocation or have specific performance/cost optimization requirements. When the specific configuration is not available on AWS, the cheapest instance with at least the specifications is selected and used. **Instance-based** configuration leverages cloud provider instance types. This approach simplifies configuration by using pre-optimized instance configurations and is typically more cost-effective for standard workloads. Default compute configurations eliminate the need to explicitly define a compute context. More information on configuration can be found in the section on [setting the compute context](https://docs.pola.rs/polars-cloud/context/compute-context/) . Query and compute labels ------------------------ Labels help organize and categorize queries and compute within your workspace. Labels can only be managed through the dashboard interface. `ctx= plc.ComputeContext( workspace="your-workspace", labels=["docs", "user-guide"], )` Service Account Management -------------------------- Service accounts allow scripts to authenticate without human intervention. Each service account generates an authentication token with workspace-scoped permissions. Use clear and descriptive names that match your project structure or data domain to improve clarity. Refer to the [Use service accounts](https://docs.pola.rs/polars-cloud/explain/service-accounts/) section for implementation patterns and security best practices. Disable workspace ----------------- Workspace admins can disable workspaces removing all data, terminating active processes, and revoking all access tokens. This action cannot be reversed. Ensure data export and backup completion before disabling workspaces containing critical datasets or analysis artifacts. --- # Permissions - Polars user guide [Skip to content](https://docs.pola.rs/polars-cloud/providers/aws/permissions/#permissions) Permissions =========== The workspace is an isolation for all resources living within your cloud environment. Every workspace has a single instance profile which defines the permissions for the compute. This profile is attached to the compute within your environment. By default, the profile can read and write from S3, but you can easily adjust depending on your own infrastructure stack. Adding or removing permissions ------------------------------ If you want Polars Cloud to be able to read from other data sources than `S3` within your cloud environment you must provide the access control from directly within AWS. To do this go to `IAM` within the aws console and locate the role called `polars--IAMWorkerRole-`. Here you can adjust the permissions of the workspace for instance: * [Narrow down the S3 access to certain buckets](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_deny-except-bucket.html) * [Provide IAM access to rds database](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) Assuming a different role ------------------------- To use a different IAM role with Polars Cloud beyond the default `polars--IAMWorkerRole-`, you need to configure cross-account role assumption. Set up your target role's trust policy to allow the Polars Cloud role to assume it by following the [AWS cross-account role documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html#access_policies-cross-account-using-roles) . After configuring the trust relationship, specify the role ARN in the storage\_options parameter when reading or writing data to have Polars assume that role for the operation. `import polars_cloud as pc import polars as pl ctx = pc.ComputeContext(cpus=1, memory=1) lf = pl.scan_parquet( "s3://your-bucket/foo.parquet", credential_provider=pl.CredentialProviderAWS( assume_role={ "RoleArn": "" "RoleSessionName": "AssumedRole" }, ), )` --- # Introducing Polars on-premises - Polars user guide [Skip to content](https://docs.pola.rs/polars-on-premises/#introducing-polars-on-premises) Introducing Polars on-premises ============================== Interested in running Polars on-premises? [Sign up here to apply](https://w0lzyfh2w8o.typeform.com/to/zuoDgoMv) . After installing Polars on-premises either on bare-metal or on Kubernetes, you can connect to your cluster using the Polars Cloud Python client. `import polars as pl import polars_cloud as pc # Connect to your Polars on-premises cluster ctx = pc.ClusterContext(compute_address="your-cluster-compute-address", insecure=True) query = ( pl.LazyFrame() .with_columns(a=pl.arange(0, 100000000).sum()) .remote(ctx) .distributed() .execute() ) print(query.await_result())` --- # Query profiling - Polars user guide [Skip to content](https://docs.pola.rs/polars-cloud/run/query-profile/#query-profiling) Query profiling =============== Monitor query execution across workers to identify bottlenecks, understand data flow, and optimize performance. You can see which stages are running, how data moves between workers, and where time is spent during execution. This visibility helps you optimize complex queries and better understand the distributed execution of queries. Example query and dataset You can copy and paste the example below to explore the feature yourself. Don't forget to change the workspace name to one of your own workspaces. `import polars as pl import polars_cloud as pc pc.authenticate() ctx = pc.ComputeContext(workspace="your-workspace", cpus=12, memory=12, cluster_size=4) def pdsh_q3(customer, lineitem, orders): return ( customer.filter(pl.col("c_mktsegment") == "BUILDING") .join(orders, left_on="c_custkey", right_on="o_custkey") .join(lineitem, left_on="o_orderkey", right_on="l_orderkey") .filter(pl.col("o_orderdate") < pl.date(1995, 3, 15)) .filter(pl.col("l_shipdate") > pl.date(1995, 3, 15)) .with_columns( (pl.col("l_extendedprice") * (1 - pl.col("l_discount"))).alias("revenue") ) .group_by("o_orderkey", "o_orderdate", "o_shippriority") .agg(pl.sum("revenue")) .select( pl.col("o_orderkey").alias("l_orderkey"), "revenue", "o_orderdate", "o_shippriority", ) .sort(by=["revenue", "o_orderdate"], descending=[True, False]) ) lineitem = pl.scan_parquet( "s3://polars-cloud-samples-us-east-2-prd/pdsh/sf100/lineitem/*.parquet", storage_options={"request_payer": "true"}, ) customer = pl.scan_parquet( "s3://polars-cloud-samples-us-east-2-prd/pdsh/sf100/customer/*.parquet", storage_options={"request_payer": "true"}, ) orders = pl.scan_parquet( "s3://polars-cloud-samples-us-east-2-prd/pdsh/sf100/orders/*.parquet", storage_options={"request_payer": "true"}, )` Python `result = pdsh_q3(customer, lineitem, orders).remote(ctx).distributed().execute()` The `await_profile` method can be used to monitor an in-progress query. It returns a QueryProfile object containing a DataFrame with information about which stages are being processed across workers, which can be analyzed in the same way as any Polars query. Python `result.await_profile().data` Each row represents one worker processing a span. A span represents a chunk of work done by a worker, for example generating the query plan, reading data from another worker, or executing the query on that data. Some spans may output data, which is recorded in the output\_rows column. `shape: (53, 6) ┌──────────────┬──────────────┬───────────┬─────────────────────┬────────────────────┬─────────────┬───────────────────────┬────────────────────┐ │ stage_number ┆ span_name ┆ worker_id ┆ start_time ┆ end_time ┆ output_rows ┆ shuffle_bytes_written ┆ shuffle_bytes_read │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ │ │ u32 ┆ str ┆ str ┆ datetime[ns] ┆ datetime[ns] ┆ u64 ┆ u64 ┆ u64 │ ╞══════════════╪══════════════╪═══════════╪═════════════════════╪════════════════════╪═════════════╪═══════════════════════╪════════════════════╡ │ 6 ┆ Execute IR ┆ i-xxx ┆ 2025-xx-xx ┆ 2025-xx-xx ┆ 282794 ┆ 72395264 ┆ null │ │ ┆ ┆ ┆ 08:08:52.820228585 ┆ 08:08:52.878229914 ┆ ┆ ┆ │ │ 3 ┆ Execute IR ┆ i-xxx ┆ 2025-xx-xx ┆ 2025-xx-xx ┆ 3643370 ┆ 932702720 ┆ null │ │ ┆ ┆ ┆ 08:08:45.421053731 ┆ 08:08:45.600081475 ┆ ┆ ┆ │ │ 5 ┆ Execute IR ┆ i-xxx ┆ 2025-xx-xx ┆ 2025-xx-xx ┆ 282044 ┆ 723203264 ┆ null │ │ ┆ ┆ ┆ 08:08:52.667547917 ┆ 08:08:52.718114297 ┆ ┆ ┆ │ │ 5 ┆ Shuffle read ┆ i-xxx ┆ 2025-xx-xx ┆ 2025-xx-xx ┆ null ┆ null ┆ 932702720 │ │ ┆ ┆ ┆ 08:08:52.694917167 ┆ 08:08:52.720657155 ┆ ┆ ┆ │ │ 7 ┆ Execute IR ┆ i-xxx ┆ 2025-xx-xx ┆ 2025-xx-xx ┆ 145179 ┆ 37165824 ┆ null │ │ ┆ ┆ ┆ 08:08:53.039771274 ┆ 08:08:53.166535930 ┆ ┆ ┆ │ │ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │ │ 5 ┆ Shuffle read ┆ i-xxx ┆ 2025-xx-xx ┆ 2025-xx-xx ┆ null ┆ null ┆ 72503808 │ │ ┆ ┆ ┆ 08:08:52.649434841 ┆ 08:08:52.667065947 ┆ ┆ ┆ │ │ 6 ┆ Execute IR ┆ i-xxx ┆ 2025-xx-xx ┆ 2025-xx-xx ┆ 283218 ┆ 72503808 ┆ null │ │ ┆ ┆ ┆ 08:08:52.818787714 ┆ 08:08:52.880324797 ┆ ┆ ┆ │ │ 4 ┆ Shuffle read ┆ i-xxx ┆ 2025-xx-xx ┆ 2025-xx-xx ┆ null ┆ null ┆ 3979787264 │ │ ┆ ┆ ┆ 08:08:46.188322234 ┆ 08:08:50.871792346 ┆ ┆ ┆ │ │ 1 ┆ Execute IR ┆ i-xxx ┆ 2025-xx-xx ┆ 2025-xx-xx ┆ 15546044 ┆ 3979787264 ┆ null │ │ ┆ ┆ ┆ 08:08:40.325404872 ┆ 08:08:44.030028095 ┆ ┆ ┆ │ │ 7 ┆ Shuffle read ┆ i-xxx ┆ 2025-xx-xx ┆ 2025-xx-xx ┆ null ┆ null ┆ 37165824 │ │ ┆ ┆ ┆ 08:08:52.925442390 ┆ 08:08:52.962600065 ┆ ┆ ┆ │ └──────────────┴──────────────┴───────────┴─────────────────────┴────────────────────┴─────────────┴───────────────────────┴────────────────────┘` As each worker starts and completes each stage of the query, it notifies the lead worker. The `await_profile` method will poll the lead worker until there is an update from any worker, and then return the full profile data of the query. The QueryProfile object also has a summary property to return an aggregated view of each stage. Python `result.await_profile().summary` `shape: (13, 6) ┌──────────────┬──────────────┬───────────┬────────────┬──────────────┬─────────────┬───────────────────────┬────────────────────┐ │ stage_number ┆ span_name ┆ completed ┆ worker_ids ┆ duration ┆ output_rows ┆ shuffle_bytes_written ┆ shuffle_bytes_read │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ u32 ┆ str ┆ bool ┆ str ┆ duration[μs] ┆ u64 ┆ u64 ┆ u64 │ ╞══════════════╪══════════════╪═══════════╪════════════╪══════════════╪═════════════╪═══════════════════════╪════════════════════╡ │ 6 ┆ Shuffle read ┆ true ┆ i-xxx ┆ 1228µs ┆ 0 ┆ 0 ┆ 289546496 │ │ 5 ┆ Shuffle read ┆ true ┆ i-xxx ┆ 140759µs ┆ 0 ┆ 0 ┆ 289546496 │ │ 4 ┆ Execute IR ┆ true ┆ i-xxx ┆ 1s 73534µs ┆ 1131041 ┆ 289546496 ┆ 0 │ │ 2 ┆ Execute IR ┆ true ┆ i-xxx ┆ 6s 944740µs ┆ 3000188 ┆ 768048128 ┆ 0 │ │ 5 ┆ Execute IR ┆ true ┆ i-xxx ┆ 167483µs ┆ 1131041 ┆ 289546496 ┆ 0 │ │ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │ │ 4 ┆ Shuffle read ┆ true ┆ i-xxx ┆ 4s 952005µs ┆ 0 ┆ 0 ┆ 255627121 │ │ 1 ┆ Execute IR ┆ true ┆ i-xxx ┆ 7s 738907µs ┆ 72874383 ┆ 18655842048 ┆ 0 │ │ 3 ┆ Shuffle read ┆ true ┆ i-xxx ┆ 812807µs ┆ 0 ┆ 0 ┆ 768048128 │ │ 0 ┆ Execute IR ┆ true ┆ i-xxx ┆ 15s 2883µs ┆ 323494519 ┆ 82814596864 ┆ 0 │ │ 7 ┆ Execute IR ┆ true ┆ i-xxx ┆ 356662µs ┆ 1131041 ┆ 289546496 ┆ 0 │ └──────────────┴──────────────┴───────────┴────────────┴──────────────┴─────────────┴───────────────────────┴────────────────────┘` --- # Execute remote query - Polars user guide [Skip to content](https://docs.pola.rs/polars-cloud/run/remote-query/#execute-remote-query) Execute remote query ==================== Polars Cloud enables you to execute existing Polars queries on cloud infrastructure with minimal code changes. This approach allows you to process datasets that exceed local resources or use additional compute resources for faster execution. Polars Cloud is set up and connected This page assumes that you have created an organization and connected a workspace to your cloud environment. If you haven't yet, follow the steps on the [Connect cloud environment](https://docs.pola.rs/polars-cloud/connect-cloud/) page. Define your query locally ------------------------- The following example uses a query from the PDS-H benchmark suite, a derived version of the popular TPC-H benchmark. Data generation tools and additional queries are available in the [Polars benchmark repository](https://github.com/pola-rs/polars-benchmark) . Python `import polars as pl customer = pl.scan_parquet("data/customer.parquet") lineitem = pl.scan_parquet("data/lineitem.parquet") orders = pl.scan_parquet("data/orders.parquet") def pdsh_q3(customer, lineitem, orders): return ( customer.filter(pl.col("c_mktsegment") == "BUILDING") .join(orders, left_on="c_custkey", right_on="o_custkey") .join(lineitem, left_on="o_orderkey", right_on="l_orderkey") .filter(pl.col("o_orderdate") < pl.date(1995, 3, 15)) .filter(pl.col("l_shipdate") > pl.date(1995, 3, 15)) .with_columns( (pl.col("l_extendedprice") * (1 - pl.col("l_discount"))).alias("revenue") ) .group_by("o_orderkey", "o_orderdate", "o_shippriority") .agg(pl.sum("revenue")) .select( pl.col("o_orderkey").alias("l_orderkey"), "revenue", "o_orderdate", "o_shippriority", ) .sort(by=["revenue", "o_orderdate"], descending=[True, False]) ) pdsh_q3(customer, lineitem, orders).collect()` Scale to the cloud ------------------ To execute your query in the cloud, you need to define a compute context. The compute context specifies the hardware to use when executing the query in the cloud. It allows you to set the workspace to execute your query and set compute resources. More elaborate options can be found on the [Compute context introduction page](https://docs.pola.rs/polars-cloud/context/compute-context/) . Python [`ComputeContext`](https://docs.cloud.pola.rs/reference/compute/compute.html) `import polars_cloud as pc ctx = pc.ComputeContext( # make sure to enter your own workspace name workspace="your-workspace", memory=16, cpus=12, ) # Use a larger dataset available on S3 lineitem_sf10 = pl.scan_parquet("s3://polars-cloud-samples-us-east-2-prd/pdsh/sf10/lineitem.parquet", storage_options={"request_payer": "true"}) customer_sf10 = pl.scan_parquet("s3://polars-cloud-samples-us-east-2-prd/pdsh/sf10/customer.parquet", storage_options={"request_payer": "true"}) orders_sf10 = pl.scan_parquet("s3://polars-cloud-samples-us-east-2-prd/pdsh/sf10/orders.parquet", storage_options={"request_payer": "true"}) # Your query remains the same pdsh_q3(customer_sf10, lineitem_sf10, orders_sf10).remote(context=ctx).show()` Run the examples yourself All examples on this page can be executed using the sample datasets hosted on our S3 bucket. By including the `storage_option` parameter in your queries, you'll only incur S3 data transfer costs. No additional storage fees apply S3 bucket region The example datasets are hosted in the `us-east-2 S3 region`. Query performance may be affected if you're running operations from a distant geographic location due to network latency. Working with remote query results --------------------------------- Once you've called `.remote(context=ctx)` on your query, you have several options for how to handle the results, each suited to different use cases and workflows. ### Write to storage The most straightforward approach for batch processing is to write results directly to cloud storage using `.sink_parquet()`. This method is ideal when you want to store processed data for later use or as part of a data pipeline: Python `# Replace the S3 url with your own to run the query successfully pdsh_q3(customer_sf10, lineitem_sf10, orders_sf10).remote(context=ctx).sink_parquet("s3://your-bucket/processed-data/")` Running `.sink_parquet()` will write the results to the defined bucket on S3. The query you execute runs in your cloud environment, and both the data and results remain secure in your own infrastructure. This approach is perfect for ETL workflows, scheduled jobs, or any time you need to persist large datasets without transferring them to your local machine. ### Inspect results Using `.show()` will display the first 10 rows of the result so you can inspect the structure without having to transfer the whole dataset. This method displays the first 10 rows in your console or notebook. Python `pdsh_q3(customer_sf10, lineitem_sf10, orders_sf10).remote(context=ctx).show()` `shape: (10, 4) ┌────────────┬─────────────┬─────────────┬────────────────┐ │ l_orderkey ┆ revenue ┆ o_orderdate ┆ o_shippriority │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ date ┆ i64 │ ╞════════════╪═════════════╪═════════════╪════════════════╡ │ 4791171 ┆ 440715.2185 ┆ 1995-02-23 ┆ 0 │ │ 46678469 ┆ 439855.325 ┆ 1995-01-27 ┆ 0 │ │ 23906758 ┆ 432728.5737 ┆ 1995-03-14 ┆ 0 │ │ 23861382 ┆ 428739.1368 ┆ 1995-03-09 ┆ 0 │ │ 59393639 ┆ 426036.0662 ┆ 1995-02-12 ┆ 0 │ │ 3355202 ┆ 425100.6657 ┆ 1995-03-04 ┆ 0 │ │ 9806272 ┆ 425088.0568 ┆ 1995-03-13 ┆ 0 │ │ 22810436 ┆ 423231.969 ┆ 1995-01-02 ┆ 0 │ │ 16384100 ┆ 421478.7294 ┆ 1995-03-02 ┆ 0 │ │ 52974151 ┆ 415367.1195 ┆ 1995-02-05 ┆ 0 │ └────────────┴─────────────┴─────────────┴────────────────┘` The `.await_and_scan()` method returns a LazyFrame pointing to intermediate results stored temporarily in your S3 environment. These intermediate result files are automatically deleted after several hours. For persistent storage use `sink_parquet`. The output is a LazyFrame, allowing continued query chaining for further analysis. Python `result = pdsh_q3(customer_sf10, lineitem_sf10, orders_sf10).remote(context=ctx).await_and_scan() print(result.collect())` `shape: (114_003, 4) ┌────────────┬─────────────┬─────────────┬────────────────┐ │ l_orderkey ┆ revenue ┆ o_orderdate ┆ o_shippriority │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ date ┆ i64 │ ╞════════════╪═════════════╪═════════════╪════════════════╡ │ 4791171 ┆ 440715.2185 ┆ 1995-02-23 ┆ 0 │ │ 46678469 ┆ 439855.325 ┆ 1995-01-27 ┆ 0 │ │ 23906758 ┆ 432728.5737 ┆ 1995-03-14 ┆ 0 │ │ 23861382 ┆ 428739.1368 ┆ 1995-03-09 ┆ 0 │ │ 59393639 ┆ 426036.0662 ┆ 1995-02-12 ┆ 0 │ │ … ┆ … ┆ … ┆ … │ │ 44149381 ┆ 904.3968 ┆ 1995-01-16 ┆ 0 │ │ 34297697 ┆ 897.8464 ┆ 1995-03-06 ┆ 0 │ │ 25478115 ┆ 887.2318 ┆ 1994-11-28 ┆ 0 │ │ 52204674 ┆ 860.25 ┆ 1994-12-18 ┆ 0 │ │ 47255457 ┆ 838.9381 ┆ 1994-11-18 ┆ 0 │ └────────────┴─────────────┴─────────────┴────────────────┘` --- # Python environment - Polars user guide [Skip to content](https://docs.pola.rs/polars-on-premises/bare-metal/python-environment/#system-wide-installation) Python environment ================== A major point of Polars on-premises is the system requirements regarding the Python version and Python dependencies, which need to be identical on the client, the scheduler, and all workers. The easiest method to achieve this is having a system-wide Python environment and globally installed packages. We recommend however setting up a virtual environment ([`uv`](https://docs.astral.sh/uv/) makes this very easy, including maintaining a given Python version). The minimal requirement for running `polars-on-premises` is the `polars` package. !!! info "Version pinning" Each release of `polars-on-premises` is pinned to a single `polars` release, which can be found in the release announcement. `shell export PINNED_VERSION=1.35.2 # for instance` System-wide installation ------------------------ `$ uv pip install --break-system-packages -r requirements.txt polars[cloudpickle]==$PINNED_VERSION $ ./polars-on-premises service --config-path /etc/polars-cloud/config.toml` Virtual Environment ------------------- `$ uv venv .venv $ source .venv/bin/activate $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(uv run python -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))") $ uv pip install -r requirements.txt polars[cloudpickle]==$PINNED_VERSION $ ./polars-on-premises service --config-path /etc/polars-cloud/config.toml` --- # Environment variables - Polars user guide [Skip to content](https://docs.pola.rs/polars-on-premises/bare-metal/environment-variables/#polars) Environment variables ===================== Polars ------ | Variable | Description | | --- | --- | | `POLARS_ALLOW_PQ_EMPTY_STRUCT` | Allows reading or writing Parquet files that contain empty struct fields that are otherwise rejected. | | `POLARS_TEMP_DIR` | Override the default temporary directory Polars uses for scratch files and some I/O operations. | You may also set any Polars OSS-recognized environment variables. Polars on-premises ------------------ | Variable | Description | | --- | --- | | `OTLP_ENDPOINT` | Target endpoint for sending OTLP traces/metrics/logs to your OpenTelemetry collector/observability stack.
e.g. `http://otel-collector:4317`. | | `OTEL_SERVICE_INSTANCE_ID` | OpenTelemetry `service.instance.id` that uniquely identifies this cublet instance in telemetry.
Must match `cublet_id`. | | `PLC_LOG_LEVEL` | Controls logging verbosity for the Polars on-premises components (e.g. scheduler/worker).
e.g. `Info`, `Debug`, `Trace`, _etc._ (follows the Rust [naming](https://docs.rs/log/latest/log/enum.Level.html)
). | --- # Getting started - Polars user guide [Skip to content](https://docs.pola.rs/polars-on-premises/kubernetes/getting-started/#usage) Getting started =============== First of all, make sure to obtain a license for Polars on-premises by [signing up here](https://w0lzyfh2w8o.typeform.com/to/zuoDgoMv) . You will receive an access key for our private Docker registry as well as a JSON-formatted license for running Polars on-premises. Polars on-premises for Kubernetes is distributed through our Helm Chart, which can be found in our [helm-charts repository](https://github.com/polars-inc/helm-charts/) . Usage ----- [Helm](https://helm.sh/) must be installed to use the charts. Please refer to Helm [documentation](https://helm.sh/docs/) to get started. Once Helm is set up properly, add the repository as follows: `helm repo add polars-inc https://polars-inc.github.io/helm-charts` You can then run `helm search repo polars-inc` to see the available charts. Further explanation on the different configuration can be found in the [chart `README.md`](https://github.com/polars-inc/helm-charts/blob/main/charts/polars/README.md) . --- # Manage team - Polars user guide [Skip to content](https://docs.pola.rs/polars-cloud/workspace/team/#manage-team) Manage team =========== The Team page allows you to manage who has access to the workspace. You can invite already existing organization members to join your workspace or invite by email address where they will both join the organization and workspace once they've accepted. Roles ----- There are two types of roles: 1. `Admin` - Able to do anything a member can and additionally invite new members, change roles or workspace settings 2. `Member` - Able to start compute, run queries and inspect results but not able to change settings or invite others. There is also the notion of implicit and explicit roles. An organization admin is implicitly also a workspace admin even though they are not an explicit member of the workspace. You can still add them as an explicit member so they keep access to the workspace even when they are demoted down from organization admin. Workspace admins are able to promote others to admin or demote other admins to member. The system enforces that there is always at least one workspace admin. In case you are unable to contact the only admin of a workspace, you can ask an organization admin for help. --- # Concepts - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/concepts/#concepts) Concepts ======== This chapter describes the core concepts of the Polars API. Understanding these will help you optimise your queries on a daily basis. We will cover the following topics: * [Data types and structures](https://docs.pola.rs/user-guide/concepts/data-types-and-structures/) * [Expressions and contexts](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/) * [Lazy API](https://docs.pola.rs/user-guide/concepts/lazy-api/) --- # Changelog - Polars user guide [Skip to content](https://docs.pola.rs/releases/changelog/#changelog) Changelog ========= Polars uses GitHub to manage both Python and Rust releases. Refer to our [GitHub releases page](https://github.com/pola-rs/polars/releases) for the changelog associated with each new release. --- # About - Polars user guide [Skip to content](https://docs.pola.rs/releases/upgrade/#about) About ===== Polars releases an upgrade guide alongside each breaking release. This guide is intended to help you upgrade from an older Polars version to the new version. Each guide contains all breaking changes that were not previously deprecated, as well as any significant new deprecations. A full list of all changes is available in the [changelog](https://docs.pola.rs/releases/changelog/) . Tip It can be useful to upgrade to the latest non-breaking version before upgrading to a new breaking version. This way, you can run your code and address any deprecation warnings. The upgrade to the new breaking version should then go much more smoothly! Tip One of our maintainers has created a tool for automatically upgrading your Polars code to a later version. It's based on the well-known pyupgrade tool. Try out [polars-upgrade](https://github.com/MarcoGorelli/polars-upgrade) and let us know what you think! Note There are no upgrade guides yet for Rust releases. These will be added once the rate of breaking changes to the Rust API slows down and a [deprecation policy](https://docs.pola.rs/development/versioning/#deprecation-period) is added. --- # Getting started - Polars user guide [Skip to content](https://docs.pola.rs/polars-on-premises/bare-metal/getting-started/#reading-the-license) Getting started =============== First of all, make sure to obtain a license for Polars on-premises by [signing up here](https://w0lzyfh2w8o.typeform.com/to/zuoDgoMv) . You will receive a link to download our binary named `polars-on-premises` as well as a JSON-formatted license for running Polars on-premises. Reading the license ------------------- The license can be read by running the following command: `$ ./polars-on-premises service --print-eula /path/to/license.json` Running the binary ------------------ The main entrypoint is as follows: `$ ./polars-on-premises service --config-path /etc/polars-cloud/config.toml` However, the service requires quite some configuration to get started. Below you can find an example scheduler and worker config, and you can find the full configuration reference [here](https://docs.pola.rs/polars-on-premises/bare-metal/config-reference) . Configuration ------------- The complete configuration reference can be found [here](https://docs.pola.rs/polars-on-premises/bare-metal/config-reference) . ### Example scheduler config Here is a cleaned-up example you can use after the reference tables. It keeps the scheduler single-purpose (no worker role) and turns on observability. `cluster_id = "polars-cluster" instance_id = "scheduler" license = "/etc/polars/license.json" memory_limit = 1073741824 # 1 GiB [scheduler] enabled = true allow_local_sinks = false anonymous_result_location.s3.url = "s3://bucket/path/to/key" n_workers = 4 [observatory] enabled = true max_metrics_bytes_total = 0 [monitoring] enabled = true [static_leader] leader_instance_id = "scheduler" observatory_service.public_addr = "192.168.1.1" scheduler_service.public_addr = "192.168.1.1"` ### Example worker config And the matching worker config. This example gives the worker a local shuffle path and enables observability. `cluster_id = "polars-cluster" instance_id = "worker_0" license = "/etc/polars/license.json" memory_limit = 10737418240 # 10 GiB [worker] enabled = true shuffle_location.local.path = "/opt/shuffle-data-path" [observatory] enabled = true max_metrics_bytes_total = 0 [monitoring] enabled = true [static_leader] leader_instance_id = "scheduler" observatory_service.public_addr = "192.168.1.1" scheduler_service.public_addr = "192.168.1.1"` --- # Version 0.19 - Polars user guide [Skip to content](https://docs.pola.rs/releases/upgrade/0.19/#version-019) Version 0.19 ============ Breaking changes ---------------- ### Aggregation functions no longer support horizontal computation This impacts aggregation functions like `sum`, `min`, and `max`. These functions were overloaded to support both vertical and horizontal computation. Recently, new dedicated functionality for horizontal computation was released, and horizontal computation was deprecated. Restore the old behavior by using the horizontal variant, e.g. `sum_horizontal`. **Example** Before: `>>> df = pl.DataFrame({'a': [1, 2], 'b': [11, 12]}) >>> df.select(pl.sum('a', 'b')) # horizontal computation shape: (2, 1) ┌─────┐ │ sum │ │ --- │ │ i64 │ ╞═════╡ │ 12 │ │ 14 │ └─────┘` After: `>>> df = pl.DataFrame({'a': [1, 2], 'b': [11, 12]}) >>> df.select(pl.sum('a', 'b')) # vertical computation shape: (1, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 3 ┆ 23 │ └─────┴─────┘` ### Update to `all` / `any` `all` will now ignore null values by default, rather than treat them as `False`. For both `any` and `all`, the `drop_nulls` parameter has been renamed to `ignore_nulls` and is now keyword-only. Also fixed an issue when setting this parameter to `False` would erroneously result in `None` output in some cases. To restore the old behavior, set `ignore_nulls` to `False` and check for `None` output. **Example** Before: `>>> pl.Series([True, None]).all() False` After: `>>> pl.Series([True, None]).all() True` ### Improved error types for many methods Improving our error messages is an ongoing effort. We did a sweep of our Python code base and made many improvements to error messages and error types. Most notably, many `ValueError`s were changed to `TypeError`s. If your code relies on handling Polars exceptions, you may have to make some adjustments. **Example** Before: `>>> pl.Series(values=15) ... ValueError: Series constructor called with unsupported type; got 'int'` After: ``>>> pl.Series(values=15) ... TypeError: Series constructor called with unsupported type 'int' for the `values` parameter`` ### Updates to expression input parsing Methods like `select` and `with_columns` accept one or more expressions. But they also accept strings, integers, lists, and other inputs that we try to interpret as expressions. We updated our internal logic to parse inputs more consistently. **Example** Before: `>>> pl.DataFrame({'a': [1, 2]}).with_columns(None) shape: (2, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ │ 2 │ └─────┘` After: `>>> pl.DataFrame({'a': [1, 2]}).with_columns(None) shape: (2, 2) ┌─────┬─────────┐ │ a ┆ literal │ │ --- ┆ --- │ │ i64 ┆ null │ ╞═════╪═════════╡ │ 1 ┆ null │ │ 2 ┆ null │ └─────┴─────────┘` ### `shuffle` / `sample` now use an internal Polars seed If you used the built-in Python `random.seed` function to control the randomness of Polars expressions, this will no longer work. Instead, use the new `set_random_seed` function. **Example** Before: `import random random.seed(1)` After: `import polars as pl pl.set_random_seed(1)` Deprecations ------------ Creating a consistent and intuitive API is hard; finding the right name for each function, method, and parameter might be the hardest part. The new version comes with several naming changes, and you will most likely run into deprecation warnings when upgrading to `0.19`. If you want to upgrade without worrying about deprecation warnings right now, you can add the following snippet to your code: `import warnings warnings.filterwarnings("ignore", category=DeprecationWarning)` ### `groupby` renamed to `group_by` This is not a change we make lightly, as it will impact almost all our users. But "group by" is really two different words, and our naming strategy dictates that these should be separated by an underscore. Most likely, a simple search and replace will be enough to take care of this update: * Search: `.groupby(` * Replace: `.group_by(` ### `apply` renamed to `map_*` `apply` is probably the most misused part of our API. Many Polars users come from pandas, where `apply` has a completely different meaning. We now consolidate all our functionality for user-defined functions under the name `map`. This results in the following renaming: | Before | After | | --- | --- | | `Series/Expr.apply` | `map_elements` | | `Series/Expr.rolling_apply` | `rolling_map` | | `DataFrame.apply` | `map_rows` | | `GroupBy.apply` | `map_groups` | | `apply` | `map_groups` | | `map` | `map_batches` | --- # Ecosystem - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/ecosystem/#ecosystem) Ecosystem ========= Introduction ------------ On this page you can find a non-exhaustive list of libraries and tools that support Polars. As the data ecosystem is evolving fast, more libraries will likely support Polars in the future. One of the main drivers is that Polars makes adheres its memory layout to the `Apache Arrow` spec. ### Table of contents: * [Apache Arrow](https://docs.pola.rs/user-guide/ecosystem/#apache-arrow) * [Data visualisation](https://docs.pola.rs/user-guide/ecosystem/#data-visualisation) * [IO](https://docs.pola.rs/user-guide/ecosystem/#io) * [Machine learning](https://docs.pola.rs/user-guide/ecosystem/#machine-learning) * [Other](https://docs.pola.rs/user-guide/ecosystem/#other) * * * ### Apache Arrow [Apache Arrow](https://arrow.apache.org/) enables zero-copy reads of data within the same process, meaning that data can be directly accessed in its in-memory format without the need for copying or serialisation. This enhances performance when integrating with different tools using Apache Arrow. Polars is compatible with a wide range of libraries that also make use of Apache Arrow, like Pandas and DuckDB. ### Data visualisation See the [dedicated visualization section](https://docs.pola.rs/user-guide/misc/visualization/) . ### IO #### Delta Lake The [Delta Lake](https://github.com/delta-io/delta-rs) project aims to unlock the power of the Deltalake for as many users and projects as possible by providing native low-level APIs aimed at developers and integrators, as well as a high-level operations API that lets you query, inspect, and operate your Delta Lake with ease. Delta Lake builds on the native Polars Parquet reader allowing you to write standard Polars queries against a DeltaTable. Read how to use Delta Lake with Polars [at Delta Lake](https://delta-io.github.io/delta-rs/integrations/delta-lake-polars/#reading-a-delta-lake-table-with-polars) . ### Machine Learning #### Scikit Learn The [Scikit Learn](https://scikit-learn.org/stable/) machine learning package accepts a Polars `DataFrame` as input/output to all transformers and as input to models. [skrub](https://skrub-data.org/) helps encoding DataFrames for scikit-learn estimators (eg converting dates or strings). #### XGBoost & LightGBM XGBoost and LightGBM are gradient boosting packages for doing regression or classification on tabular data. [XGBoost accepts Polars `DataFrame` and `LazyFrame` as input](https://xgboost.readthedocs.io/en/latest/python/python_intro.html) while LightGBM accepts Polars `DataFrame` as input. #### Time series forecasting The [Nixtla time series forecasting packages](https://nixtlaverse.nixtla.io/statsforecast/docs/getting-started/getting_started_complete_polars.html) accept a Polars `DataFrame` as input. #### Hugging Face Hugging Face is a platform for working with machine learning datasets and models. [Polars can be used to work with datasets downloaded from Hugging Face](https://docs.pola.rs/user-guide/io/hugging-face/) . #### Deep learning frameworks A `DataFrame` can be transformed [into a PyTorch format using `to_torch`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.to_torch.html) or [into a JAX format using `to_jax`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.to_jax.html) . ### Other #### DuckDB [DuckDB](https://duckdb.org/) is a high-performance analytical database system. It is designed to be fast, reliable, portable, and easy to use. DuckDB provides a rich SQL dialect, with support far beyond basic SQL. DuckDB supports arbitrary and nested correlated subqueries, window functions, collations, complex types (arrays, structs), and more. Read about integration with Polars [on the DuckDB website](https://duckdb.org/docs/guides/python/polars) . #### Great Tables With [Great Tables](https://posit-dev.github.io/great-tables/articles/intro.html) anyone can make wonderful-looking tables in Python. Here is a [blog post](https://posit-dev.github.io/great-tables/blog/polars-styling/) on how to use Great Tables with Polars. #### LanceDB [LanceDB](https://lancedb.com/) is a developer-friendly, serverless vector database for AI applications. They have added a direct integration with Polars. LanceDB can ingest Polars dataframes, return results as polars dataframes, and export the entire table as a polars lazyframe. See the [LanceDB documentation](https://lancedb.com/docs/integrations/platforms/polars_arrow/) for more details. #### Mage [Mage](https://www.mage.ai/) is an open-source data pipeline tool for transforming and integrating data. Learn about integration between Polars and Mage at [docs.mage.ai](https://docs.mage.ai/integrations/polars) . #### marimo [marimo](https://marimo.io/) is a reactive notebook for Python and SQL that models notebooks as dataflow graphs. It offers built-in support for Polars, allowing seamless integration of Polars dataframes in an interactive, reactive environment - such as displaying rich Polars tables, no-code transformations of Polars dataframes, or selecting points on a Polars-backed reactive chart. #### Narwhals [Narwhals](https://narwhals-dev.github.io/narwhals/) is a lightweight compatibility layer between dataframe libraries. It mirrors the Polars API and allows to run Polars natively, without any conversion overhead, in libraries like Plotly and others that have adopted it for dataframe interoperability. See the [Narwhals ecosystem](https://narwhals-dev.github.io/narwhals/ecosystem/) for more details. --- # Expressions - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/#expressions) Expressions =========== We [introduced the concept of “expressions” in a previous section](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/#expressions) . In this section we will focus on exploring the types of expressions that Polars offers. Each section gives an overview of what they do and provides additional examples. * Essentials: * [Basic operations](https://docs.pola.rs/user-guide/expressions/basic-operations/) – how to do basic operations on dataframe columns, like arithmetic calculations, comparisons, and other common, general-purpose operations * [Expression expansion](https://docs.pola.rs/user-guide/expressions/expression-expansion/) – what is expression expansion and how to use it * [Casting](https://docs.pola.rs/user-guide/expressions/casting/) – how to convert / cast values to different data types * How to work with specific types of data or data type namespaces: * [Strings](https://docs.pola.rs/user-guide/expressions/strings/) – how to work with strings and the namespace `str` * [Lists and arrays](https://docs.pola.rs/user-guide/expressions/lists-and-arrays/) – the differences between the data types `List` and `Array`, when to use them, and how to use them * [Categorical data and enums](https://docs.pola.rs/user-guide/expressions/categorical-data-and-enums/) – the differences between the data types `Categorical` and `Enum`, when to use them, and how to use them * [Structs](https://docs.pola.rs/user-guide/expressions/structs/) – when to use the data type `Struct` and how to use it * [Missing data](https://docs.pola.rs/user-guide/expressions/missing-data/) – how to work with missing data and how to fill missing data * Types of operations: * [Aggregation](https://docs.pola.rs/user-guide/expressions/aggregation/) – how to work with aggregating contexts like `group_by` * [Window functions](https://docs.pola.rs/user-guide/expressions/window-functions/) – how to apply window functions over columns in a dataframe * [Folds](https://docs.pola.rs/user-guide/expressions/folds/) – how to perform arbitrary computations horizontally across columns * [User-defined Python functions](https://docs.pola.rs/user-guide/expressions/user-defined-python-functions/) – how to apply user-defined Python functions to dataframe columns or to column values * [Numpy functions](https://docs.pola.rs/user-guide/expressions/numpy-functions/) – how to use NumPy native functions on Polars dataframes and series --- # Distributed queries - Polars user guide [Skip to content](https://docs.pola.rs/polars-cloud/run/distributed-engine/#distributed-queries) Distributed queries =================== With the introduction of Polars Cloud, we also introduced the distributed engine. This engine enables users to horizontally scale workloads across multiple machines. Polars has always been optimized for fast and efficient performance on a single machine. However, when querying large datasets from cloud storage, performance is often constrained by the I/O limitations of a single node. By scaling horizontally, these download limitations can be significantly reduced, allowing users to process data at scale. Distributed engine is in open beta The distributed engine currently supports most of Polars API and datatypes. Follow [the tracking issue](https://github.com/pola-rs/polars/issues/21487) to stay up to date. Using distributed engine ------------------------ To execute queries using the distributed engine, you can call the `distributed()` method. `lf: LazyFrame result = ( lf.remote() .distributed() .execute() )` ### Example This example demonstrates running query 3 of the PDS-H benchmarkon scale factor 100 (approx. 100GB of data) using Polars Cloud distributed engine. Run the example yourself Copy and paste the code to you environment and run it. The data is hosted in S3 buckets that use [AWS Requester Pays](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html) , meaning you pay only for pays the cost of the request and the data download from the bucket. The storage costs are covered. First import the required packages and point to the S3 bucket. In this example, we take one of the PDS-H benchmarks queries for demonstration purposes. Python `import polars as pl import polars_cloud as pc lineitem_sf100 = pl.scan_parquet("s3://polars-cloud-samples-us-east-2-prd/pdsh/sf100/lineitem/*.parquet", storage_options={"request_payer": "true"}) customer_sf100 = pl.scan_parquet("s3://polars-cloud-samples-us-east-2-prd/pdsh/sf100/customer/*.parquet", storage_options={"request_payer": "true"}) orders_sf100 = pl.scan_parquet("s3://polars-cloud-samples-us-east-2-prd/pdsh/sf100/orders/*.parquet", storage_options={"request_payer": "true"})` After that we define the query. Note that this query will also run on your local machine if you have the data available. You can generate the data with the [Polars Benchmark repository](https://www.github.com/pola-rs/polars-benchmark) . Python `def pdsh_q3(customer, lineitem, orders): return ( customer.filter(pl.col("c_mktsegment") == "BUILDING") .join(orders, left_on="c_custkey", right_on="o_custkey") .join(lineitem, left_on="o_orderkey", right_on="l_orderkey") .filter(pl.col("o_orderdate") < pl.date(1995, 3, 15)) .filter(pl.col("l_shipdate") > pl.date(1995, 3, 15)) .with_columns( (pl.col("l_extendedprice") * (1 - pl.col("l_discount"))).alias("revenue") ) .group_by("o_orderkey", "o_orderdate", "o_shippriority") .agg(pl.sum("revenue")) .select( pl.col("o_orderkey").alias("l_orderkey"), "revenue", "o_orderdate", "o_shippriority", ) .sort(by=["revenue", "o_orderdate"], descending=[True, False]) )` The final step is to set the compute context and run the query. Here we're using 5 nodes with 10 CPUs and 10GB memory each. `Show()` will return the first 10 rows back to your environment. The query takes around xx seconds to execute. Python `ctx = pc.ComputeContext(workspace="your-workspace", cpus=4, memory=4, cluster_size=5) pdsh_q3(customer_sf100, lineitem_sf100, orders_sf100) .remote(ctx) .distributed() .show()` Try on SF1000 (approx. 1TB of data) You can also run this example on a higher scale factor. The data is available on the same bucket. You can change the URL from `sf100` to `sf1000`. --- # Config file reference - Polars user guide [Skip to content](https://docs.pola.rs/polars-on-premises/bare-metal/config-reference/#config-file-reference) Config file reference ===================== This page describes the different configuration options for Polars on-premises. The config file is a standard TOML file with different sections. Any of the configuration can be overridden using environment variables in the following format: `PC_CUBLET__section_name__key`. ### Top-level configuration The `polars-on-premises` binary requires a license which path is provided as a configuration option, listed below. The license itself has the following shape: `{ "params": { "expiry": "2026-01-31T23:59:59Z", "name": "Company" }, "signature": "..." }` | Key | Type | Description | | --- | --- | --- | | `cluster_id` | string | Logical ID for the cluster; workers and scheduler that share this ID will form a single cluster.
e.g. `prod-eu-1`; must be unique among all clusters. | | `instance_id` | string | Unique ID for this node within the cluster, used for addressing and leader selection.
e.g. `scheduler`, `worker_0`; must be unique per cluster. | | `license` | path | Absolute path to the Polars on-premises license file required to start the process.
e.g. `/etc/polars/license.json`. | | `memory_limit` | integer | Hard memory budget for all components in this node; enforced via cgroups when delegated.
e.g. `1073741824` (1 GiB), `10737418240` (10 GiB). | Example: `cluster_id = "polars-cluster-dev" instance_id = "scheduler" license = "/etc/polars/license.json" memory_limit = 1073741824 # 1 GiB` ### `[scheduler]` section For remote Polars queries without a specific output sink, Polars on-premises can automatically add persistent sink. We call these sinks "anonymous results" sinks. Infrastructure-wise, these sinks are backed by S3-compatible storage accessible from all worker nodes and the Python client. The data written to this location is not automatically deleted, so you need to configure a retention policy for this data yourself. You may configure the credentials using the options listed below; the key names correspond to the [`storage_options` parameter from the `scan_parquet()` method](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) (_e.g._ `aws_access_key_id`, `aws_secret_access_key`, `aws_session_token`, `aws_region`). We currently only support the AWS keys of the `storage_options` dictionary, but note that you can use any other cloud provider that supports the S3 API, such as MinIO or DigitalOcean Spaces. | Key | Type | Description | | --- | --- | --- | | `enabled` | boolean | Whether the scheduler component runs in this process.
`true` for the leader node, `false` on pure workers. | | `allow_local_sinks` | boolean | Whether workers are allowed to write to a shared/local disk visible to the scheduler.
`false` for fully remote/storage-only setups, `true` if you have a shared filesystem. | | `n_workers` | integer | Expected number of workers in this cluster; scheduler waits for the latter to be online before running queries.
e.g. `4`. | | `anonymous_result_location` | object | Destination for results of queries that do not have an explicit sink. Currently supported local mounted (must be reachable on the exact same path and `allow_local_sinks` enabled) and S3-based. Both options must be network reachable by scheduler, workers, and client.
e.g. `/mnt/storage/polars/results`.
e.g. `s3://bucket/path/to/key` | | `anonymous_result_location.local` | object | Object used for local disk-backed anonymous results. | | `anonymous_result_location.local.path` | path | Local path where anonymous results are stored.
e.g. `/mnt/storage/polars/results`. | | `anonymous_result_location.s3` | object | Object used for S3-backed anonymous results. | | `anonymous_result_location.s3.url` | string | S3 bucket url.
e.g. `s3://bucket/path/to/key`. | | `anonymous_result_location.s3.aws_endpoint_url` | string | Storage option configuration, see [`scan_parquet()`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html)
. | | `anonymous_result_location.s3.aws_region` | string | Storage option configuration.
e.g. `eu-east-1` | | `anonymous_result_location.s3.aws_access_key_id` | string | Storage option configuration. | | `anonymous_result_location.s3.aws_secret_access_key` | string | Storage option configuration. | | `client_service` | object | Object used for configuring the bind address of the client service. This is the service used by the polars-cloud Python client. Defaults to `0.0.0.0:5051`. | | `client_service.bind_addr` | string | Bind address for the client service.
e.g. `0.0.0.0:5051`. | | `client_service.bind_addr.ip` | string | IP address for the client service bind address.
e.g. `192.168.1.1`. | | `client_service.bind_addr.port` | integer | Port for the client service bind address.
e.g. `5051`. | | `client_service.bind_addr.hostname` | string | Alternative to `ip`, resolved once at startup.
e.g. `my-host-1`. | | `worker_service` | object | Object used for configuring the bind address of the worker service. This is an internal service used by the workers. Defaults to `0.0.0.0:5050`. | | `worker_service.bind_addr` | string | Bind address for the worker service.
e.g. `0.0.0.0:5050`. | | `worker_service.bind_addr.ip` | string | IP address for the worker service bind address.
e.g. `192.168.1.1`. | | `worker_service.bind_addr.port` | integer | Port for the worker service bind address.
e.g. `5050`. | | `worker_service.bind_addr.hostname` | string | Alternative to `ip`, resolved once at startup.
e.g. `my-host-2`. | Example: `[scheduler] enabled = true allow_local_sinks = false n_workers = 4 anonymous_result_location.s3.url = "s3://bucket/path/to/key" anonymous_result_location.s3.aws_secret_access_key = "YOURSECRETKEY" anonymous_result_location.s3.aws_access_key_id = "YOURACCESSKEY" client_service.bind_addr = "0.0.0.0:5051" worker_service.bind_addr.hostname = "my-host-2"` Example with mounted local disk as anonymous result destination: `[scheduler] enabled = true allow_local_sinks = true anonymous_result_location = "/mnt/storage/polars/results"` ### `[worker]` section During distributed query execution, data may be shuffled between workers. A local path can be provided, but shuffles can also be configured to use S3-compatible storage (accessible from all worker nodes). You may configure the credentials using the options listed below; the key names correspond to the [`storage_options` parameter from the `scan_parquet()` method](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) (_e.g._ `aws_access_key_id`, `aws_secret_access_key`, `aws_session_token`, `aws_region`). | Key | Type | Description | | --- | --- | --- | | `enabled` | boolean | Whether the worker component runs in this process.
`true` on worker nodes, `false` on the dedicated scheduler. | | `heartbeat_period` | string | Interval for worker heartbeats towards the scheduler, used for liveness and load reporting. Either an ISO 8601 duration format or a jiff friendly duration format (see https://docs.rs/jiff/0.2.18/jiff/fmt/friendly/)
e.g. `5 secs`.
e.g. `PT5S`. | | `shuffle_location` | object | Object used for shuffle data storage. | | `shuffle_location.local` | object | Object used for local disk-backed shuffle data storage. | | `shuffle_location.local.path` | path | Local path where shuffle/intermediate data is stored; fast local SSD is recommended.
e.g. `/mnt/storage/polars/shuffle`. | | `shuffle_location.s3` | object | Object used for S3-backed shuffle data storage. | | `shuffle_location.s3.url` | path | Destination for shuffle/intermediate data.
e.g. `s3://bucket/path/to/key`. | | `shuffle_location.s3.aws_endpoint_url` | string | Storage option configuration, see [`scan_parquet()`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html)
. | | `shuffle_location.s3.aws_region` | string | Storage option configuration.
e.g. `eu-east-1` | | `shuffle_location.s3.aws_access_key_id` | string | Storage option configuration. | | `shuffle_location.s3.aws_secret_access_key` | string | Storage option configuration. | | `task_service` | object | Object used for configuring the bind address of the task service. This is an internal service in the worker for receiving tasks from the scheduler. Defaults to `0.0.0.0:5052`. | | `task_service.bind_addr` | string | Bind address for the task service.
e.g. `0.0.0.0:5052`. | | `task_service.bind_addr.ip` | string | IP address for the task service bind address.
e.g. `192.168.1.1`. | | `task_service.bind_addr.port` | integer | Port for the task service bind address.
e.g. `5052`. | | `task_service.bind_addr.hostname` | string | Alternative to `ip`, resolved once at startup.
e.g. `my-host-2`. | | `task_service.public_addr` | string | Address at which this service is reachable by the scheduler. Defaults to the bind address if not set. This field is required when the bind address is `0.0.0.0`.
e.g. `192.168.1.1`. | | `task_service.public_addr.ip` | string | IP address for the task service public address.
e.g. `192.168.1.2`. | | `task_service.public_addr.port` | integer | Port for the task service public address.
e.g. `5052`. | | `task_service.public_addr.hostname` | string | Alternative to `ip`, resolved once at startup.
e.g. `my-host-2`. | | `shuffle_service` | object | Object used for configuring the bind address of the task service. This is an internal service in the worker for receiving tasks from the scheduler. Defaults to `0.0.0.0:5052`. | | `shuffle_service.bind_addr` | string | Bind address for the task service.
e.g. `0.0.0.0:5053`. | | `shuffle_service.bind_addr.ip` | string | IP address for the task service bind address.
e.g. `192.168.1.1`. | | `shuffle_service.bind_addr.port` | integer | Port for the task service bind address.
e.g. `5053`. | | `shuffle_service.bind_addr.hostname` | string | Alternative to `ip`, resolved once at startup.
e.g. `my-host-2`. | | `shuffle_service.public_addr` | string | Address at which this service is reachable by the scheduler. Defaults to the bind address if not set. This field is required when the bind address is `0.0.0.0`.
e.g. `192.168.1.1`. | | `shuffle_service.public_addr.ip` | string | IP address for the task service public address.
e.g. `192.168.1.2`. | | `shuffle_service.public_addr.port` | integer | Port for the task service public address.
e.g. `5053`. | | `shuffle_service.public_addr.hostname` | string | Alternative to `ip`, resolved once at startup.
e.g. `my-host-2`. | Example: `[worker] enabled = true heartbeat_period = "5 secs" task_service.bind_addr = "0.0.0.0:1234" task_service.public_addr.hostname = "my-host-2" shuffle_service.public_addr.hostname = "my-host-2" shuffle_location.local.path = "/mnt/storage/polars/shuffle"` ### `[observatory]` section | Key | Type | Description | | --- | --- | --- | | `enabled` | boolean | Enable sending/receiving profiling data so clients can call `result.await_profile()`.
`true` on both scheduler and workers if you want profiles on queries; `false` to disable. | | `max_metrics_bytes_total` | integer | How many bytes all the worker host metrics will consume in total. If a system-wide memory limit is specified then this is added to the share that the scheduler takes. Note that the worker host metrics is not yet available, so this configuration can be set to 0. | | `service` | object | Object used for configuring the bind address of the observatory service. This is an internal service in the scheduler for receiving profiling data from all nodes. Defaults to `0.0.0.0:5049`. | | `service.bind_addr` | string | Bind address for the observatory service.
e.g. `0.0.0.0:5049`. | | `service.bind_addr.ip` | string | IP address for the observatory service bind address.
e.g. `192.168.1.1`. | | `service.bind_addr.port` | integer | Port for the observatory service bind address.
e.g. `5049`. | | `service.bind_addr.hostname` | string | Alternative to `ip`, resolved once at startup.
e.g. `my-host-2`. | Example: `[observatory] enabled = true max_metrics_bytes_total = 0` ### `[monitoring]` section | Key | Type | Description | | --- | --- | --- | | `enabled` | boolean | Enable sending/receiving monitoring data to the observatory service. If enabled, it will use the address specified in `observatory_service.public_addr`. | Example: `[monitoring] enabled = true` ### `[static_leader]` section | Key | Type | Description | | --- | --- | --- | | `leader_instance_id` | string | ID of the leader node; should match the scheduler’s `instance_id`.
Typically `scheduler` to match your scheduler node. | | `scheduler_service.public_addr` | string | Address at which the scheduler client service is reachable from this node.
e.g. `192.168.1.1`. | | `scheduler_service.public_addr.ip` | string | IP address for the scheduler client service public address.
e.g. `192.168.1.1`. | | `scheduler_service.public_addr.port` | integer | Port for the scheduler client service public address.
e.g. `5051`. | | `scheduler_service.public_addr.hostname` | string | Alternative to `ip`, resolved once at startup.
e.g. `my-host-2`. | | `observatory_service.public_addr` | string | Address at which the observatory service is reachable from this node.
e.g. `192.168.1.1`. | | `observatory_service.public_addr.ip` | string | IP address for the observatory service public address.
e.g. `192.168.1.1`. | | `observatory_service.public_addr.port` | integer | Port for the observatory service public address.
e.g. `5049`. | | `observatory_service.public_addr.hostname` | string | Alternative to `ip`, resolved once at startup.
e.g. `my-host-2`. | Example: `[static_leader] leader_instance_id = "scheduler" observatory_service.public_addr = "127.0.0.1" scheduler_service.public_addr = "127.0.0.1"` --- # GPU Support [Open Beta] - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/gpu-support/#gpu-support-open-beta) GPU Support \[Open Beta\] ========================= Polars provides an in-memory, GPU-accelerated execution engine for Python users of the Lazy API on NVIDIA GPUs using [RAPIDS cuDF](https://docs.rapids.ai/api/cudf/stable/) . This functionality is available in Open Beta and is undergoing rapid development. ### System Requirements * NVIDIA Volta™ or higher GPU with [compute capability](https://developer.nvidia.com/cuda-gpus) 7.0+ * CUDA 12 (CUDA 11 support ends with RAPIDS v25.06; see [RSN 48](https://docs.rapids.ai/notices/rsn0048/) ; if you're using CUDA 11, see the installation note below) * Linux or Windows Subsystem for Linux 2 (WSL2) See the [RAPIDS installation guide](https://docs.rapids.ai/install#system-req) for full details. ### Installation You can install the GPU backend for Polars with a feature flag as part of a normal [installation](https://docs.pola.rs/user-guide/installation/) . Python `pip install polars[gpu]` Note RAPIDS cuDF will **drop CUDA 11 support** starting with version **25.08**. If you are using CUDA 11, you must pin to `cudf-polars-cu11==25.06`. See the official [deprecation notice (RSN 48)](https://docs.rapids.ai/notices/rsn0048/) for details. Python `pip install polars cudf-polars-cu11` ### Usage Having built a query using the lazy API [as normal](https://docs.pola.rs/user-guide/lazy/) , GPU-enabled execution is requested by running `.collect(engine="gpu")` instead of `.collect()`. Python `import polars as pl df = pl.LazyFrame({"a": [1.242, 1.535]}) q = df.select(pl.col("a").round(1)) result = q.collect(engine="gpu") print(result)` `shape: (2, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 1.2 │ │ 1.5 │ └─────┘` For more detailed control over the execution, for example to specify which GPU to use on a multi-GPU node, we can provide a `GPUEngine` object. By default, the GPU engine will use a configuration applicable to most use cases. Python `q = df.select((pl.col("a") ** 4)) result = q.collect(engine=pl.GPUEngine(device=1)) print(result)` `shape: (2, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 2.379504 │ │ 5.551796 │ └──────────┘` ### How It Works When you use the GPU-accelerated engine, Polars creates and optimizes a query plan and dispatches to a [RAPIDS](https://rapids.ai/) cuDF-based physical execution engine to compute the results on NVIDIA GPUs. The final result is returned as a normal CPU-backed Polars dataframe. ### What's Supported on the GPU? GPU support is currently in Open Beta and the engine is undergoing rapid development. The engine currently supports many, but not all, of the core expressions and data types. Since expressions are composable, it's not feasible to list a full matrix of expressions supported on the GPU. Instead, we provide a list of the high-level categories of expressions and interfaces that are currently supported and not supported. #### Supported * LazyFrame API * SQL API * I/O from CSV, Parquet, ndjson, and in-memory CPU DataFrames. * Operations on numeric, logical, string, and datetime types * String processing * Aggregations including grouped and rolling variants * Joins * Filters * Missing data * Concatenation #### Not Supported * Eager DataFrame API * Streaming API * Date, Categorical, Enum, Time, Array, Binary and Object data types * Specific expression for Datetime with Timezone and List types * Time series resampling * Folds * User-defined functions * Excel and Database file formats #### Did my query use the GPU? The release of the GPU engine in Open Beta implies that we expect things to work well, but there are still some rough edges we're working on. In particular the full breadth of the Polars expression API is not yet supported. With fallback to the CPU, your query _should_ complete, but you might not observe any change in the time it takes to execute. There are two ways to get more information on whether the query ran on the GPU. When running in verbose mode, any queries that cannot execute on the GPU will issue a `PerformanceWarning`: Python `df = pl.LazyFrame( { "key": [1, 1, 1, 2, 3, 3, 2, 2], "value": [1, 2, 3, 4, 5, 6, 7, 8], } ) q = df.select(pl.col("value").sum().over("key")) with pl.Config() as cfg: cfg.set_verbose(True) result = q.collect(engine="gpu") print(result)` `PerformanceWarning: Query execution with GPU not supported, reason: : Grouped rolling window not implemented # some details elided shape: (8, 1) ┌───────┐ │ value │ │ --- │ │ i64 │ ╞═══════╡ │ 6 │ │ 6 │ │ 6 │ │ 19 │ │ 11 │ │ 11 │ │ 19 │ │ 19 │ └───────┘` To disable fallback, and have the GPU engine raise an exception if a query is unsupported, we can pass an appropriately configured `GPUEngine` object: Python `q.collect(engine=pl.GPUEngine(raise_on_fail=True))` `Traceback (most recent call last): File "", line 1, in File "/home/coder/third-party/polars/py-polars/polars/lazyframe/frame.py", line 2035, in collect return wrap_df(ldf.collect(callback)) polars.exceptions.ComputeError: 'cuda' conversion failed: NotImplementedError: Grouped rolling window not implemented` Currently, only the proximal cause of failure to execute on the GPU is reported, we plan to extend this functionality to report all unsupported operations for a query. ### Testing The Polars and NVIDIA RAPIDS teams run comprehensive unit and integration tests to ensure that the GPU-accelerated Polars backend works smoothly. The **full** Polars test suite is run on every commit made to the GPU engine, ensuring consistency of results. The GPU engine currently passes 99.2% of the Polars unit tests with CPU fallback enabled. Without CPU fallback, the GPU engine passes 88.8% of the Polars unit tests. With fallback, there are approximately 100 failing tests: around 40 of these fail due to mismatching debug output; there are some cases where the GPU engine produces the a correct result but uses a different data type; the remainder are cases where we do not correctly determine that a query is unsupported and therefore fail at runtime, instead of falling back. ### When Should I Use a GPU? Based on our benchmarking, you're most likely to observe speedups using the GPU engine when your workflow's profile is dominated by grouped aggregations and joins. In contrast I/O bound queries typically show similar performance on GPU and CPU. GPUs typically have less RAM than CPU systems, therefore very large datasets will fail due to out of memory errors. Based on our testing, raw datasets of 50-100 GiB fit (depending on the workflow) well with a GPU with 80GiB of memory. ### CPU-GPU Interoperability Both the CPU and GPU engine use the Apache Arrow columnar memory specification, making it possible to quickly move data between the CPU and GPU. Additionally, files written by one engine can be read by the other engine. When using GPU mode, your workflow won't fail if something isn't supported. When you run `collect(engine="gpu")`, the optimized query plan is inspected to see whether it can be executed on the GPU. If it can't, it will transparently fall back to the standard Polars engine and run on the CPU. GPU execution is only available in the Lazy API, so materialized DataFrames will reside in CPU memory when the query execution finishes. ### Providing feedback Please report issues, and missing features, on the Polars [issue tracker](https://github.com/pola-rs/polars/issues) . --- # Version 0.20 - Polars user guide [Skip to content](https://docs.pola.rs/releases/upgrade/0.20/#version-020) Version 0.20 ============ Breaking changes ---------------- ### Change default `join` behavior with regard to null values Previously, null values in the join key were considered a value like any other value. This meant that null values in the left frame would be joined with null values in the right frame. This is expensive and does not match default behavior in SQL. Default behavior has now been changed to ignore null values in the join key. The previous behavior can be retained by setting `join_nulls=True`. **Example** Before: `>>> df1 = pl.DataFrame({"a": [1, 2, None], "b": [4, 4, 4]}) >>> df2 = pl.DataFrame({"a": [None, 2, 3], "c": [5, 5, 5]}) >>> df1.join(df2, on="a", how="inner") shape: (2, 3) ┌──────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞══════╪═════╪═════╡ │ null ┆ 4 ┆ 5 │ │ 2 ┆ 4 ┆ 5 │ └──────┴─────┴─────┘` After: `>>> df1.join(df2, on="a", how="inner") shape: (1, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ 2 ┆ 4 ┆ 5 │ └─────┴─────┴─────┘ >>> df1.join(df2, on="a", how="inner", nulls_equal=True) # Keeps previous behavior shape: (2, 3) ┌──────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞══════╪═════╪═════╡ │ null ┆ 4 ┆ 5 │ │ 2 ┆ 4 ┆ 5 │ └──────┴─────┴─────┘` ### Preserve left and right join keys in outer joins Previously, the result of an outer join did not contain the join keys of the left and right frames. Rather, it contained a coalesced version of the left key and right key. This loses information and does not conform to default SQL behavior. The behavior has been changed to include the original join keys. Name clashes are solved by appending a suffix (`_right` by default) to the right join key name. The previous behavior can be retained by setting `how="outer_coalesce"`. **Example** Before: `>>> df1 = pl.DataFrame({"L1": ["a", "b", "c"], "L2": [1, 2, 3]}) >>> df2 = pl.DataFrame({"L1": ["a", "c", "d"], "R2": [7, 8, 9]}) >>> df1.join(df2, on="L1", how="outer") shape: (4, 3) ┌─────┬──────┬──────┐ │ L1 ┆ L2 ┆ R2 │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪══════╪══════╡ │ a ┆ 1 ┆ 7 │ │ c ┆ 3 ┆ 8 │ │ d ┆ null ┆ 9 │ │ b ┆ 2 ┆ null │ └─────┴──────┴──────┘` After: `>>> df1.join(df2, on="L1", how="outer") shape: (4, 4) ┌──────┬──────┬──────────┬──────┐ │ L1 ┆ L2 ┆ L1_right ┆ R2 │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str ┆ i64 │ ╞══════╪══════╪══════════╪══════╡ │ a ┆ 1 ┆ a ┆ 7 │ │ b ┆ 2 ┆ null ┆ null │ │ c ┆ 3 ┆ c ┆ 8 │ │ null ┆ null ┆ d ┆ 9 │ └──────┴──────┴──────────┴──────┘ >>> df1.join(df2, on="a", how="outer_coalesce") # Keeps previous behavior shape: (4, 3) ┌─────┬──────┬──────┐ │ L1 ┆ L2 ┆ R2 │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪══════╪══════╡ │ a ┆ 1 ┆ 7 │ │ c ┆ 3 ┆ 8 │ │ d ┆ null ┆ 9 │ │ b ┆ 2 ┆ null │ └─────┴──────┴──────┘` ### `count` now ignores null values The `count` method for `Expr` and `Series` now ignores null values. Use `len` to get the count with null values included. Note that `pl.count()` and `group_by(...).count()` are unchanged. These count the number of rows in the context, so nulls are not applicable in the same way. This brings behavior more in line with the SQL standard, where `COUNT(col)` ignores null values but `COUNT(*)` counts rows regardless of null values. **Example** Before: `>>> df = pl.DataFrame({"a": [1, 2, None]}) >>> df.select(pl.col("a").count()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ u32 │ ╞═════╡ │ 3 │ └─────┘` After: `>>> df.select(pl.col("a").count()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ u32 │ ╞═════╡ │ 2 │ └─────┘ >>> df.select(pl.col("a").len()) # Mirrors previous behavior shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ u32 │ ╞═════╡ │ 3 │ └─────┘` ### `NaN` values are now considered equal Floating point `NaN` values were treated as unequal across Polars operations. This has been corrected to better match user expectation and existing standards. While this is considered a bug fix, it is included in this guide in order to draw attention to possible impact on user workflows that may contain `NaN` values. **Example** Before: `>>> s = pl.Series([1.0, float("nan"), float("inf")]) >>> s == s shape: (3,) Series: '' [bool] [ true false true ]` After: `>>> s == s shape: (3,) Series: '' [bool] [ true true true ]` ### Assertion utils updates to exact checking and `NaN` equality The assertion utility functions `assert_frame_equal` and `assert_series_equal` would use the tolerance parameters `atol` and `rtol` to do approximate checking, unless `check_exact` was set to `True`. This could lead to some surprising behavior, as integers are generally thought of as exact values. Integer values are now always checked exactly. To do inexact checking, convert to float first. Additionally, the `nans_compare_equal` parameter has been removed and `NaN` values are now always considered equal, which was the previous default behavior. This parameter had previously been deprecated but has been removed before the end of the standard deprecation period to facilitate the change to `NaN` equality. **Example** Before: `>>> from polars.testing import assert_frame_equal >>> df1 = pl.DataFrame({"id": [123456]}) >>> df2 = pl.DataFrame({"id": [123457]}) >>> assert_frame_equal(df1, df2) # Passes` After: `>>> assert_frame_equal(df1, df2) ... AssertionError: DataFrames are different (value mismatch for column 'id') [left]: [123456] [right]: [123457]` ### Allow all `DataType` objects to be instantiated Polars data types are subclasses of the `DataType` class. We had a 'hack' in place that automatically converted data types instantiated without any arguments to the `class`, rather than actually instantiating it. The idea was to allow specifying data types as `Int64` rather than `Int64()`, which is more succinct. However, this caused some unexpected behavior when working directly with data type objects, especially as there was a discrepancy with data types like `Datetime` which _will_ be instantiated in many cases. Going forward, instantiating a data type will always return an instance of that class. Both classes an instances are handled by Polars, so the previous short syntax is still available. Methods that return data types like `Series.dtype` and `DataFrame.schema` now always return instantiated data types objects. You may have to update some of your data type checks if you were not already using the equality operator (`==`), as well as update some type hints. **Example** Before: `>>> s = pl.Series([1, 2, 3], dtype=pl.Int8) >>> s.dtype == pl.Int8 True >>> s.dtype is pl.Int8 True >>> isinstance(s.dtype, pl.Int8) False` After: `>>> s.dtype == pl.Int8 True >>> s.dtype is pl.Int8 False >>> isinstance(s.dtype, pl.Int8) True` ### Update constructors for `Decimal` and `Array` data types The data types `Decimal` and `Array` have had their parameters switched around. The new constructors should more closely match user expectations. **Example** Before: `>>> pl.Array(2, pl.Int16) Array(Int16, 2) >>> pl.Decimal(5, 10) Decimal(precision=10, scale=5)` After: `>>> pl.Array(pl.Int16, 2) Array(Int16, width=2) >>> pl.Decimal(10, 5) Decimal(precision=10, scale=5)` ### `DataType.is_nested` changed from a property to a class method This is a minor change, but a very important one to properly update. Failure to update accordingly may result in faulty logic, as Python will evaluate the _method_ to `True`. For example, `if dtype.is_nested` will now evaluate to `True` regardless of the data type, because it returns the method, which Python considers truthy. **Example** Before: `>>> pl.List(pl.Int8).is_nested True` After: `>>> pl.List(pl.Int8).is_nested() True` ### Smaller integer data types for datetime components `dt.month`, `dt.week` Most datetime components such as `month` and `week` would previously return a `UInt32` type. This has been updated to the smallest appropriate signed integer type. This should reduce memory consumption. | Method | Dtype old | Dtype new | | --- | --- | --- | | year | i32 | i32 | | iso\_year | i32 | i32 | | quarter | u32 | i8 | | month | u32 | i8 | | week | u32 | i8 | | day | u32 | i8 | | weekday | u32 | i8 | | ordinal\_day | u32 | i16 | | hour | u32 | i8 | | minute | u32 | i8 | | second | u32 | i8 | | millisecond | u32 | i32\* | | microsecond | u32 | i32 | | nanosecond | u32 | i32 | _\*Technically, `millisecond` can be an `i16`. This may be updated in the future._ **Example** Before: `>>> from datetime import date >>> s = pl.Series([date(2023, 12, 31), date(2024, 1, 1)]) >>> s.dt.month() shape: (2,) Series: '' [u32] [ 12 1 ]` After: `>>> s.dt.month() shape: (2,) Series: '' [u8] [ 12 1 ]` ### Series now defaults to `Null` data type when no data is present This replaces the previous behavior of initializing as a `Float32` type. **Example** Before: `>>> pl.Series("a", [None]) shape: (1,) Series: 'a' [f32] [ null ]` After: `>>> pl.Series("a", [None]) shape: (1,) Series: 'a' [null] [ null ]` ### `replace` reimplemented with slightly different behavior The new implementation is mostly backwards compatible. Please do note the following: 1. The logic for determining the return data type has changed. You may want to specify `return_dtype` to override the inferred data type, or take advantage of the new function signature (separate `old` and `new` parameters) to influence the return type. 2. The previous workaround for referencing other columns as default by using a struct column no longer works. It now simply works as expected, no workaround needed. **Example** Before: `>>> df = pl.DataFrame({"a": [1, 2, 2, 3], "b": [1.5, 2.5, 5.0, 1.0]}, schema={"a": pl.Int8, "b": pl.Float64}) >>> df.select(pl.col("a").replace({2: 100})) shape: (4, 1) ┌─────┐ │ a │ │ --- │ │ i8 │ ╞═════╡ │ 1 │ │ 100 │ │ 100 │ │ 3 │ └─────┘ >>> df.select(pl.struct("a", "b").replace({2: 100}, default=pl.col("b"))) shape: (4, 1) ┌───────┐ │ a │ │ --- │ │ f64 │ ╞═══════╡ │ 1.5 │ │ 100.0 │ │ 100.0 │ │ 1.0 │ └───────┘` After: `>>> df.select(pl.col("a").replace({2: 100})) shape: (4, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ │ 100 │ │ 100 │ │ 3 │ └─────┘ >>> df.select(pl.col("a").replace({2: 100}, default=pl.col("b"))) # No struct needed shape: (4, 1) ┌───────┐ │ a │ │ --- │ │ f64 │ ╞═══════╡ │ 1.5 │ │ 100.0 │ │ 100.0 │ │ 1.0 │ └───────┘` ### `value_counts` resulting column renamed from `counts` to `count` The resulting struct field for the `value_counts` method has been renamed from `counts` to `count`. **Example** Before: `>>> s = pl.Series("a", ["x", "x", "y"]) >>> s.value_counts() shape: (2, 2) ┌─────┬────────┐ │ a ┆ counts │ │ --- ┆ --- │ │ str ┆ u32 │ ╞═════╪════════╡ │ x ┆ 2 │ │ y ┆ 1 │ └─────┴────────┘` After: `>>> s.value_counts() shape: (2, 2) ┌─────┬───────┐ │ a ┆ count │ │ --- ┆ --- │ │ str ┆ u32 │ ╞═════╪═══════╡ │ x ┆ 2 │ │ y ┆ 1 │ └─────┴───────┘` ### Update `read_parquet` to use Object Store rather than fsspec If you were using `read_parquet`, installing `fsspec` as an optional dependency is no longer required. The new Object Store implementation was already in use for `scan_parquet`. It may have slightly different behavior in certain cases, such as how credentials are detected and how downloads are performed. The resulting `DataFrame` should be identical between versions. Deprecations ------------ ### Cumulative functions renamed from `cum*` to `cum_*` Technically, this deprecation was introduced in version `0.19.14`, but many users will first encounter it when upgrading to `0.20`. It's a relatively impactful change, which is why we mention it here. | Old name | New name | | --- | --- | | `cumfold` | `cum_fold` | | `cumreduce` | `cum_reduce` | | `cumsum` | `cum_sum` | | `cumprod` | `cum_prod` | | `cummin` | `cum_min` | | `cummax` | `cum_max` | | `cumcount` | `cum_count` | --- # Installation - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/installation/#installation) Installation ============ Polars is a library and installation is as simple as invoking the package manager of the corresponding programming language. Python Rust `pip install polars # Or for legacy CPUs without AVX2 support pip install polars[rtcompat]` `cargo add polars -F lazy # Or Cargo.toml [dependencies] polars = { version = "x", features = ["lazy", ...]}` Big Index --------- By default, Polars dataframes are limited to \\(2^{32}\\) rows (~4.3 billion). Increase this limit to \\(2^{64}\\) (~18 quintillion) by enabling the big index extension: Python Rust `pip install polars[rt64]` `cargo add polars -F bigidx # Or Cargo.toml [dependencies] polars = { version = "x", features = ["bigidx", ...] }` Legacy CPU ---------- To install Polars for Python on an old CPU without [AVX](https://en.wikipedia.org/wiki/Advanced_Vector_Extensions) support, run: Python `pip install polars[rtcompat]` Importing --------- To use the library, simply import it into your project: Python Rust `import polars as pl` `use polars::prelude::*;` Feature flags ------------- By using the above command you install the core of Polars onto your system. However, depending on your use case, you might want to install the optional dependencies as well. These are made optional to minimize the footprint. The flags are different depending on the programming language. Throughout the user guide we will mention when a functionality used requires an additional dependency. ### Python `# For example pip install 'polars[numpy,fsspec]'` #### All | Tag | Description | | --- | --- | | all | Install all optional dependencies. | #### GPU | Tag | Description | | --- | --- | | gpu | Run queries on NVIDIA GPUs. | Note See [GPU support](https://docs.pola.rs/user-guide/gpu-support/) for more detailed instructions and prerequisites. #### Interoperability | Tag | Description | | --- | --- | | pandas | Convert data to and from pandas dataframes/series. | | numpy | Convert data to and from NumPy arrays. | | pyarrow | Convert data to and from PyArrow tables/arrays. | | pydantic | Convert data from Pydantic models to Polars. | #### Excel | Tag | Description | | --- | --- | | calamine | Read from Excel files with the calamine engine. | | openpyxl | Read from Excel files with the openpyxl engine. | | xlsx2csv | Read from Excel files with the xlsx2csv engine. | | xlsxwriter | Write to Excel files with the XlsxWriter engine. | | excel | Install all supported Excel engines. | #### Database | Tag | Description | | --- | --- | | adbc | Read from and write to databases with the Arrow Database Connectivity (ADBC) engine. | | connectorx | Read from databases with the ConnectorX engine. | | sqlalchemy | Write to databases with the SQLAlchemy engine. | | database | Install all supported database engines. | #### Cloud | Tag | Description | | --- | --- | | fsspec | Read from and write to remote file systems. | #### Other I/O | Tag | Description | | --- | --- | | deltalake | Read from and write to Delta tables. | | iceberg | Read from Apache Iceberg tables. | #### Other | Tag | Description | | --- | --- | | async | Collect LazyFrames asynchronously. | | cloudpickle | Serialize user-defined functions. | | graph | Visualize LazyFrames as a graph. | | plot | Plot dataframes through the `plot` namespace. | | style | Style dataframes through the `style` namespace. | | timezone | Timezone support[1](https://docs.pola.rs/user-guide/installation/#fn:note)
. | ### Rust `# Cargo.toml [dependencies] polars = { version = "0.26.1", features = ["lazy", "temporal", "describe", "json", "parquet", "dtype-datetime"] }` The opt-in features are: * Additional data types: * `dtype-date` * `dtype-datetime` * `dtype-time` * `dtype-duration` * `dtype-i8` * `dtype-i16` * `dtype-i128` * `dtype-u8` * `dtype-u16` * `dtype-u128` * `dtype-categorical` * `dtype-struct` * `lazy` - Lazy API: * `regex` - Use regexes in column selection. * `dot_diagram` - Create dot diagrams from lazy logical plans. * `sql` - Pass SQL queries to Polars. * `streaming` - Be able to process datasets that are larger than RAM. * `random` - Generate arrays with randomly sampled values * `ndarray`\- Convert from `DataFrame` to `ndarray` * `temporal` - Conversions between [Chrono](https://docs.rs/chrono/) and Polars for temporal data types * `timezones` - Activate timezone support. * `strings` - Extra string utilities for `StringChunked`: * `string_pad` - for `pad_start`, `pad_end`, `zfill`. * `string_to_integer` - for `parse_int`. * `object` - Support for generic ChunkedArrays called `ObjectChunked` (generic over `T`). These are downcastable from Series through the [Any](https://doc.rust-lang.org/std/any/index.html) trait. * Performance related: * `nightly` - Several nightly only features such as SIMD and specialization. * `performant` - more fast paths, slower compile times. * `bigidx` - Activate this feature if you expect >> \\(2^{32}\\) rows. This allows polars to scale up way beyond that by using `u64` as an index. Polars will be a bit slower with this feature activated as many data structures are less cache efficient. * `cse` - Activate common subplan elimination optimization. * IO related: * `serde` - Support for [serde](https://crates.io/crates/serde) serialization and deserialization. Can be used for JSON and more serde supported serialization formats. * `serde-lazy` - Support for [serde](https://crates.io/crates/serde) serialization and deserialization. Can be used for JSON and more serde supported serialization formats. * `parquet` - Read Apache Parquet format. * `json` - JSON serialization. * `ipc` - Arrow's IPC format serialization. * `decompress` - Automatically infer compression of csvs and decompress them. Supported compressions: * gzip * zlib * zstd * Dataframe operations: * `dynamic_group_by` - Group by based on a time window instead of predefined keys. Also activates rolling window group by operations. * `sort_multiple` - Allow sorting a dataframe on multiple columns. * `rows` - Create dataframe from rows and extract rows from `dataframes`. Also activates `pivot` and `transpose` operations. * `join_asof` - Join ASOF, to join on nearest keys instead of exact equality match. * `cross_join` - Create the Cartesian product of two dataframes. * `semi_anti_join` - SEMI and ANTI joins. * `row_hash` - Utility to hash dataframe rows to `UInt64Chunked`. * `diagonal_concat` - Diagonal concatenation thereby combining different schemas. * `dataframe_arithmetic` - Arithmetic between dataframes and other dataframes or series. * `partition_by` - Split into multiple dataframes partitioned by groups. * Series/expression operations: * `is_in` - Check for membership in Series. * `zip_with` - Zip two `Series` / `ChunkedArray`s. * `round_series` - round underlying float types of series. * `repeat_by` - Repeat element in an array a number of times specified by another array. * `is_first_distinct` - Check if element is first unique value. * `is_last_distinct` - Check if element is last unique value. * `checked_arithmetic` - checked arithmetic returning `None` on invalid operations. * `dot_product` - Dot/inner product on series and expressions. * `concat_str` - Concatenate string data in linear time. * `reinterpret` - Utility to reinterpret bits to signed/unsigned. * `take_opt_iter` - Take from a series with `Iterator>`. * `mode` - Return the most frequently occurring value(s). * `cum_agg` - `cum_sum`, `cum_min`, and `cum_max`, aggregations. * `rolling_window` - rolling window functions, like `rolling_mean`. * `interpolate` - Interpolate intermediate `None` values. * `extract_jsonpath` - [Run `jsonpath` queries on `StringChunked`](https://goessner.net/articles/JsonPath/) . * `list` - List utils: * `list_gather` - take sublist by multiple indices. * `rank` - Ranking algorithms. * `moment` - Kurtosis and skew statistics. * `ewma` - Exponential moving average windows. * `abs` - Get absolute values of series. * `arange` - Range operation on series. * `product` - Compute the product of a series. * `diff` - `diff` operation. * `pct_change` - Compute change percentages. * `unique_counts` - Count unique values in expressions. * `log` - Logarithms for series. * `list_to_struct` - Convert `List` to `Struct` data types. * `list_count` - Count elements in lists. * `list_eval` - Apply expressions over list elements. * `cumulative_eval` - Apply expressions over cumulatively increasing windows. * `arg_where` - Get indices where condition holds. * `search_sorted` - Find indices where elements should be inserted to maintain order. * `offset_by` - Add an offset to dates that take months and leap years into account. * `trigonometry` - Trigonometric functions. * `sign` - Compute the element-wise sign of a series. * `propagate_nans` - `NaN`\-propagating min/max aggregations. * Dataframe pretty printing: * `fmt` - Activate dataframe formatting. * * * 1. Only needed if you are on Windows. [↩](https://docs.pola.rs/user-guide/installation/#fnref:note "Jump back to footnote 1 in the text") --- # Lazy API - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/concepts/lazy-api/#lazy-api) Lazy API ======== Polars supports two modes of operation: lazy and eager. The examples so far have used the eager API, in which the query is executed immediately. In the lazy API, the query is only evaluated once it is _collected_. Deferring the execution to the last minute can have significant performance advantages and is why the lazy API is preferred in most cases. Let us demonstrate this with an example: Python Rust [`read_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html) `df = pl.read_csv("docs/assets/data/iris.csv") df_small = df.filter(pl.col("sepal_length") > 5) df_agg = df_small.group_by("species").agg(pl.col("sepal_width").mean()) print(df_agg)` [`CsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReader.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") `let df = CsvReadOptions::default() .try_into_reader_with_file_path(Some("docs/assets/data/iris.csv".into())) .unwrap() .finish() .unwrap(); let mask = df.column("sepal_length")?.f64()?.gt(5.0); let df_small = df.filter(&mask)?; #[allow(deprecated)] let df_agg = df_small .group_by(["species"])? .select(["sepal_width"]) .mean()?; println!("{df_agg}");` In this example we use the eager API to: 1. Read the iris [dataset](https://archive.ics.uci.edu/dataset/53/iris) . 2. Filter the dataset based on sepal length. 3. Calculate the mean of the sepal width per species. Every step is executed immediately returning the intermediate results. This can be very wasteful as we might do work or load extra data that is not being used. If we instead used the lazy API and waited on execution until all the steps are defined then the query planner could perform various optimizations. In this case: * Predicate pushdown: Apply filters as early as possible while reading the dataset, thus only reading rows with sepal length greater than 5. * Projection pushdown: Select only the columns that are needed while reading the dataset, thus removing the need to load additional columns (e.g., petal length and petal width). Python Rust [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) `q = ( pl.scan_csv("docs/assets/data/iris.csv") .filter(pl.col("sepal_length") > 5) .group_by("species") .agg(pl.col("sepal_width").mean()) ) df = q.collect()` [`LazyCsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyCsvReader.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") `let q = LazyCsvReader::new(PlRefPath::new("docs/assets/data/iris.csv")) .with_has_header(true) .finish()? .filter(col("sepal_length").gt(lit(5))) .group_by(vec![col("species")]) .agg([col("sepal_width").mean()]); let df = q.collect()?; println!("{df}");` These will significantly lower the load on memory & CPU thus allowing you to fit bigger datasets in memory and process them faster. Once the query is defined you call `collect` to inform Polars that you want to execute it. You can [learn more about the lazy API in its dedicated chapter](https://docs.pola.rs/user-guide/lazy/) . Eager API In many cases the eager API is actually calling the lazy API under the hood and immediately collecting the result. This has the benefit that within the query itself optimization(s) made by the query planner can still take place. When to use which ----------------- In general, the lazy API should be preferred unless you are either interested in the intermediate results or are doing exploratory work and don't know yet what your query is going to look like. Previewing the query plan ------------------------- When using the lazy API you can use the function `explain` to ask Polars to create a description of the query plan that will be executed once you collect the results. This can be useful if you want to see what types of optimizations Polars performs on your queries. We can ask Polars to explain the query `q` we defined above: Python Rust [`explain`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.explain.html) `print(q.explain())` [`explain`](https://docs.rs/polars/latest/polars/prelude/struct.LazyFrame.html#method.explain) `let q = LazyCsvReader::new(PlRefPath::new("docs/assets/data/iris.csv")) .with_has_header(true) .finish()? .filter(col("sepal_length").gt(lit(5))) .group_by(vec![col("species")]) .agg([col("sepal_width").mean()]); println!("{}", q.explain(true)?);` `AGGREGATE[maintain_order: false] [col("sepal_width").mean()] BY [col("species")] FROM Csv SCAN [docs/assets/data/iris.csv] PROJECT 3/5 COLUMNS SELECTION: [(col("sepal_length")) > (5.0)] ESTIMATED ROWS: 167` Immediately, we can see in the explanation that Polars did apply predicate pushdown, as it is only reading rows where the sepal length is greater than 5, and it did apply projection pushdown, as it is only reading the columns that are needed by the query. The function `explain` can also be used to see how expression expansion will unfold in the context of a given schema. Consider the example expression from the [section on expression expansion](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/#expression-expansion) : `(pl.col(pl.Float64) * 1.1).name.suffix("*1.1")` We can use `explain` to see how this expression would evaluate against an arbitrary schema: Python [`explain`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.explain.html) `schema = pl.Schema( { "int_1": pl.Int16, "int_2": pl.Int32, "float_1": pl.Float64, "float_2": pl.Float64, "float_3": pl.Float64, } ) print( pl.LazyFrame(schema=schema) .select((pl.col(pl.Float64) * 1.1).name.suffix("*1.1")) .explain() )` `SELECT [[(col("float_1")) * (1.1)].alias("float_1*1.1"), [(col("float_2")) * (1.1)].alias("float_2*1.1"), [(col("float_3")) * (1.1)].alias("float_3*1.1")] DF ["int_1", "int_2", "float_1", "float_2", ...]; PROJECT["float_1", "float_2", "float_3"] 3/5 COLUMNS` --- # Streaming - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/concepts/streaming/#streaming) Streaming ========= One additional benefit of the lazy API is that it allows queries to be executed in a streaming manner. Instead of processing all the data at once, Polars can execute the query in batches allowing you to process datasets that do not fit in memory. Besides memory pressure, the streaming engine also is more performant than Polars' in-memory engine. To tell Polars we want to execute a query in streaming mode we pass the `engine="streaming"` argument to `collect`: Python Rust [`collect`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.collect.html) `q1 = ( pl.scan_csv("docs/assets/data/iris.csv") .filter(pl.col("sepal_length") > 5) .group_by("species") .agg(pl.col("sepal_width").mean()) ) df = q1.collect(engine="streaming")` [`collect`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html#method.collect) · [Available on feature streaming](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag streaming") `let q1 = LazyCsvReader::new(PlRefPath::new("docs/assets/data/iris.csv")) .with_has_header(true) .finish()? .filter(col("sepal_length").gt(lit(5))) .group_by(vec![col("species")]) .agg([col("sepal_width").mean()]); let df = q1.clone().with_new_streaming(true).collect()?; println!("{df}");` Inspecting a streaming query ---------------------------- Polars can run many operations in a streaming manner. Some operations are inherently non-streaming, or are not implemented in a streaming manner (yet). In the latter case, Polars will fall back to the in-memory engine for those operations. A user doesn't have to know about this, but it can be interesting for debugging memory or performance issues. To inspect the physical plan of streaming query, you can plot the physical graph. The legend shows how memory intensive the operation can be. `q1 = ( pl.scan_csv("docs/assets/data/iris.csv") .filter(pl.col("sepal_length") > 5) .group_by("species") .agg( mean_width=pl.col("sepal_width").mean(), mean_width2=pl.col("sepal_width").sum() / pl.col("sepal_length").count(), ) .show_graph(plan_stage="physical", engine="streaming") )` ![](data:image/png;base64, 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) --- # Google BigQuery - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/bigquery/#google-bigquery) Google BigQuery =============== To read or write from GBQ, additional dependencies are needed: Python `$ pip install google-cloud-bigquery` Read ---- We can load a query into a `DataFrame` like this: Python [`from_arrow`](https://docs.pola.rs/api/python/stable/reference/api/polars.from_arrow.html) · [Available on feature pyarrow](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag pyarrow") · [Available on feature fsspec](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag fsspec") ``import polars as pl from google.cloud import bigquery client = bigquery.Client() # Perform a query. QUERY = ( 'SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` ' 'WHERE state = "TX" ' 'LIMIT 100') query_job = client.query(QUERY) # API request rows = query_job.result() # Waits for query to finish df = pl.from_arrow(rows.to_arrow())`` Write ----- Python `from google.cloud import bigquery client = bigquery.Client() # Write DataFrame to stream as parquet file; does not hit disk with io.BytesIO() as stream: df.write_parquet(stream) stream.seek(0) parquet_options = bigquery.ParquetOptions() parquet_options.enable_list_inference = True job = client.load_table_from_file( stream, destination='tablename', project='projectname', job_config=bigquery.LoadJobConfig( source_format=bigquery.SourceFormat.PARQUET, parquet_options=parquet_options, ), ) job.result() # Waits for the job to complete` --- # IO - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/#io) IO == Reading and writing your data is crucial for a DataFrame library. In this chapter you will learn more on how to read and write to different file formats that are supported by Polars. * [CSV](https://docs.pola.rs/user-guide/io/csv/) * [Excel](https://docs.pola.rs/user-guide/io/excel/) * [Parquet](https://docs.pola.rs/user-guide/io/parquet/) * [Json](https://docs.pola.rs/user-guide/io/json/) * [Multiple](https://docs.pola.rs/user-guide/io/multiple/) * [Hive](https://docs.pola.rs/user-guide/io/hive/) * [Database](https://docs.pola.rs/user-guide/io/database/) * [Cloud storage](https://docs.pola.rs/user-guide/io/cloud-storage/) * [Google Big Query](https://docs.pola.rs/user-guide/io/bigquery/) * [Hugging Face](https://docs.pola.rs/user-guide/io/hugging-face/) --- # Version 1 - Polars user guide [Skip to content](https://docs.pola.rs/releases/upgrade/1/#version-1) Version 1 ========= Breaking changes ---------------- ### Properly apply `strict` parameter in Series constructor The behavior of the Series constructor has been updated. Generally, it will be more strict, unless the user passes `strict=False`. Strict construction is more efficient than non-strict construction, so make sure to pass values of the same data type to the constructor for the best performance. **Example** Before: `>>> s = pl.Series([1, 2, 3.5]) shape: (3,) Series: '' [f64] [ 1.0 2.0 3.5 ] >>> s = pl.Series([1, 2, 3.5], strict=False) shape: (3,) Series: '' [i64] [ 1 2 null ] >>> s = pl.Series([1, 2, 3.5], strict=False, dtype=pl.Int8) Series: '' [i8] [ 1 2 null ]` After: ``>>> s = pl.Series([1, 2, 3.5]) Traceback (most recent call last): ... TypeError: unexpected value while building Series of type Int64; found value of type Float64: 3.5 Hint: Try setting `strict=False` to allow passing data with mixed types. >>> s = pl.Series([1, 2, 3.5], strict=False) shape: (3,) Series: '' [f64] [ 1.0 2.0 3.5 ] >>> s = pl.Series([1, 2, 3.5], strict=False, dtype=pl.Int8) Series: '' [i8] [ 1 2 3 ]`` ### Change data orientation inference logic for DataFrame construction Polars no longer inspects data types to infer the orientation of the data passed to the DataFrame constructor. Data orientation is inferred based on the data and schema dimensions. Additionally, a warning is raised whenever row orientation is inferred. Because of some confusing edge cases, users should pass `orient="row"` to make explicit that their input is row-based. **Example** Before: `>>> data = [[1, "a"], [2, "b"]] >>> pl.DataFrame(data) shape: (2, 2) ┌──────────┬──────────┐ │ column_0 ┆ column_1 │ │ --- ┆ --- │ │ i64 ┆ str │ ╞══════════╪══════════╡ │ 1 ┆ a │ │ 2 ┆ b │ └──────────┴──────────┘` After: ``>>> pl.DataFrame(data) Traceback (most recent call last): ... TypeError: unexpected value while building Series of type Int64; found value of type String: "a" Hint: Try setting `strict=False` to allow passing data with mixed types.`` Use instead: `>>> pl.DataFrame(data, orient="row") shape: (2, 2) ┌──────────┬──────────┐ │ column_0 ┆ column_1 │ │ --- ┆ --- │ │ i64 ┆ str │ ╞══════════╪══════════╡ │ 1 ┆ a │ │ 2 ┆ b │ └──────────┴──────────┘` ### Consistently convert to given time zone in Series constructor Danger This change may silently impact the results of your pipelines. If you work with time zones, please make sure to account for this change. Handling of time zone information in the Series and DataFrame constructors was inconsistent. Row-wise construction would convert to the given time zone, while column-wise construction would _replace_ the time zone. The inconsistency has been fixed by always converting to the time zone specified in the data type. **Example** Before: `>>> from datetime import datetime >>> pl.Series([datetime(2020, 1, 1)], dtype=pl.Datetime('us', 'Europe/Amsterdam')) shape: (1,) Series: '' [datetime[μs, Europe/Amsterdam]] [ 2020-01-01 00:00:00 CET ]` After: `>>> from datetime import datetime >>> pl.Series([datetime(2020, 1, 1)], dtype=pl.Datetime('us', 'Europe/Amsterdam')) shape: (1,) Series: '' [datetime[μs, Europe/Amsterdam]] [ 2020-01-01 01:00:00 CET ]` ### Update some error types to more appropriate variants We have updated a lot of error types to more accurately represent the problem. Most commonly, `ComputeError` types were changed to `InvalidOperationError` or `SchemaError`. **Example** Before: ``>>> s = pl.Series("a", [100, 200, 300]) >>> s.cast(pl.UInt8) Traceback (most recent call last): ... polars.exceptions.ComputeError: conversion from `i64` to `u8` failed in column 'a' for 1 out of 3 values: [300]`` After: ``>>> s.cast(pl.UInt8) Traceback (most recent call last): ... polars.exceptions.InvalidOperationError: conversion from `i64` to `u8` failed in column 'a' for 1 out of 3 values: [300]`` ### Update `read/scan_parquet` to disable Hive partitioning by default for file inputs Parquet reading functions now also support directory inputs. Hive partitioning is enabled by default for directories, but is now _disabled_ by default for file inputs. File inputs include single files, globs, and lists of files. Explicitly pass `hive_partitioning=True` to restore previous behavior. **Example** Before: `>>> pl.read_parquet("dataset/a=1/foo.parquet") shape: (2, 2) ┌─────┬─────┐ │ a ┆ x │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪═════╡ │ 1 ┆ 1.0 │ │ 1 ┆ 2.0 │ └─────┴─────┘` After: `>>> pl.read_parquet("dataset/a=1/foo.parquet") shape: (2, 1) ┌─────┐ │ x │ │ --- │ │ f64 │ ╞═════╡ │ 1.0 │ │ 2.0 │ └─────┘ >>> pl.read_parquet("dataset/a=1/foo.parquet", hive_partitioning=True) shape: (2, 2) ┌─────┬─────┐ │ a ┆ x │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪═════╡ │ 1 ┆ 1.0 │ │ 1 ┆ 2.0 │ └─────┴─────┘` ### Update `reshape` to return Array types instead of List types `reshape` now returns an Array type instead of a List type. Users can restore the old functionality by calling `.arr.to_list()` on the output. Note that this is not more expensive than it would be to create a List type directly, because reshaping into an array is basically free. **Example** Before: `>>> s = pl.Series([1, 2, 3, 4, 5, 6]) >>> s.reshape((2, 3)) shape: (2,) Series: '' [list[i64]] [ [1, 2, 3] [4, 5, 6] ]` After: `>>> s.reshape((2, 3)) shape: (2,) Series: '' [array[i64, 3]] [ [1, 2, 3] [4, 5, 6] ]` ### Read 2D NumPy arrays as `Array` type instead of `List` The Series constructor now parses 2D NumPy arrays as an `Array` type rather than a `List` type. **Example** Before: `>>> import numpy as np >>> arr = np.array([[1, 2], [3, 4]]) >>> pl.Series(arr) shape: (2,) Series: '' [list[i64]] [ [1, 2] [3, 4] ]` After: `>>> import numpy as np >>> arr = np.array([[1, 2], [3, 4]]) >>> pl.Series(arr) shape: (2,) Series: '' [array[i64, 2]] [ [1, 2] [3, 4] ]` ### Split `replace` functionality into two separate methods The API for `replace` has proven to be confusing to many users, particularly with regards to the `default` argument and the resulting data type. It has been split up into two methods: `replace` and `replace_strict`. `replace` now always keeps the existing data type _(breaking, see example below)_ and is meant for replacing some values in your existing column. Its parameters `default` and `return_dtype` have been deprecated. The new method `replace_strict` is meant for creating a new column, mapping some or all of the values of the original column, and optionally specifying a default value. If no default is provided, it raises an error if any non-null values are not mapped. **Example** Before: `>>> s = pl.Series([1, 2, 3]) >>> s.replace(1, "a") shape: (3,) Series: '' [str] [ "a" "2" "3" ]` After: ``>>> s.replace(1, "a") Traceback (most recent call last): ... polars.exceptions.InvalidOperationError: conversion from `str` to `i64` failed in column 'literal' for 1 out of 1 values: ["a"] >>> s.replace_strict(1, "a", default=s) shape: (3,) Series: '' [str] [ "a" "2" "3" ]`` ### Preserve nulls in `ewm_mean`, `ewm_std`, and `ewm_var` Polars will no longer forward-fill null values in `ewm` methods. The user can call `.forward_fill()` on the output to achieve the same result. **Example** Before: `>>> s = pl.Series([1, 4, None, 3]) >>> s.ewm_mean(alpha=.9, ignore_nulls=False) shape: (4,) Series: '' [f64] [ 1.0 3.727273 3.727273 3.007913 ]` After: `>>> s.ewm_mean(alpha=.9, ignore_nulls=False) shape: (4,) Series: '' [f64] [ 1.0 3.727273 null 3.007913 ]` ### Update `clip` to no longer propagate nulls in the given bounds Null values in the bounds no longer set the value to null - instead, the original value is retained. **Before** `>>> df = pl.DataFrame({"a": [0, 1, 2], "min": [1, None, 1]}) >>> df.select(pl.col("a").clip("min")) shape: (3, 1) ┌──────┐ │ a │ │ --- │ │ i64 │ ╞══════╡ │ 1 │ │ null │ │ 2 │ └──────┘` **After** `>>> df.select(pl.col("a").clip("min")) shape: (3, 1) ┌──────┐ │ a │ │ --- │ │ i64 │ ╞══════╡ │ 1 │ │ 1 │ │ 2 │ └──────┘` ### Change `str.to_datetime` to default to microsecond precision for format specifiers `"%f"` and `"%.f"` In `.str.to_datetime`, when specifying `%.f` as the format, the default was to set the resulting datatype to nanosecond precision. This has been changed to microsecond precision. #### Example **Before** `>>> s = pl.Series(["2022-08-31 00:00:00.123456789"]) >>> s.str.to_datetime(format="%Y-%m-%d %H:%M:%S%.f") shape: (1,) Series: '' [datetime[ns]] [ 2022-08-31 00:00:00.123456789 ]` **After** `>>> s.str.to_datetime(format="%Y-%m-%d %H:%M:%S%.f") shape: (1,) Series: '' [datetime[us]] [ 2022-08-31 00:00:00.123456 ]` ### Update resulting column names in `pivot` when pivoting by multiple values In `DataFrame.pivot`, when specifying multiple `values` columns, the result would redundantly include the `column` column in the column names. This has been addressed. **Example** Before: `>>> df = pl.DataFrame( ... { ... "name": ["Cady", "Cady", "Karen", "Karen"], ... "subject": ["maths", "physics", "maths", "physics"], ... "test_1": [98, 99, 61, 58], ... "test_2": [100, 100, 60, 60], ... } ... ) >>> df.pivot(index='name', columns='subject', values=['test_1', 'test_2']) shape: (2, 5) ┌───────┬──────────────────────┬────────────────────────┬──────────────────────┬────────────────────────┐ │ name ┆ test_1_subject_maths ┆ test_1_subject_physics ┆ test_2_subject_maths ┆ test_2_subject_physics │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═══════╪══════════════════════╪════════════════════════╪══════════════════════╪════════════════════════╡ │ Cady ┆ 98 ┆ 99 ┆ 100 ┆ 100 │ │ Karen ┆ 61 ┆ 58 ┆ 60 ┆ 60 │ └───────┴──────────────────────┴────────────────────────┴──────────────────────┴────────────────────────┘` After: `>>> df = pl.DataFrame( ... { ... "name": ["Cady", "Cady", "Karen", "Karen"], ... "subject": ["maths", "physics", "maths", "physics"], ... "test_1": [98, 99, 61, 58], ... "test_2": [100, 100, 60, 60], ... } ... ) >>> df.pivot('subject', index='name') ┌───────┬──────────────┬────────────────┬──────────────┬────────────────┐ │ name ┆ test_1_maths ┆ test_1_physics ┆ test_2_maths ┆ test_2_physics │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═══════╪══════════════╪════════════════╪══════════════╪════════════════╡ │ Cady ┆ 98 ┆ 99 ┆ 100 ┆ 100 │ │ Karen ┆ 61 ┆ 58 ┆ 60 ┆ 60 │ └───────┴──────────────┴────────────────┴──────────────┴────────────────┘` Note that the function signature has also changed: * `columns` has been renamed to `on`, and is now the first positional argument. * `index` and `values` are both optional. If `index` is not specified, then it will use all columns not specified in `on` and `values`. If `values` is not specified, it will use all columns not specified in `on` and `index`. ### Support Decimal types by default when converting from Arrow Update conversion from Arrow to always convert Decimals into Polars Decimals, rather than cast to Float64. `Config.activate_decimals` has been removed. **Example** Before: `>>> from decimal import Decimal as D >>> import pyarrow as pa >>> arr = pa.array([D("1.01"), D("2.25")]) >>> pl.from_arrow(arr) shape: (2,) Series: '' [f64] [ 1.01 2.25 ]` After: `>>> pl.from_arrow(arr) shape: (2,) Series: '' [decimal[3,2]] [ 1.01 2.25 ]` ### Remove serde functionality from `pl.read_json` and `DataFrame.write_json` `pl.read_json` no longer supports reading JSON files produced by `DataFrame.serialize`. Users should use `pl.DataFrame.deserialize` instead. `DataFrame.write_json` now only writes row-oriented JSON. The parameters `row_oriented` and `pretty` have been removed. Users should use `DataFrame.serialize` to serialize a DataFrame. **Example - `write_json`** Before: `>>> df = pl.DataFrame({"a": [1, 2], "b": [3.0, 4.0]}) >>> df.write_json() '{"columns":[{"name":"a","datatype":"Int64","bit_settings":"","values":[1,2]},{"name":"b","datatype":"Float64","bit_settings":"","values":[3.0,4.0]}]}'` After: ``>>> df.write_json() # Same behavior as previously `df.write_json(row_oriented=True)` '[{"a":1,"b":3.0},{"a":2,"b":4.0}]'`` **Example - `read_json`** Before: `>>> import io >>> df_ser = '{"columns":[{"name":"a","datatype":"Int64","bit_settings":"","values":[1,2]},{"name":"b","datatype":"Float64","bit_settings":"","values":[3.0,4.0]}]}' >>> pl.read_json(io.StringIO(df_ser)) shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪═════╡ │ 1 ┆ 3.0 │ │ 2 ┆ 4.0 │ └─────┴─────┘` After: `>>> pl.read_json(io.StringIO(df_ser)) # Format no longer supported: data is treated as a single row shape: (1, 1) ┌─────────────────────────────────┐ │ columns │ │ --- │ │ list[struct[4]] │ ╞═════════════════════════════════╡ │ [{"a","Int64","",[1.0, 2.0]}, … │ └─────────────────────────────────┘`\ \ Use instead:\ \ `>>> pl.DataFrame.deserialize(io.StringIO(df_ser)) shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪═════╡ │ 1 ┆ 3.0 │ │ 2 ┆ 4.0 │ └─────┴─────┘`\ \ ### `Series.equals` no longer checks names by default\ \ Previously, `Series.equals` would return `False` if the Series names didn't match. The method now no longer checks the names by default. The previous behavior can be retained by setting `check_names=True`.\ \ **Example**\ \ Before:\ \ `>>> s1 = pl.Series("foo", [1, 2, 3]) >>> s2 = pl.Series("bar", [1, 2, 3]) >>> s1.equals(s2) False`\ \ After:\ \ `>>> s1.equals(s2) True >>> s1.equals(s2, check_names=True) False`\ \ ### Remove `columns` parameter from `nth` expression function\ \ The `columns` parameter was removed in favor of treating positional inputs as additional indices. Use `Expr.get` instead to get the same functionality.\ \ **Example**\ \ Before:\ \ `>>> df = pl.DataFrame({"a": [1, 2], "b": [3, 4], "c": [5, 6]}) >>> df.select(pl.nth(1, "a")) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 2 │ └─────┘`\ \ After:\ \ `>>> df.select(pl.nth(1, "a")) ... TypeError: argument 'indices': 'str' object cannot be interpreted as an integer`\ \ Use instead:\ \ `>>> df.select(pl.col("a").get(1)) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 2 │ └─────┘`\ \ ### Rename struct fields of `rle` output\ \ The struct fields of the `rle` method have been renamed from `lengths/values` to `len/value`. The data type of the `len` field has also been updated to match the index type (was previously `Int32`, now `UInt32`).\ \ **Before**\ \ `>>> s = pl.Series(["a", "a", "b", "c", "c", "c"]) >>> s.rle().struct.unnest() shape: (3, 2) ┌─────────┬────────┐ │ lengths ┆ values │ │ --- ┆ --- │ │ i32 ┆ str │ ╞═════════╪════════╡ │ 2 ┆ a │ │ 1 ┆ b │ │ 3 ┆ c │ └─────────┴────────┘`\ \ **After**\ \ `>>> s.rle().struct.unnest() shape: (3, 2) ┌─────┬───────┐ │ len ┆ value │ │ --- ┆ --- │ │ u32 ┆ str │ ╞═════╪═══════╡ │ 2 ┆ a │ │ 1 ┆ b │ │ 3 ┆ c │ └─────┴───────┘`\ \ ### Update `set_sorted` to only accept a single column\ \ Calling `set_sorted` indicates that a column is sorted _individually_. Passing multiple columns indicates that each of those columns are also sorted individually. However, many users assumed this meant that the columns were sorted as a group, which led to incorrect results.\ \ To help users avoid this pitfall, we removed the possibility to specify multiple columns in `set_sorted`. To set multiple columns as sorted, simply call `set_sorted` multiple times.\ \ **Example**\ \ Before:\ \ `>>> df = pl.DataFrame({"a": [1, 2, 3], "b": [4.0, 5.0, 6.0], "c": [9, 7, 8]}) >>> df.set_sorted("a", "b")`\ \ After:\ \ `>>> df.set_sorted("a", "b") Traceback (most recent call last): ... TypeError: DataFrame.set_sorted() takes 2 positional arguments but 3 were given`\ \ Use instead:\ \ `>>> df.set_sorted("a").set_sorted("b")`\ \ ### Default to raising on out-of-bounds indices in all `get`/`gather` operations\ \ The default behavior was inconsistent between `get` and `gather` operations in various places. Now all such operations will raise by default. Pass `null_on_oob=True` to restore previous behavior.\ \ **Example**\ \ Before:\ \ `>>> s = pl.Series([[0, 1, 2], [0]]) >>> s.list.get(1) shape: (2,) Series: '' [i64] [ 1 null ]`\ \ After:\ \ `>>> s.list.get(1) Traceback (most recent call last): ... polars.exceptions.ComputeError: get index is out of bounds`\ \ Use instead:\ \ `>>> s.list.get(1, null_on_oob=True) shape: (2,) Series: '' [i64] [ 1 null ]`\ \ ### Change default engine for `read_excel` to `"calamine"`\ \ The `calamine` engine (available through the `fastexcel` package) has been added to Polars relatively recently. It's much faster than the other engines, and was already the default for `xlsb` and `xls` files. We now made it the default for all Excel files.\ \ There may be subtle differences between this engine and the previous default (`xlsx2csv`). One clear difference is that the `calamine` engine does not support the `engine_options` parameter. If you cannot get your desired behavior with the `calamine` engine, specify `engine="xlsx2csv"` to restore previous behavior.\ \ ### Example\ \ Before:\ \ `>>> pl.read_excel("data.xlsx", engine_options={"skip_empty_lines": True})`\ \ After:\ \ `>>> pl.read_excel("data.xlsx", engine_options={"skip_empty_lines": True}) Traceback (most recent call last): ... TypeError: read_excel() got an unexpected keyword argument 'skip_empty_lines'`\ \ Instead, explicitly specify the `xlsx2csv` engine or omit the `engine_options`:\ \ `>>> pl.read_excel("data.xlsx", engine="xlsx2csv", engine_options={"skip_empty_lines": True})`\ \ ### Remove class variables from some DataTypes\ \ Some DataType classes had class variables. The `Datetime` class, for example, had `time_unit` and `time_zone` as class variables. This was unintended: these should have been instance variables. This has now been corrected.\ \ **Example**\ \ Before:\ \ `>>> dtype = pl.Datetime >>> dtype.time_unit is None True`\ \ After:\ \ `>>> dtype.time_unit is None Traceback (most recent call last): ... AttributeError: type object 'Datetime' has no attribute 'time_unit'`\ \ Use instead:\ \ `>>> getattr(dtype, "time_unit", None) is None True`\ \ ### Change default `offset` in `group_by_dynamic` from 'negative `every`' to 'zero'\ \ This affects the start of the first window in `group_by_dynamic`. The new behavior should align more with user expectations.\ \ **Example**\ \ Before:\ \ `>>> from datetime import date >>> df = pl.DataFrame({ ... "ts": [date(2020, 1, 1), date(2020, 1, 2), date(2020, 1, 3)], ... "value": [1, 2, 3], ... }) >>> df.group_by_dynamic("ts", every="1d", period="2d").agg("value") shape: (4, 2) ┌────────────┬───────────┐ │ ts ┆ value │ │ --- ┆ --- │ │ date ┆ list[i64] │ ╞════════════╪═══════════╡ │ 2019-12-31 ┆ [1] │ │ 2020-01-01 ┆ [1, 2] │ │ 2020-01-02 ┆ [2, 3] │ │ 2020-01-03 ┆ [3] │ └────────────┴───────────┘`\ \ After:\ \ `>>> df.group_by_dynamic("ts", every="1d", period="2d").agg("value") shape: (3, 2) ┌────────────┬───────────┐ │ ts ┆ value │ │ --- ┆ --- │ │ date ┆ list[i64] │ ╞════════════╪═══════════╡ │ 2020-01-01 ┆ [1, 2] │ │ 2020-01-02 ┆ [2, 3] │ │ 2020-01-03 ┆ [3] │ └────────────┴───────────┘`\ \ ### Change default serialization format of `LazyFrame/DataFrame/Expr`\ \ The only serialization format available for the `serialize/deserialize` methods on Polars objects was JSON. We added a more optimized binary format and made this the default. JSON serialization is still available by passing `format="json"`.\ \ **Example**\ \ Before:\ \ `>>> lf = pl.LazyFrame({"a": [1, 2, 3]}).sum() >>> serialized = lf.serialize() >>> serialized '{"MapFunction":{"input":{"DataFrameScan":{"df":{"columns":[{"name":...' >>> from io import StringIO >>> pl.LazyFrame.deserialize(StringIO(serialized)).collect() shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 6 │ └─────┘`\ \ After:\ \ `>>> lf = pl.LazyFrame({"a": [1, 2, 3]}).sum() >>> serialized = lf.serialize() >>> serialized b'\xa1kMapFunction\xa2einput\xa1mDataFrameScan\xa4bdf...' >>> from io import BytesIO # Note: using BytesIO instead of StringIO >>> pl.LazyFrame.deserialize(BytesIO(serialized)).collect() shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 6 │ └─────┘`\ \ ### Constrain access to globals from `DataFrame.sql` in favor of `pl.sql`\ \ The `sql` methods on `DataFrame` and `LazyFrame` can no longer access global variables. These methods should be used for operating on the frame itself. For global access, there is now the top-level `sql` function.\ \ **Example**\ \ Before:\ \ `>>> df1 = pl.DataFrame({"id1": [1, 2]}) >>> df2 = pl.DataFrame({"id2": [3, 4]}) >>> df1.sql("SELECT * FROM df1 CROSS JOIN df2") shape: (4, 2) ┌─────┬─────┐ │ id1 ┆ id2 │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 3 │ │ 1 ┆ 4 │ │ 2 ┆ 3 │ │ 2 ┆ 4 │ └─────┴─────┘`\ \ After:\ \ `>>> df1.sql("SELECT * FROM df1 CROSS JOIN df2") Traceback (most recent call last): ... polars.exceptions.SQLInterfaceError: relation 'df1' was not found`\ \ Use instead:\ \ `>>> pl.sql("SELECT * FROM df1 CROSS JOIN df2", eager=True) shape: (4, 2) ┌─────┬─────┐ │ id1 ┆ id2 │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 3 │ │ 1 ┆ 4 │ │ 2 ┆ 3 │ │ 2 ┆ 4 │ └─────┴─────┘`\ \ ### Remove re-export of type aliases\ \ We have a lot of type aliases defined in the `polars.type_aliases` module. Some of these were re-exported at the top-level and in the `polars.datatypes` module. These re-exports have been removed.\ \ We plan on adding a public `polars.typing` module in the future with a number of curated type aliases. Until then, please define your own type aliases, or import from our `polars.type_aliases` module. Note that the `type_aliases` module is not technically public, so use at your own risk.\ \ **Example**\ \ Before:\ \ `def foo(dtype: pl.PolarsDataType) -> None: ...`\ \ After:\ \ `PolarsDataType = pl.DataType | type[pl.DataType] def foo(dtype: PolarsDataType) -> None: ...`\ \ ### Streamline optional dependency definitions in `pyproject.toml`\ \ We revisited to optional dependency definitions and made some minor changes. If you were using the extras `fastexcel`, `gevent`, `matplotlib`, or `async`, this is a breaking change. Please update your Polars installation to use the new extras.\ \ **Example**\ \ Before:\ \ `pip install 'polars[fastexcel,gevent,matplotlib]'`\ \ After:\ \ `pip install 'polars[calamine,async,graph]'`\ \ Deprecations\ ------------\ \ ### Issue `PerformanceWarning` when LazyFrame properties `schema/dtypes/columns/width` are used\ \ Recent improvements to the correctness of the schema resolving in the lazy engine have had significant performance impact on the cost of resolving the schema. It is no longer 'free' - in fact, in complex pipelines with lazy file reading, resolving the schema can be relatively expensive.\ \ Because of this, the schema-related properties on LazyFrame were no longer good API design. Properties represent information that is already available, and just needs to be retrieved. However, for the LazyFrame properties, accessing these may have significant performance cost.\ \ To solve this, we added the `LazyFrame.collect_schema` method, which retrieves the schema and returns a `Schema` object. The properties raise a `PerformanceWarning` and tell the user to use `collect_schema` instead. We chose not to deprecate the properties for now to facilitate writing code that is generic for both DataFrames and LazyFrames. --- # Folds - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/folds/#folds) Folds ===== Polars provides many expressions to perform computations across columns, like `sum_horizontal`, `mean_horizontal`, and `min_horizontal`. However, these are just special cases of a general algorithm called a fold, and Polars provides a general mechanism for you to compute custom folds for when the specialised versions of Polars are not enough. Folds computed with the function `fold` operate on the full columns for maximum speed. They utilize the data layout very efficiently and often have vectorized execution. Basic example ------------- As a first example, we will reimplement `sum_horizontal` with the function `fold`: Python Rust [`fold`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.fold.html) `import operator import polars as pl df = pl.DataFrame( { "label": ["foo", "bar", "spam"], "a": [1, 2, 3], "b": [10, 20, 30], } ) result = df.select( pl.fold( acc=pl.lit(0), function=operator.add, exprs=pl.col("a", "b"), ).alias("sum_fold"), pl.sum_horizontal(pl.col("a", "b")).alias("sum_horz"), ) print(result)` [`fold_exprs`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.fold_exprs.html) `use polars::lazy::dsl::sum_horizontal; use polars::prelude::*; let df = df!( "label" => ["foo", "bar", "spam"], "a" => [1, 2, 3], "b" => [10, 20, 30], )?; let result = df .clone() .lazy() .select([ fold_exprs( lit(0), PlanCallback::new(|(acc, val)| &acc + &val), [col("a"), col("b")], false, None, ) .alias("sum_fold"), sum_horizontal([col("a"), col("b")], true)?.alias("sum_horz"), ]) .collect()?; println!("{result:?}");` `shape: (3, 2) ┌──────────┬──────────┐ │ sum_fold ┆ sum_horz │ │ --- ┆ --- │ │ i32 ┆ i64 │ ╞══════════╪══════════╡ │ 11 ┆ 11 │ │ 22 ┆ 22 │ │ 33 ┆ 33 │ └──────────┴──────────┘` The function `fold` expects a function `f` as the parameter `function` and `f` should accept two arguments. The first argument is the accumulated result, which we initialise as zero, and the second argument takes the successive values of the expressions listed in the parameter `exprs`. In our case, they're the two columns “a” and “b”. The snippet below includes a third explicit expression that represents what the function `fold` is doing above: Python Rust [`fold`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.fold.html) `acc = pl.lit(0) f = operator.add result = df.select( f(f(acc, pl.col("a")), pl.col("b")), pl.fold(acc=acc, function=f, exprs=pl.col("a", "b")).alias("sum_fold"), ) print(result)` [`fold_exprs`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.fold_exprs.html) `let acc = lit(0); let f = |acc: Expr, val: Expr| acc + val; let result = df .clone() .lazy() .select([ f(f(acc, col("a")), col("b")), fold_exprs( lit(0), PlanCallback::new(|(acc, val)| &acc + &val), [col("a"), col("b")], false, None, ) .alias("sum_fold"), ]) .collect()?; println!("{result:?}");` `shape: (3, 2) ┌─────────┬──────────┐ │ literal ┆ sum_fold │ │ --- ┆ --- │ │ i64 ┆ i32 │ ╞═════════╪══════════╡ │ 11 ┆ 11 │ │ 22 ┆ 22 │ │ 33 ┆ 33 │ └─────────┴──────────┘` `fold` in Python Most programming languages include a higher-order function that implements the algorithm that the function `fold` in Polars implements. The Polars `fold` is very similar to Python's `functools.reduce`. You can [learn more about the power of `functools.reduce` in this article](http://mathspp.com/blog/pydonts/the-power-of-reduce) . The initial value `acc` ----------------------- The initial value chosen for the accumulator `acc` is typically, but not always, the [identity element](https://en.wikipedia.org/wiki/Identity_element) of the operation you want to apply. For example, if we wanted to multiply across the columns, we would not get the correct result if our accumulator was set to zero: Python Rust [`fold`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.fold.html) `result = df.select( pl.fold( acc=pl.lit(0), function=operator.mul, exprs=pl.col("a", "b"), ).alias("prod"), ) print(result)` [`fold_exprs`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.fold_exprs.html) `let result = df .clone() .lazy() .select([fold_exprs( lit(0), PlanCallback::new(|(acc, val)| &acc * &val), [col("a"), col("b")], false, None, ) .alias("prod")]) .collect()?; println!("{result:?}");` `shape: (3, 1) ┌──────┐ │ prod │ │ --- │ │ i32 │ ╞══════╡ │ 0 │ │ 0 │ │ 0 │ └──────┘` To fix this, the accumulator `acc` should be set to `1`: Python Rust [`fold`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.fold.html) `result = df.select( pl.fold( acc=pl.lit(1), function=operator.mul, exprs=pl.col("a", "b"), ).alias("prod"), ) print(result)` [`fold_exprs`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.fold_exprs.html) `let result = df .lazy() .select([fold_exprs( lit(1), PlanCallback::new(|(acc, val)| &acc * &val), [col("a"), col("b")], false, None, ) .alias("prod")]) .collect()?; println!("{result:?}");` `shape: (3, 1) ┌──────┐ │ prod │ │ --- │ │ i32 │ ╞══════╡ │ 10 │ │ 40 │ │ 90 │ └──────┘` Conditional ----------- In the case where you'd want to apply a condition/predicate across all columns in a dataframe, a fold can be a very concise way to express this. Python Rust [`fold`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.fold.html) `df = pl.DataFrame( { "a": [1, 2, 3], "b": [0, 1, 2], } ) result = df.filter( pl.fold( acc=pl.lit(True), function=lambda acc, x: acc & x, exprs=pl.all() > 1, ) ) print(result)` [`fold_exprs`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.fold_exprs.html) `let df = df!( "a" => [1, 2, 3], "b" => [0, 1, 2], )?; let result = df .lazy() .filter(fold_exprs( lit(true), PlanCallback::new(|(acc, val)| &acc & &val), [col("*").gt(1)], false, None, )) .collect()?; println!("{result:?}");` `shape: (1, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 3 ┆ 2 │ └─────┴─────┘` The snippet above filters all rows where all columns are greater than 1. Folds and string data --------------------- Folds could be used to concatenate string data. However, due to the materialization of intermediate columns, this operation will have squared complexity. Therefore, we recommend using the function `concat_str` for this: Python Rust [`concat_str`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.concat_str.html) `df = pl.DataFrame( { "a": ["a", "b", "c"], "b": [1, 2, 3], } ) result = df.select(pl.concat_str(["a", "b"])) print(result)` [`concat_str`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.concat_str.html) · [Available on feature concat\_str](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag concat_str") `let df = df!( "a" => ["a", "b", "c"], "b" => [1, 2, 3], )?; let result = df .lazy() .select([concat_str([col("a"), col("b")], "", false)]) .collect()?; println!("{result:?}");` `shape: (3, 1) ┌─────┐ │ a │ │ --- │ │ str │ ╞═════╡ │ a1 │ │ b2 │ │ c3 │ └─────┘` --- # Categorical data and enums - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/categorical-data-and-enums/#categorical-data-and-enums) Categorical data and enums ========================== A column that holds string values that can only take on one of a limited number of possible values is a column that holds [categorical data](https://en.wikipedia.org/wiki/Categorical_variable) . Usually, the number of possible values is much smaller than the length of the column. Some typical examples include your nationality, the operating system of your computer, or the license that your favorite open source project uses. When working with categorical data you can use Polars' dedicated types, `Categorical` and `Enum`, to make your queries more performant. Now, we will see what are the differences between the two data types `Categorical` and `Enum` and when you should use one data type or the other. We also include some notes on [why the data types `Categorical` and `Enum` are more efficient than using the plain string values](https://docs.pola.rs/user-guide/expressions/categorical-data-and-enums/#performance-considerations-on-categorical-data-types) in the end of this user guide section. `Enum` vs `Categorical` ----------------------- In short, you should prefer `Enum` over `Categorical` whenever possible. When the categories are fixed and known up front, use `Enum`. When you don't know the categories or they are not fixed then you must use `Categorical`. In case your requirements change along the way you can always cast from one to the other. Data type `Enum` ---------------- ### Creating an `Enum` The data type `Enum` is an ordered categorical data type. To use the data type `Enum` you have to specify the categories in advance to create a new data type that is a variant of an `Enum`. Then, when creating a new series, a new dataframe, or when casting a string column, you can use that `Enum` variant. Python [`Enum`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Enum.html) `import polars as pl bears_enum = pl.Enum(["Polar", "Panda", "Brown"]) bears = pl.Series(["Polar", "Panda", "Brown", "Brown", "Polar"], dtype=bears_enum) print(bears)` `shape: (5,) Series: '' [enum] [ "Polar" "Panda" "Brown" "Brown" "Polar" ]` ### Invalid values Polars will raise an error if you try to specify a data type `Enum` whose categories do not include all the values present: Python [`Enum`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Enum.html) `from polars.exceptions import InvalidOperationError try: bears_kind_of = pl.Series( ["Polar", "Panda", "Brown", "Polar", "Shark"], dtype=bears_enum, ) except InvalidOperationError as exc: print("InvalidOperationError:", exc)` ``InvalidOperationError: conversion from `str` to `enum` failed in column '' for 1 out of 5 values: ["Shark"] Ensure that all values in the input column are present in the categories of the enum datatype.`` If you are in a position where you cannot know all of the possible values in advance and erroring on unknown values is semantically wrong, you may need to [use the data type `Categorical`](https://docs.pola.rs/user-guide/expressions/categorical-data-and-enums/#data-type-categorical) . ### Category ordering and comparison The data type `Enum` is ordered and the order is induced by the order in which you specify the categories. The example below uses log levels as an example of where an ordered `Enum` is useful: Python [`Enum`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Enum.html) `log_levels = pl.Enum(["debug", "info", "warning", "error"]) logs = pl.DataFrame( { "level": ["debug", "info", "debug", "error"], "message": [ "process id: 525", "Service started correctly", "startup time: 67ms", "Cannot connect to DB!", ], }, schema_overrides={ "level": log_levels, }, ) non_debug_logs = logs.filter( pl.col("level") > "debug", ) print(non_debug_logs)` `shape: (2, 2) ┌───────┬───────────────────────────┐ │ level ┆ message │ │ --- ┆ --- │ │ enum ┆ str │ ╞═══════╪═══════════════════════════╡ │ info ┆ Service started correctly │ │ error ┆ Cannot connect to DB! │ └───────┴───────────────────────────┘` This example shows that we can compare `Enum` values with a string, but this only works if the string matches one of the `Enum` values. If we compared the column “level” with any string other than `"debug"`, `"info"`, `"warning"`, or `"error"`, Polars would raise an exception. Columns with the data type `Enum` can also be compared with other columns that have the same data type `Enum` or columns that hold strings, but only if all the strings are valid `Enum` values. Data type `Categorical` ----------------------- The data type `Categorical` can be seen as a more flexible version of `Enum`. ### Creating a `Categorical` series To use the data type `Categorical`, you can cast a column of strings or specify `Categorical` as the data type of a series or dataframe column: Python [`Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html) `bears_cat = pl.Series( ["Polar", "Panda", "Brown", "Brown", "Polar"], dtype=pl.Categorical ) print(bears_cat)` `shape: (5,) Series: '' [cat] [ "Polar" "Panda" "Brown" "Brown" "Polar" ]` Having Polars infer the categories for you may sound strictly better than listing the categories beforehand, but this inference comes with a performance cost. That is why, whenever possible, you should use `Enum`. You can learn more by [reading the subsection about the data type `Categorical` and its encodings](https://docs.pola.rs/user-guide/expressions/categorical-data-and-enums/#data-type-categorical-and-encodings) . ### Lexical comparison with strings When comparing a `Categorical` column with a string, Polars will perform a lexical comparison: Python [`Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html) `print(bears_cat < "Cat")` `shape: (5,) Series: '' [bool] [ false false true true false ]` You can also compare a column of strings with your `Categorical` column, and the comparison will also be lexical: Python [`Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html) `bears_str = pl.Series( ["Panda", "Brown", "Brown", "Polar", "Polar"], ) print(bears_cat == bears_str)` `shape: (5,) Series: '' [bool] [ false false true false true ]` Although it is possible to compare a string column with a categorical column, it is typically more efficient to compare two categorical columns. We will see how to do that next. ### Comparing `Categorical` columns and the string cache You are told that comparing columns with the data type `Categorical` is more efficient than if one of them is a string column. So, you change your code so that the second column is also a categorical column and then you perform your comparison... But Polars raises an exception: Python [`Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html) `from polars.exceptions import StringCacheMismatchError bears_cat2 = pl.Series( ["Panda", "Brown", "Brown", "Polar", "Polar"], dtype=pl.Categorical, ) try: print(bears_cat == bears_cat2) except StringCacheMismatchError as exc: exc_str = str(exc).splitlines()[0] print("StringCacheMismatchError:", exc_str)` `shape: (5,) Series: '' [bool] [ false false true false true ]` By default, the values in columns with the data type `Categorical` are [encoded in the order they are seen in the column](https://docs.pola.rs/user-guide/expressions/categorical-data-and-enums/#encodings) , and independently from other columns, which means that Polars cannot compare efficiently two categorical columns that were created independently. Enabling the Polars string cache and creating the columns with the cache enabled fixes this issue: Python [`StringCache`](https://docs.pola.rs/api/python/stable/reference/api/polars.StringCache.html) · [`Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html) `with pl.StringCache(): bears_cat = pl.Series( ["Polar", "Panda", "Brown", "Brown", "Polar"], dtype=pl.Categorical ) bears_cat2 = pl.Series( ["Panda", "Brown", "Brown", "Polar", "Polar"], dtype=pl.Categorical ) print(bears_cat == bears_cat2)` `shape: (5,) Series: '' [bool] [ false false true false true ]` Note that using [the string cache comes at a performance cost](https://docs.pola.rs/user-guide/expressions/categorical-data-and-enums/#using-the-global-string-cache) . ### Combining `Categorical` columns The string cache is also useful in any operation that combines or mixes two columns with the data type `Categorical` in any way. An example of this is when [concatenating two dataframes vertically](https://docs.pola.rs/user-guide/getting-started/#concatenating-dataframes) : Python [`StringCache`](https://docs.pola.rs/api/python/stable/reference/api/polars.StringCache.html) · [`Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html) `import warnings from polars.exceptions import CategoricalRemappingWarning male_bears = pl.DataFrame( { "species": ["Polar", "Brown", "Panda"], "weight": [450, 500, 110], # kg }, schema_overrides={"species": pl.Categorical}, ) female_bears = pl.DataFrame( { "species": ["Brown", "Polar", "Panda"], "weight": [340, 200, 90], # kg }, schema_overrides={"species": pl.Categorical}, ) with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=CategoricalRemappingWarning) bears = pl.concat([male_bears, female_bears], how="vertical") print(bears)` `shape: (6, 2) ┌─────────┬────────┐ │ species ┆ weight │ │ --- ┆ --- │ │ cat ┆ i64 │ ╞═════════╪════════╡ │ Polar ┆ 450 │ │ Brown ┆ 500 │ │ Panda ┆ 110 │ │ Brown ┆ 340 │ │ Polar ┆ 200 │ │ Panda ┆ 90 │ └─────────┴────────┘` In this case, Polars issues a warning complaining about an expensive reenconding that implies taking a performance hit. Polars then suggests using the data type `Enum` if possible, or using the string cache. To understand the issue with this operation and why Polars raises an error, please read the final section about [the performance considerations of using categorical data types](https://docs.pola.rs/user-guide/expressions/categorical-data-and-enums/#performance-considerations-on-categorical-data-types) . ### Comparison between `Categorical` columns is lexical Since Polars 1.32.0, when comparing two columns with data type `Categorical`, Polars always performs lexical (alphabetical) comparison between the values. The `ordering` parameter has been deprecated and is now ignored. Prior to Polars version 1.32.0, when comparing two columns with data type `Categorical`, Polars does not perform lexical comparison between the values by default. If you want lexical ordering, you need to specify so when creating the column: Python [`StringCache`](https://docs.pola.rs/api/python/stable/reference/api/polars.StringCache.html) · [`Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html) `import warnings with pl.StringCache(): with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=DeprecationWarning) bears_cat = pl.Series( ["Polar", "Panda", "Brown", "Brown", "Polar"], dtype=pl.Categorical(ordering="lexical"), ) bears_cat2 = pl.Series( ["Panda", "Brown", "Brown", "Polar", "Polar"], dtype=pl.Categorical ) print(bears_cat > bears_cat2)` \`\`\`python result="text" session="expressions/categoricals" import warnings with pl.StringCache(): with warnings.catch\_warnings(): warnings.filterwarnings("ignore", category=DeprecationWarning) bears_cat = pl.Series( ["Polar", "Panda", "Brown", "Brown", "Polar"], dtype=pl.Categorical(ordering="lexical"), ) bears_cat2 = pl.Series( ["Panda", "Brown", "Brown", "Polar", "Polar"], dtype=pl.Categorical ) print(bears\_cat > bears\_cat2) ``Otherwise, the order is inferred together with the values: === ":fontawesome-brands-python: Python" [:material-api: `StringCache`](https://docs.pola.rs/api/python/stable/reference/api/polars.StringCache.html) ·[:material-api: `Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html) ```python with pl.StringCache(): bears_cat = pl.Series( # Polar < Panda < Brown ["Polar", "Panda", "Brown", "Brown", "Polar"], dtype=pl.Categorical, ) bears_cat2 = pl.Series( ["Panda", "Brown", "Brown", "Polar", "Polar"], dtype=pl.Categorical ) print(bears_cat > bears_cat2) ``` ```python with pl.StringCache(): bears_cat = pl.Series( # Polar < Panda < Brown ["Polar", "Panda", "Brown", "Brown", "Polar"], dtype=pl.Categorical, ) bears_cat2 = pl.Series( ["Panda", "Brown", "Brown", "Polar", "Polar"], dtype=pl.Categorical ) print(bears_cat > bears_cat2)`` `shape: (5,) Series: '' [bool] [ false false false true false ]` Performance considerations on categorical data types ---------------------------------------------------- This part of the user guide explains * why categorical data types are more performant than the string literals; and * why Polars needs a string cache when doing some operations with the data type `Categorical`. ### Encodings Categorical data represents string data where the values in the column have a finite set of values (usually way smaller than the length of the column). Storing these values as plain strings is a waste of memory and performance as we will be repeating the same string over and over again. Additionally, in operations like joins we have to perform expensive string comparisons. Categorical data types like `Enum` and `Categorical` let you encode the string values in a cheaper way, establishing a relationship between a cheap encoding value and the original string literal. As an example of a sensible encoding, Polars could choose to represent the finite set of categories as positive integers. With that in mind, the diagram below shows a regular string column and a possible representation of a Polars column with the categorical data type: String ColumnCategorical Column | Series | | --- | | Polar | | Panda | | Brown | | Panda | | Brown | | Brown | | Polar | | Physical | | --- | | 0 | | 1 | | 2 | | 1 | | 2 | | 2 | | 0 | | Categories | | --- | | Polar | | Panda | | Brown | The physical `0` in this case encodes (or maps) to the value 'Polar', the value `1` encodes to 'Panda', and the value `2` to 'Brown'. This encoding has the benefit of only storing the string values once. Additionally, when we perform operations (e.g. sorting, counting) we can work directly on the physical representation which is much faster than the working with string data. ### Encodings for the data type `Enum` are global When working with the data type `Enum` we specify the categories in advance. This way, Polars can ensure different columns and even different datasets have the same encoding and there is no need for expensive re-encoding or cache lookups. ### Data type `Categorical` and encodings The fact that the categories for the data type `Categorical` are inferred come at a cost. The main cost here is that we have no control over our encodings. Consider the following scenario where we append the following two categorical series: Polars encodes the string values in the order they appear. So, the series would look like this: cat\_seriescat2\_series | Physical | | --- | | 0 | | 1 | | 2 | | 2 | | 0 | | Categories | | --- | | Polar | | Panda | | Brown | | Physical | | --- | | 0 | | 1 | | 1 | | 2 | | 2 | | Categories | | --- | | Panda | | Brown | | Polar | Combining the series becomes a non-trivial task which is expensive as the physical value of `0` represents something different in both series. Polars does support these types of operations for convenience, however these should be avoided due to its slower performance as it requires making both encodings compatible first before doing any merge operations. ### Using the global string cache One way to handle this reencoding problem is to enable the string cache. Under the string cache, the diagram would instead look like this: SeriesString cachecat\_seriescat2\_series | Physical | | --- | | 0 | | 1 | | 2 | | 2 | | 0 | | Physical | | --- | | 1 | | 2 | | 2 | | 0 | | 0 | | Categories | | --- | | Polar | | Panda | | Brown | When you enable the string cache, strings are no longer encoded in the order they appear on a per-column basis. Instead, the encoding is shared across columns. The value 'Polar' will always be encoded by the same value for all categorical columns created under the string cache. Merge operations (e.g. appends, joins) become cheap again as there is no need to make the encodings compatible first, solving the problem we had above. However, the string cache does come at a small performance hit during construction of the series as we need to look up or insert the string values in the cache. Therefore, it is preferred to use the data type `Enum` if you know your categories in advance. --- # Expressions and contexts - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/#expressions-and-contexts) Expressions and contexts ======================== Polars has developed its own Domain Specific Language (DSL) for transforming data. The language is very easy to use and allows for complex queries that remain human readable. Expressions and contexts, which will be introduced here, are very important in achieving this readability while also allowing the Polars query engine to optimize your queries to make them run as fast as possible. Expressions ----------- In Polars, an _expression_ is a lazy representation of a data transformation. Expressions are modular and flexible, which means you can use them as building blocks to build more complex expressions. Here is an example of a Polars expression: `import polars as pl pl.col("weight") / (pl.col("height") ** 2)` As you might be able to guess, this expression takes a column named “weight” and divides its values by the square of the values in a column “height”, computing a person's BMI. The code above expresses an abstract computation that we can save in a variable, manipulate further, or just print: `bmi_expr = pl.col("weight") / (pl.col("height") ** 2) print(bmi_expr)` `[(col("weight")) / (col("height").pow([dyn int: 2]))]` Because expressions are lazy, no computations have taken place yet. That's what we need contexts for. Contexts -------- Polars expressions need a _context_ in which they are executed to produce a result. Depending on the context it is used in, the same Polars expression can produce different results. In this section, we will learn about the four most common contexts that Polars provides[1](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/#fn:1) : 1. `select` 2. `with_columns` 3. `filter` 4. `group_by` We use the dataframe below to show how each of the contexts works. Python Rust `from datetime import date df = pl.DataFrame( { "name": ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"], "birthdate": [ date(1997, 1, 10), date(1985, 2, 15), date(1983, 3, 22), date(1981, 4, 30), ], "weight": [57.9, 72.5, 53.6, 83.1], # (kg) "height": [1.56, 1.77, 1.65, 1.75], # (m) } ) print(df)` `use chrono::prelude::*; use polars::prelude::*; let df: DataFrame = df!( "name" => ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"], "birthdate" => [ NaiveDate::from_ymd_opt(1997, 1, 10).unwrap(), NaiveDate::from_ymd_opt(1985, 2, 15).unwrap(), NaiveDate::from_ymd_opt(1983, 3, 22).unwrap(), NaiveDate::from_ymd_opt(1981, 4, 30).unwrap(), ], "weight" => [57.9, 72.5, 53.6, 83.1], // (kg) "height" => [1.56, 1.77, 1.65, 1.75], // (m) ) .unwrap(); println!("{df}");` `shape: (4, 4) ┌────────────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞════════════════╪════════════╪════════╪════════╡ │ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 │ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │ │ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 │ └────────────────┴────────────┴────────┴────────┘` ### `select` The selection context `select` applies expressions over columns. The context `select` may produce new columns that are aggregations, combinations of other columns, or literals: Python Rust [`select`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.select.html) `result = df.select( bmi=bmi_expr, avg_bmi=bmi_expr.mean(), ideal_max_bmi=25, ) print(result)` [`select`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.select) `let bmi = col("weight") / col("height").pow(2); let result = df .clone() .lazy() .select([ bmi.clone().alias("bmi"), bmi.clone().mean().alias("avg_bmi"), lit(25).alias("ideal_max_bmi"), ]) .collect()?; println!("{result}");` `shape: (4, 3) ┌───────────┬───────────┬───────────────┐ │ bmi ┆ avg_bmi ┆ ideal_max_bmi │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ i32 │ ╞═══════════╪═══════════╪═══════════════╡ │ 23.791913 ┆ 23.438973 ┆ 25 │ │ 23.141498 ┆ 23.438973 ┆ 25 │ │ 19.687787 ┆ 23.438973 ┆ 25 │ │ 27.134694 ┆ 23.438973 ┆ 25 │ └───────────┴───────────┴───────────────┘` The expressions in a context `select` must produce series that are all the same length or they must produce a scalar. Scalars will be broadcast to match the length of the remaining series. Literals, like the number used above, are also broadcast. Note that broadcasting can also occur within expressions. For instance, consider the expression below: Python Rust [`select`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.select.html) `result = df.select(deviation=(bmi_expr - bmi_expr.mean()) / bmi_expr.std()) print(result)` [`select`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.select) `let result = df .clone() .lazy() .select([((bmi.clone() - bmi.clone().mean()) / bmi.clone().std(1)).alias("deviation")]) .collect()?; println!("{result}");` `shape: (4, 1) ┌───────────┐ │ deviation │ │ --- │ │ f64 │ ╞═══════════╡ │ 0.115645 │ │ -0.097471 │ │ -1.22912 │ │ 1.210946 │ └───────────┘` Both the subtraction and the division use broadcasting within the expression because the subexpressions that compute the mean and the standard deviation evaluate to single values. The context `select` is very flexible and powerful and allows you to evaluate arbitrary expressions independent of, and in parallel to, each other. This is also true of the other contexts that we will see next. ### `with_columns` The context `with_columns` is very similar to the context `select`. The main difference between the two is that the context `with_columns` creates a new dataframe that contains the columns from the original dataframe and the new columns according to its input expressions, whereas the context `select` only includes the columns selected by its input expressions: Python Rust [`with_columns`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.with_columns.html) `result = df.with_columns( bmi=bmi_expr, avg_bmi=bmi_expr.mean(), ideal_max_bmi=25, ) print(result)` [`with_columns`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.with_columns) `let result = df .clone() .lazy() .with_columns([ bmi.clone().alias("bmi"), bmi.mean().alias("avg_bmi"), lit(25).alias("ideal_max_bmi"), ]) .collect()?; println!("{result}");` `shape: (4, 7) ┌────────────────┬────────────┬────────┬────────┬───────────┬───────────┬───────────────┐ │ name ┆ birthdate ┆ weight ┆ height ┆ bmi ┆ avg_bmi ┆ ideal_max_bmi │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ i32 │ ╞════════════════╪════════════╪════════╪════════╪═══════════╪═══════════╪═══════════════╡ │ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 ┆ 23.791913 ┆ 23.438973 ┆ 25 │ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 ┆ 23.141498 ┆ 23.438973 ┆ 25 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 ┆ 19.687787 ┆ 23.438973 ┆ 25 │ │ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 ┆ 27.134694 ┆ 23.438973 ┆ 25 │ └────────────────┴────────────┴────────┴────────┴───────────┴───────────┴───────────────┘` Because of this difference between `select` and `with_columns`, the expressions used in a context `with_columns` must produce series that have the same length as the original columns in the dataframe, whereas it is enough for the expressions in the context `select` to produce series that have the same length among them. ### `filter` The context `filter` filters the rows of a dataframe based on one or more expressions that evaluate to the Boolean data type. Python Rust [`filter`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.filter.html) `result = df.filter( pl.col("birthdate").is_between(date(1982, 12, 31), date(1996, 1, 1)), pl.col("height") > 1.7, ) print(result)` [`filter`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.filter) `let result = df .clone() .lazy() .filter( col("birthdate") .is_between( lit(NaiveDate::from_ymd_opt(1982, 12, 31).unwrap()), lit(NaiveDate::from_ymd_opt(1996, 1, 1).unwrap()), ClosedInterval::Both, ) .and(col("height").gt(lit(1.7))), ) .collect()?; println!("{result}");` `shape: (1, 4) ┌───────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞═══════════╪════════════╪════════╪════════╡ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ └───────────┴────────────┴────────┴────────┘` ### `group_by` and aggregations In the context `group_by`, rows are grouped according to the unique values of the grouping expressions. You can then apply expressions to the resulting groups, which may be of variable lengths. When using the context `group_by`, you can use an expression to compute the groupings dynamically: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) `result = df.group_by( (pl.col("birthdate").dt.year() // 10 * 10).alias("decade"), ).agg(pl.col("name")) print(result)` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) `let result = df .clone() .lazy() .group_by([(col("birthdate").dt().year() / lit(10) * lit(10)).alias("decade")]) .agg([col("name")]) .collect()?; println!("{result}");` `shape: (2, 2) ┌────────┬─────────────────────────────────┐ │ decade ┆ name │ │ --- ┆ --- │ │ i32 ┆ list[str] │ ╞════════╪═════════════════════════════════╡ │ 1990 ┆ ["Alice Archer"] │ │ 1980 ┆ ["Ben Brown", "Chloe Cooper", … │ └────────┴─────────────────────────────────┘`\ \ After using `group_by` we use `agg` to apply aggregating expressions to the groups. Since in the example above we only specified the name of a column, we get the groups of that column as lists.\ \ We can specify as many grouping expressions as we'd like and the context `group_by` will group the rows according to the distinct values across the expressions specified. Here, we group by a combination of decade of birth and whether the person is shorter than 1.7 metres:\ \ Python Rust\ \ [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html)\ \ `result = df.group_by( (pl.col("birthdate").dt.year() // 10 * 10).alias("decade"), (pl.col("height") < 1.7).alias("short?"), ).agg(pl.col("name")) print(result)`\ \ [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by)\ \ `let result = df .clone() .lazy() .group_by([ (col("birthdate").dt().year() / lit(10) * lit(10)).alias("decade"), (col("height").lt(lit(1.7)).alias("short?")), ]) .agg([col("name")]) .collect()?; println!("{result}");`\ \ `shape: (3, 3) ┌────────┬────────┬─────────────────────────────────┐ │ decade ┆ short? ┆ name │ │ --- ┆ --- ┆ --- │ │ i32 ┆ bool ┆ list[str] │ ╞════════╪════════╪═════════════════════════════════╡ │ 1980 ┆ true ┆ ["Chloe Cooper"] │ │ 1980 ┆ false ┆ ["Ben Brown", "Daniel Donovan"… │ │ 1990 ┆ true ┆ ["Alice Archer"] │ └────────┴────────┴─────────────────────────────────┘`\ \ The resulting dataframe, after applying aggregating expressions, contains one column per each grouping expression on the left and then as many columns as needed to represent the results of the aggregating expressions. In turn, we can specify as many aggregating expressions as we want:\ \ Python Rust\ \ [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html)\ \ `result = df.group_by( (pl.col("birthdate").dt.year() // 10 * 10).alias("decade"), (pl.col("height") < 1.7).alias("short?"), ).agg( pl.len(), pl.col("height").max().alias("tallest"), pl.col("weight", "height").mean().name.prefix("avg_"), ) print(result)`\ \ [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by)\ \ `let result = df .clone() .lazy() .group_by([ (col("birthdate").dt().year() / lit(10) * lit(10)).alias("decade"), (col("height").lt(lit(1.7)).alias("short?")), ]) .agg([ len(), col("height").max().alias("tallest"), cols(["weight", "height"]) .as_expr() .mean() .name() .prefix("avg_"), ]) .collect()?; println!("{result}");`\ \ `shape: (3, 6) ┌────────┬────────┬─────┬─────────┬────────────┬────────────┐ │ decade ┆ short? ┆ len ┆ tallest ┆ avg_weight ┆ avg_height │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i32 ┆ bool ┆ u32 ┆ f64 ┆ f64 ┆ f64 │ ╞════════╪════════╪═════╪═════════╪════════════╪════════════╡ │ 1980 ┆ true ┆ 1 ┆ 1.65 ┆ 53.6 ┆ 1.65 │ │ 1980 ┆ false ┆ 2 ┆ 1.77 ┆ 77.8 ┆ 1.76 │ │ 1990 ┆ true ┆ 1 ┆ 1.56 ┆ 57.9 ┆ 1.56 │ └────────┴────────┴─────┴─────────┴────────────┴────────────┘`\ \ See also `group_by_dynamic` and `rolling` for other grouping contexts.\ \ Expression expansion\ --------------------\ \ The last example contained two grouping expressions and three aggregating expressions, and yet the resulting dataframe contained six columns instead of five. If we look closely, the last aggregating expression mentioned two different columns: “weight” and “height”.\ \ Polars expressions support a feature called _expression expansion_. Expression expansion is like a shorthand notation for when you want to apply the same transformation to multiple columns. As we have seen, the expression\ \ `pl.col("weight", "height").mean().name.prefix("avg_")`\ \ will compute the mean value of the columns “weight” and “height” and will rename them as “avg\_weight” and “avg\_height”, respectively. In fact, the expression above is equivalent to using the two following expressions:\ \ `[ pl.col("weight").mean().alias("avg_weight"), pl.col("height").mean().alias("avg_height"), ]`\ \ In this case, this expression expands into two independent expressions that Polars can execute in parallel. In other cases, we may not be able to know in advance how many independent expressions an expression will unfold into.\ \ Consider this simple but elucidative example:\ \ `(pl.col(pl.Float64) * 1.1).name.suffix("*1.1")`\ \ This expression will multiply all columns with data type `Float64` by `1.1`. The number of columns this applies to depends on the schema of each dataframe. In the case of the dataframe we have been using, it applies to two columns:\ \ Python Rust\ \ [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html)\ \ `expr = (pl.col(pl.Float64) * 1.1).name.suffix("*1.1") result = df.select(expr) print(result)`\ \ [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by)\ \ `let expr = (dtype_col(&DataType::Float64).as_selector().as_expr() * lit(1.1)) .name() .suffix("*1.1"); let result = df.lazy().select([expr.clone()]).collect()?; println!("{result}");`\ \ `shape: (4, 2) ┌────────────┬────────────┐ │ weight*1.1 ┆ height*1.1 │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞════════════╪════════════╡ │ 63.69 ┆ 1.716 │ │ 79.75 ┆ 1.947 │ │ 58.96 ┆ 1.815 │ │ 91.41 ┆ 1.925 │ └────────────┴────────────┘`\ \ In the case of the dataframe `df2` below, the same expression expands to 0 columns because no column has the data type `Float64`:\ \ Python Rust\ \ [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html)\ \ `df2 = pl.DataFrame( { "ints": [1, 2, 3, 4], "letters": ["A", "B", "C", "D"], } ) result = df2.select(expr) print(result)`\ \ [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by)\ \ `let df2: DataFrame = df!( "ints" => [1, 2, 3, 4], "letters" => ["A", "B", "C", "D"], ) .unwrap(); let result = df2.lazy().select([expr]).collect()?; println!("{result}");`\ \ `shape: (0, 0) ┌┐ ╞╡ └┘`\ \ It is equally easy to imagine a scenario where the same expression would expand to dozens of columns.\ \ Next, you will learn about [the lazy API and the function `explain`](https://docs.pola.rs/user-guide/concepts/lazy-api/#previewing-the-query-plan)\ , which you can use to preview what an expression will expand to given a schema.\ \ Conclusion\ ----------\ \ Because expressions are lazy, when you use an expression inside a context Polars can try to simplify your expression before running the data transformation it expresses. Separate expressions within a context are embarrassingly parallel and Polars will take advantage of that, while also parallelizing expression execution when using expression expansion. Further performance gains can be obtained when using [the lazy API of Polars](https://docs.pola.rs/user-guide/concepts/lazy-api/)\ , which is introduced next.\ \ We have only scratched the surface of the capabilities of expressions. There are a ton more expressions and they can be combined in a variety of ways. See the [section on expressions](https://docs.pola.rs/user-guide/expressions/)\ for a deeper dive on the different types of expressions available.\ \ * * *\ \ 1. There are additional List and SQL contexts which are covered later in this guide. But for simplicity, we leave them out of scope for now. [↩](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/#fnref:1 "Jump back to footnote 1 in the text") --- # Excel - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/excel/#excel) Excel ===== Polars can read and write to Excel files from Python. From a performance perspective, we recommend using other formats if possible, such as Parquet or CSV files. Read ---- Polars does not have a native Excel reader. Instead, it uses an external library called an "engine" to parse Excel files into a form that Polars can parse. The available engines are: * fastexcel: This engine is based on the Rust [calamine](https://github.com/tafia/calamine) crate and is (by far) the fastest reader. * xlsx2csv: This reader parses the .xlsx file to an in-memory CSV that Polars then reads with its own CSV reader. * openpyxl: Typically slower than xls2csv, but can provide more flexibility for files that are difficult to parse. We recommend working with the default fastexcel engine. The xlsx2csv and openpyxl engines are slower but may have more features for parsing tricky data. These engines may be helpful if the fastexcel reader does not work for a specific Excel file. To use one of these engines, the appropriate Python package must be installed as an additional dependency. Python `$ pip install fastexcel xlsx2csv openpyxl` The default engine for reading .xlsx files is fastexcel. This engine uses the Rust calamine crate to read .xlsx files into an Apache Arrow in-memory representation that Polars can read without needing to copy the data. Python [`read_excel`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_excel.html) `df = pl.read_excel("docs/assets/data/path.xlsx")` We can specify the sheet name to read with the `sheet_name` argument. If we do not specify a sheet name, the first sheet will be read. Python [`read_excel`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_excel.html) `df = pl.read_excel("docs/assets/data/path.xlsx", sheet_name="Sales")` Write ----- We need the xlswriter library installed as an additional dependency to write to Excel files. Python `$ pip install xlsxwriter` Writing to Excel files is not currently available in Rust Polars, though it is possible to [use this crate](https://docs.rs/crate/xlsxwriter/latest) to write to Excel files from Rust. Writing a `DataFrame` to an Excel file is done with the `write_excel` method: Python [`write_excel`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_excel.html) `df = pl.DataFrame({"foo": [1, 2, 3], "bar": [None, "bak", "baz"]}) df.write_excel("docs/assets/data/path.xlsx")` The name of the worksheet can be specified with the `worksheet` argument. Python [`write_excel`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_excel.html) `df = pl.DataFrame({"foo": [1, 2, 3], "bar": [None, "bak", "baz"]}) df.write_excel("docs/assets/data/path.xlsx", worksheet="Sales")` Polars can create rich Excel files with multiple sheets and formatting. For more details, see the API docs for `write_excel`. --- # Databases - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/database/#databases) Databases ========= Read from a database -------------------- Polars can read from a database using the `pl.read_database_uri` and `pl.read_database` functions. ### Difference between `read_database_uri` and `read_database` Use `pl.read_database_uri` if you want to specify the database connection with a connection string called a `uri`. For example, the following snippet shows a query to read all columns from the `foo` table in a Postgres database where we use the `uri` to connect: Python [`read_database_uri`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_database_uri.html) `import polars as pl uri = "postgresql://username:password@server:port/database" query = "SELECT * FROM foo" pl.read_database_uri(query=query, uri=uri)` On the other hand, use `pl.read_database` if you want to connect via a connection engine created with a library like SQLAlchemy. Python [`read_database`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_database.html) `import polars as pl from sqlalchemy import create_engine conn = create_engine(f"sqlite:///test.db") query = "SELECT * FROM foo" pl.read_database(query=query, connection=conn.connect())` Note that `pl.read_database_uri` is likely to be faster than `pl.read_database` if you are using a SQLAlchemy or DBAPI2 connection as these connections may load the data row-wise into Python before copying the data again to the column-wise Apache Arrow format. ### Engines Polars doesn't manage connections and data transfer from databases by itself. Instead, external libraries (known as _engines_) handle this. When using `pl.read_database`, you specify the engine when you create the connection object. When using `pl.read_database_uri`, you can specify one of two engines to read from the database: * [ConnectorX](https://github.com/sfu-db/connector-x) and * [ADBC](https://arrow.apache.org/docs/format/ADBC.html) Both engines have native support for Apache Arrow and so can read data directly into a Polars `DataFrame` without copying the data. #### ConnectorX ConnectorX is the default engine and [supports numerous databases](https://github.com/sfu-db/connector-x#sources) including Postgres, Mysql, SQL Server and Redshift. ConnectorX is written in Rust and stores data in Arrow format to allow for zero-copy to Polars. To read from one of the supported databases with `ConnectorX` you need to activate the additional dependency `ConnectorX` when installing Polars or install it manually with `$ pip install connectorx` #### ADBC ADBC (Arrow Database Connectivity) is an engine supported by the Apache Arrow project. ADBC aims to be both an API standard for connecting to databases and libraries implementing this standard in a range of languages. It is still early days for ADBC so support for different databases is limited. At present, drivers for ADBC are only available for [Postgres](https://pypi.org/project/adbc-driver-postgresql/) , [SQLite](https://pypi.org/project/adbc-driver-sqlite/) and [Snowflake](https://pypi.org/project/adbc-driver-snowflake/) . To install ADBC, you need to install the driver for your database. For example, to install the driver for SQLite, you run: `$ pip install adbc-driver-sqlite` As ADBC is not the default engine, you must specify the engine as an argument to `pl.read_database_uri`. Python [`read_database_uri`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_database_uri.html) `uri = "postgresql://username:password@server:port/database" query = "SELECT * FROM foo" pl.read_database_uri(query=query, uri=uri, engine="adbc")` Write to a database ------------------- We can write to a database with Polars using the `pl.write_database` function. ### Engines As with reading from a database above, Polars uses an _engine_ to write to a database. The currently supported engines are: * [SQLAlchemy](https://www.sqlalchemy.org/) and * Arrow Database Connectivity (ADBC) #### SQLAlchemy With the default engine SQLAlchemy you can write to any database supported by SQLAlchemy. To use this engine you need to install SQLAlchemy and Pandas `$ pip install SQLAlchemy pandas` In this example, we write the `DataFrame` to a table called `records` in the database Python [`write_database`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_database.html) `uri = "postgresql://username:password@server:port/database" df = pl.DataFrame({"foo": [1, 2, 3]}) df.write_database(table_name="records", connection=uri)` In the SQLAlchemy approach, Polars converts the `DataFrame` to a Pandas `DataFrame` backed by PyArrow and then uses SQLAlchemy methods on a Pandas `DataFrame` to write to the database. #### ADBC ADBC can also be used to write to a database. Writing is supported for the same databases that support reading with ADBC. As shown above, you need to install the appropriate ADBC driver for your database. Python [`write_database`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_database.html) `uri = "postgresql://username:password@server:port/database" df = pl.DataFrame({"foo": [1, 2, 3]}) df.write_database(table_name="records", connection=uri, engine="adbc")` --- # Casting - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/casting/#casting) Casting ======= Casting converts the [underlying data type of a column](https://docs.pola.rs/user-guide/concepts/data-types-and-structures/) to a new one. Casting is available through the function `cast`. The function `cast` includes a parameter `strict` that determines how Polars behaves when it encounters a value that cannot be converted from the source data type to the target data type. The default behaviour is `strict=True`, which means that Polars will thrown an error to notify the user of the failed conversion while also providing details on the values that couldn't be cast. On the other hand, if `strict=False`, any values that cannot be converted to the target data type will be quietly converted to `null`. Basic example ------------- Let's take a look at the following dataframe which contains both integers and floating point numbers: Python Rust `import polars as pl df = pl.DataFrame( { "integers": [1, 2, 3], "big_integers": [10000002, 2, 30000003], "floats": [4.0, 5.8, -6.3], } ) print(df)` `use polars::prelude::*; let df = df! ( "integers"=> [1, 2, 3], "big_integers"=> [10000002, 2, 30000003], "floats"=> [4.0, 5.8, -6.3], )?; println!("{df}");` `shape: (3, 3) ┌──────────┬──────────────┬────────┐ │ integers ┆ big_integers ┆ floats │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ f64 │ ╞══════════╪══════════════╪════════╡ │ 1 ┆ 10000002 ┆ 4.0 │ │ 2 ┆ 2 ┆ 5.8 │ │ 3 ┆ 30000003 ┆ -6.3 │ └──────────┴──────────────┴────────┘` To perform casting operations between floats and integers, or vice versa, we use the function `cast`: Python Rust [`cast`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html) `result = df.select( pl.col("integers").cast(pl.Float32).alias("integers_as_floats"), pl.col("floats").cast(pl.Int32).alias("floats_as_integers"), ) print(result)` [`cast`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.cast) `let result = df .clone() .lazy() .select([ col("integers") .cast(DataType::Float32) .alias("integers_as_floats"), col("floats") .cast(DataType::Int32) .alias("floats_as_integers"), ]) .collect()?; println!("{result}");` `shape: (3, 2) ┌────────────────────┬────────────────────┐ │ integers_as_floats ┆ floats_as_integers │ │ --- ┆ --- │ │ f32 ┆ i32 │ ╞════════════════════╪════════════════════╡ │ 1.0 ┆ 4 │ │ 2.0 ┆ 5 │ │ 3.0 ┆ -6 │ └────────────────────┴────────────────────┘` Note that floating point numbers are truncated when casting to an integer data type. Downcasting numerical data types -------------------------------- You can reduce the memory footprint of a column by changing the precision associated with its numeric data type. As an illustration, the code below demonstrates how casting from `Int64` to `Int16` and from `Float64` to `Float32` can be used to lower memory usage: Python Rust [`cast`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html) · [`estimated_size`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.estimated_size.html) `print(f"Before downcasting: {df.estimated_size()} bytes") result = df.with_columns( pl.col("integers").cast(pl.Int16), pl.col("floats").cast(pl.Float32), ) print(f"After downcasting: {result.estimated_size()} bytes")` [`cast`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.cast) · [`estimated_size`](https://docs.rs/polars/latest/polars/frame/struct.DataFrame.html#method.estimated_size) `println!("Before downcasting: {} bytes", df.estimated_size()); let result = df .clone() .lazy() .with_columns([ col("integers").cast(DataType::Int16), col("floats").cast(DataType::Float32), ]) .collect()?; println!("After downcasting: {} bytes", result.estimated_size());` `Before downcasting: 72 bytes After downcasting: 42 bytes` When performing downcasting it is crucial to ensure that the chosen number of bits (such as 64, 32, or 16) is sufficient to accommodate the largest and smallest numbers in the column. For example, a 32-bit signed integer (`Int32`) represents integers between -2147483648 and 2147483647, inclusive, while an 8-bit signed integer only represents integers between -128 and 127, inclusive. Attempting to downcast to a data type with insufficient precision results in an error thrown by Polars: Python Rust [`cast`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html) `from polars.exceptions import InvalidOperationError try: result = df.select(pl.col("big_integers").cast(pl.Int8)) print(result) except InvalidOperationError as err: print(err)` [`cast`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.cast) `let result = df .clone() .lazy() .select([col("big_integers").strict_cast(DataType::Int8)]) .collect(); if let Err(e) = result { println!("{e}") };` ``conversion from `i64` to `i8` failed in column 'big_integers' for 2 out of 3 values: [10000002, 30000003]`` If you set the parameter `strict` to `False` the overflowing/underflowing values are converted to `null`: Python Rust [`cast`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html) `result = df.select(pl.col("big_integers").cast(pl.Int8, strict=False)) print(result)` [`cast`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.cast) `let result = df .lazy() .select([col("big_integers").cast(DataType::Int8)]) .collect()?; println!("{result}");` `shape: (3, 1) ┌──────────────┐ │ big_integers │ │ --- │ │ i8 │ ╞══════════════╡ │ null │ │ 2 │ │ null │ └──────────────┘` Converting strings to numeric data types ---------------------------------------- Strings that represent numbers can be converted to the appropriate data types via casting. The opposite conversion is also possible: Python Rust [`cast`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html) `df = pl.DataFrame( { "integers_as_strings": ["1", "2", "3"], "floats_as_strings": ["4.0", "5.8", "-6.3"], "floats": [4.0, 5.8, -6.3], } ) result = df.select( pl.col("integers_as_strings").cast(pl.Int32), pl.col("floats_as_strings").cast(pl.Float64), pl.col("floats").cast(pl.String), ) print(result)` [`cast`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.cast) `let df = df! ( "integers_as_strings" => ["1", "2", "3"], "floats_as_strings" => ["4.0", "5.8", "-6.3"], "floats" => [4.0, 5.8, -6.3], )?; let result = df .lazy() .select([ col("integers_as_strings").cast(DataType::Int32), col("floats_as_strings").cast(DataType::Float64), col("floats").cast(DataType::String), ]) .collect()?; println!("{result}");` `shape: (3, 3) ┌─────────────────────┬───────────────────┬────────┐ │ integers_as_strings ┆ floats_as_strings ┆ floats │ │ --- ┆ --- ┆ --- │ │ i32 ┆ f64 ┆ str │ ╞═════════════════════╪═══════════════════╪════════╡ │ 1 ┆ 4.0 ┆ 4.0 │ │ 2 ┆ 5.8 ┆ 5.8 │ │ 3 ┆ -6.3 ┆ -6.3 │ └─────────────────────┴───────────────────┴────────┘` In case the column contains a non-numerical value, or a poorly formatted one, Polars will throw an error with details on the conversion error. You can set `strict=False` to circumvent the error and get a `null` value instead. Python Rust [`cast`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html) `df = pl.DataFrame( { "floats": ["4.0", "5.8", "- 6 . 3"], } ) try: result = df.select(pl.col("floats").cast(pl.Float64)) except InvalidOperationError as err: print(err)` [`cast`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.cast) `let df = df! ("floats" => ["4.0", "5.8", "- 6 . 3"])?; let result = df .lazy() .select([col("floats").strict_cast(DataType::Float64)]) .collect(); if let Err(e) = result { println!("{e}") };` ``conversion from `str` to `f64` failed in column 'floats' for 1 out of 3 values: ["- 6 . 3"]`` Booleans -------- Booleans can be expressed as either 1 (`True`) or 0 (`False`). It's possible to perform casting operations between a numerical data type and a Boolean, and vice versa. When converting numbers to Booleans, the number 0 is converted to `False` and all other numbers are converted to `True`, in alignment with Python's Truthy and Falsy values for numbers: Python Rust [`cast`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html) `df = pl.DataFrame( { "integers": [-1, 0, 2, 3, 4], "floats": [0.0, 1.0, 2.0, 3.0, 4.0], "bools": [True, False, True, False, True], } ) result = df.select( pl.col("integers").cast(pl.Boolean), pl.col("floats").cast(pl.Boolean), pl.col("bools").cast(pl.Int8), ) print(result)` [`cast`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.cast) `let df = df! ( "integers"=> [-1, 0, 2, 3, 4], "floats"=> [0.0, 1.0, 2.0, 3.0, 4.0], "bools"=> [true, false, true, false, true], )?; let result = df .lazy() .select([ col("integers").cast(DataType::Boolean), col("floats").cast(DataType::Boolean), col("bools").cast(DataType::UInt8), ]) .collect()?; println!("{result}");` `shape: (5, 3) ┌──────────┬────────┬───────┐ │ integers ┆ floats ┆ bools │ │ --- ┆ --- ┆ --- │ │ bool ┆ bool ┆ i8 │ ╞══════════╪════════╪═══════╡ │ true ┆ false ┆ 1 │ │ false ┆ true ┆ 0 │ │ true ┆ true ┆ 1 │ │ true ┆ true ┆ 0 │ │ true ┆ true ┆ 1 │ └──────────┴────────┴───────┘` Parsing / formatting temporal data types ---------------------------------------- All temporal data types are represented internally as the number of time units elapsed since a reference moment, usually referred to as the epoch. For example, values of the data type `Date` are stored as the number of days since the epoch. For the data type `Datetime` the time unit is the microsecond (us) and for `Time` the time unit is the nanosecond (ns). Casting between numerical types and temporal data types is allowed and exposes this relationship: Python Rust [`cast`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html) `from datetime import date, datetime, time df = pl.DataFrame( { "date": [ date(1970, 1, 1), # epoch date(1970, 1, 10), # 9 days later ], "datetime": [ datetime(1970, 1, 1, 0, 0, 0), # epoch datetime(1970, 1, 1, 0, 1, 0), # 1 minute later ], "time": [ time(0, 0, 0), # reference time time(0, 0, 1), # 1 second later ], } ) result = df.select( pl.col("date").cast(pl.Int64).alias("days_since_epoch"), pl.col("datetime").cast(pl.Int64).alias("us_since_epoch"), pl.col("time").cast(pl.Int64).alias("ns_since_midnight"), ) print(result)` [`cast`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.cast) `use chrono::prelude::*; let df = df!( "date" => [ NaiveDate::from_ymd_opt(1970, 1, 1).unwrap(), // epoch NaiveDate::from_ymd_opt(1970, 1, 10).unwrap(), // 9 days later ], "datetime" => [ NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_opt(0, 0, 0).unwrap(), // epoch NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_opt(0, 1, 0).unwrap(), // 1 minute later ], "time" => [ NaiveTime::from_hms_opt(0, 0, 0).unwrap(), // reference time NaiveTime::from_hms_opt(0, 0, 1).unwrap(), // 1 second later ] ) .unwrap() .lazy() // Make the time unit match that of Python's for the same results. .with_column(col("datetime").cast(DataType::Datetime(TimeUnit::Microseconds, None))) .collect()?; let result = df .lazy() .select([ col("date").cast(DataType::Int64).alias("days_since_epoch"), col("datetime") .cast(DataType::Int64) .alias("us_since_epoch"), col("time").cast(DataType::Int64).alias("ns_since_midnight"), ]) .collect()?; println!("{result}");` `shape: (2, 3) ┌──────────────────┬────────────────┬───────────────────┐ │ days_since_epoch ┆ us_since_epoch ┆ ns_since_midnight │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞══════════════════╪════════════════╪═══════════════════╡ │ 0 ┆ 0 ┆ 0 │ │ 9 ┆ 60000000 ┆ 1000000000 │ └──────────────────┴────────────────┴───────────────────┘` To format temporal data types as strings we can use the function `dt.to_string` and to parse temporal data types from strings we can use the function `str.to_datetime`. Both functions adopt the [chrono format syntax](https://docs.rs/chrono/latest/chrono/format/strftime/index.html) for formatting. Python Rust [`dt.to_string`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.dt.to_string.html) · [`str.to_date`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.to_date.html) `df = pl.DataFrame( { "date": [date(2022, 1, 1), date(2022, 1, 2)], "string": ["2022-01-01", "2022-01-02"], } ) result = df.select( pl.col("date").dt.to_string("%Y-%m-%d"), pl.col("string").str.to_datetime("%Y-%m-%d"), ) print(result)` [`dt.to_string`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/struct.DateLikeNameSpace.html#method.to_string) · [`str.replace_all`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.to_date) · [Available on feature temporal](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag temporal") · [Available on feature dtype-date](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-date") `let df = df! ( "date" => [ NaiveDate::from_ymd_opt(2022, 1, 1).unwrap(), NaiveDate::from_ymd_opt(2022, 1, 2).unwrap(), ], "string" => [ "2022-01-01", "2022-01-02", ], )?; let result = df .lazy() .select([ col("date").dt().to_string("%Y-%m-%d"), col("string").str().to_datetime( Some(TimeUnit::Microseconds), None, StrptimeOptions::default(), lit("raise"), ), ]) .collect()?; println!("{result}");` `shape: (2, 2) ┌────────────┬─────────────────────┐ │ date ┆ string │ │ --- ┆ --- │ │ str ┆ datetime[μs] │ ╞════════════╪═════════════════════╡ │ 2022-01-01 ┆ 2022-01-01 00:00:00 │ │ 2022-01-02 ┆ 2022-01-02 00:00:00 │ └────────────┴─────────────────────┘` It's worth noting that `str.to_datetime` features additional options that support timezone functionality. Refer to the API documentation for further information. --- # Lazy - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/lazy/#lazy) Lazy ==== The Lazy chapter is a guide for working with `LazyFrames`. It covers the functionalities like how to use it and how to optimise it. You can also find more information about the query plan or gain more insight in the streaming capabilities. * [Using lazy API](https://docs.pola.rs/user-guide/lazy/using/) * [Optimisations](https://docs.pola.rs/user-guide/lazy/optimizations/) * [Schemas](https://docs.pola.rs/user-guide/lazy/schemas/) * [Query plan](https://docs.pola.rs/user-guide/lazy/query-plan/) * [Execution](https://docs.pola.rs/user-guide/lazy/execution/) * [Sources & Sinks](https://docs.pola.rs/user-guide/lazy/sources_sinks/) * [GPU Support](https://docs.pola.rs/user-guide/lazy/gpu/) --- # Optimizations - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/lazy/optimizations/#optimizations) Optimizations ============= If you use Polars' lazy API, Polars will run several optimizations on your query. Some of them are executed up front, others are determined just in time as the materialized data comes in. Here is a non-complete overview of optimizations done by polars, what they do and how often they run. | Optimization | Explanation | runs | | --- | --- | --- | | Predicate pushdown | Applies filters as early as possible/ at scan level. | 1 time | | Projection pushdown | Select only the columns that are needed at the scan level. | 1 time | | Slice pushdown | Only load the required slice from the scan level. Don't materialize sliced outputs (e.g. join.head(10)). | 1 time | | Common subplan elimination | Cache subtrees/file scans that are used by multiple subtrees in the query plan. | 1 time | | Simplify expressions | Various optimizations, such as constant folding and replacing expensive operations with faster alternatives. | until fixed point | | Join ordering | Estimates the branches of joins that should be executed first in order to reduce memory pressure. | 1 time | | Type coercion | Coerce types such that operations succeed and run on minimal required memory. | until fixed point | | Cardinality estimation | Estimates cardinality in order to determine optimal group by strategy. | 0/n times; dependent on query | --- # GPU Support - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/lazy/gpu/#gpu-support) GPU Support =========== Polars provides an in-memory, GPU-accelerated execution engine for the Lazy API in Python using [RAPIDS cuDF](https://docs.rapids.ai/api/cudf/stable/) on NVIDIA GPUs. This functionality is available in Open Beta, is undergoing rapid development, and is currently a single GPU implementation. If you install Polars with the [GPU feature flag](https://docs.pola.rs/user-guide/installation/) , you can trigger GPU-based execution by running `.collect(engine="gpu")` instead of `.collect()`. Python `import polars as pl df = pl.LazyFrame({"a": [1.242, 1.535]}) q = df.select(pl.col("a").round(1)) result = q.collect(engine="gpu") print(result)` `shape: (2, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 1.2 │ │ 1.5 │ └─────┘` Learn more in the [GPU Support guide](https://docs.pola.rs/user-guide/gpu-support/) . --- # CSV - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/csv/#csv) CSV === Read & write ------------ Reading a CSV file should look familiar: Python Rust [`read_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html) `df = pl.read_csv("docs/assets/data/path.csv")` [`CsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReader.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") `use polars::prelude::*; let mut df = df!( "foo" => &[1, 2, 3], "bar" => &[None, Some("bak"), Some("baz")], ) .unwrap(); let mut file = std::fs::File::create("docs/assets/data/path.csv").unwrap(); CsvWriter::new(&mut file).finish(&mut df).unwrap(); let df = CsvReadOptions::default() .try_into_reader_with_file_path(Some("docs/assets/data/path.csv".into())) .unwrap() .finish() .unwrap();` Writing a CSV file is similar with the `write_csv` function: Python Rust [`write_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_csv.html) `df = pl.DataFrame({"foo": [1, 2, 3], "bar": [None, "bak", "baz"]}) df.write_csv("docs/assets/data/path.csv")` [`CsvWriter`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvWriter.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") `let mut df = df!( "foo" => &[1, 2, 3], "bar" => &[None, Some("bak"), Some("baz")], ) .unwrap(); let mut file = std::fs::File::create("docs/assets/data/path.csv").unwrap(); CsvWriter::new(&mut file).finish(&mut df).unwrap();` Scan ---- Polars allows you to _scan_ a CSV input. Scanning delays the actual parsing of the file and instead returns a lazy computation holder called a `LazyFrame`. Python Rust [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) `df = pl.scan_csv("docs/assets/data/path.csv")` [`LazyCsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyCsvReader.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") `let lf = LazyCsvReader::new(PlRefPath::new("docs/assets/data/path.csv")) .finish() .unwrap();` If you want to know why this is desirable, you can read more about these Polars optimizations [here](https://docs.pola.rs/user-guide/concepts/lazy-api/) . --- # Basic operations - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/basic-operations/#basic-operations) Basic operations ================ This section shows how to do basic operations on dataframe columns, like do basic arithmetic calculations, perform comparisons, and other general-purpose operations. We will use the following dataframe for the examples that follow: Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) `import polars as pl import numpy as np np.random.seed(42) # For reproducibility. df = pl.DataFrame( { "nrs": [1, 2, 3, None, 5], "names": ["foo", "ham", "spam", "egg", "spam"], "random": np.random.rand(5), "groups": ["A", "A", "B", "A", "B"], } ) print(df)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) `use polars::prelude::*; let df = df! ( "nrs" => &[Some(1), Some(2), Some(3), None, Some(5)], "names" => &["foo", "ham", "spam", "egg", "spam"], "random" => &[0.37454, 0.950714, 0.731994, 0.598658, 0.156019], "groups" => &["A", "A", "B", "A", "B"], )?; println!("{}", &df);` `shape: (5, 4) ┌──────┬───────┬──────────┬────────┐ │ nrs ┆ names ┆ random ┆ groups │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ f64 ┆ str │ ╞══════╪═══════╪══════════╪════════╡ │ 1 ┆ foo ┆ 0.37454 ┆ A │ │ 2 ┆ ham ┆ 0.950714 ┆ A │ │ 3 ┆ spam ┆ 0.731994 ┆ B │ │ null ┆ egg ┆ 0.598658 ┆ A │ │ 5 ┆ spam ┆ 0.156019 ┆ B │ └──────┴───────┴──────────┴────────┘` Basic arithmetic ---------------- Polars supports basic arithmetic between series of the same length, or between series and literals. When literals are mixed with series, the literals are broadcast to match the length of the series they are being used with. Python Rust [`operators`](https://docs.pola.rs/api/python/stable/reference/expressions/operators.html) `result = df.select( (pl.col("nrs") + 5).alias("nrs + 5"), (pl.col("nrs") - 5).alias("nrs - 5"), (pl.col("nrs") * pl.col("random")).alias("nrs * random"), (pl.col("nrs") / pl.col("random")).alias("nrs / random"), (pl.col("nrs") ** 2).alias("nrs ** 2"), (pl.col("nrs") % 3).alias("nrs % 3"), ) print(result)` [`operators`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Operator.html) `let result = df .clone() .lazy() .select([ (col("nrs") + lit(5)).alias("nrs + 5"), (col("nrs") - lit(5)).alias("nrs - 5"), (col("nrs") * col("random")).alias("nrs * random"), (col("nrs") / col("random")).alias("nrs / random"), (col("nrs").pow(lit(2))).alias("nrs ** 2"), (col("nrs") % lit(3)).alias("nrs % 3"), ]) .collect()?; println!("{result}");` `shape: (5, 6) ┌─────────┬─────────┬──────────────┬──────────────┬──────────┬─────────┐ │ nrs + 5 ┆ nrs - 5 ┆ nrs * random ┆ nrs / random ┆ nrs ** 2 ┆ nrs % 3 │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ f64 ┆ f64 ┆ i64 ┆ i64 │ ╞═════════╪═════════╪══════════════╪══════════════╪══════════╪═════════╡ │ 6 ┆ -4 ┆ 0.37454 ┆ 2.669941 ┆ 1 ┆ 1 │ │ 7 ┆ -3 ┆ 1.901429 ┆ 2.103681 ┆ 4 ┆ 2 │ │ 8 ┆ -2 ┆ 2.195982 ┆ 4.098395 ┆ 9 ┆ 0 │ │ null ┆ null ┆ null ┆ null ┆ null ┆ null │ │ 10 ┆ 0 ┆ 0.780093 ┆ 32.047453 ┆ 25 ┆ 2 │ └─────────┴─────────┴──────────────┴──────────────┴──────────┴─────────┘` The example above shows that when an arithmetic operation takes `null` as one of its operands, the result is `null`. Polars uses operator overloading to allow you to use your language's native arithmetic operators within your expressions. If you prefer, in Python you can use the corresponding named functions, as the snippet below demonstrates: `# Python only: result_named_operators = df.select( (pl.col("nrs").add(5)).alias("nrs + 5"), (pl.col("nrs").sub(5)).alias("nrs - 5"), (pl.col("nrs").mul(pl.col("random"))).alias("nrs * random"), (pl.col("nrs").truediv(pl.col("random"))).alias("nrs / random"), (pl.col("nrs").pow(2)).alias("nrs ** 2"), (pl.col("nrs").mod(3)).alias("nrs % 3"), ) print(result.equals(result_named_operators))` `True` Comparisons ----------- Like with arithmetic operations, Polars supports comparisons via the overloaded operators or named functions: Python Rust [`operators`](https://docs.pola.rs/api/python/stable/reference/expressions/operators.html) `result = df.select( (pl.col("nrs") > 1).alias("nrs > 1"), # .gt (pl.col("nrs") >= 3).alias("nrs >= 3"), # ge (pl.col("random") < 0.2).alias("random < .2"), # .lt (pl.col("random") <= 0.5).alias("random <= .5"), # .le (pl.col("nrs") != 1).alias("nrs != 1"), # .ne (pl.col("nrs") == 1).alias("nrs == 1"), # .eq ) print(result)` [`operators`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Operator.html) `let result = df .clone() .lazy() .select([ col("nrs").gt(1).alias("nrs > 1"), col("nrs").gt_eq(3).alias("nrs >= 3"), col("random").lt_eq(0.2).alias("random < .2"), col("random").lt_eq(0.5).alias("random <= .5"), col("nrs").neq(1).alias("nrs != 1"), col("nrs").eq(1).alias("nrs == 1"), ]) .collect()?; println!("{result}");` `shape: (5, 6) ┌─────────┬──────────┬─────────────┬──────────────┬──────────┬──────────┐ │ nrs > 1 ┆ nrs >= 3 ┆ random < .2 ┆ random <= .5 ┆ nrs != 1 ┆ nrs == 1 │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ bool ┆ bool ┆ bool ┆ bool ┆ bool ┆ bool │ ╞═════════╪══════════╪═════════════╪══════════════╪══════════╪══════════╡ │ false ┆ false ┆ false ┆ true ┆ false ┆ true │ │ true ┆ false ┆ false ┆ false ┆ true ┆ false │ │ true ┆ true ┆ false ┆ false ┆ true ┆ false │ │ null ┆ null ┆ false ┆ false ┆ null ┆ null │ │ true ┆ true ┆ true ┆ true ┆ true ┆ false │ └─────────┴──────────┴─────────────┴──────────────┴──────────┴──────────┘` Boolean and bitwise operations ------------------------------ Depending on the language, you may use the operators `&`, `|`, and `~`, for the Boolean operations “and”, “or”, and “not”, respectively, or the functions of the same name: Python Rust [`operators`](https://docs.pola.rs/api/python/stable/reference/expressions/operators.html) ``# Boolean operators & | ~ result = df.select( ((~pl.col("nrs").is_null()) & (pl.col("groups") == "A")).alias( "number not null and group A" ), ((pl.col("random") < 0.5) | (pl.col("groups") == "B")).alias( "random < 0.5 or group B" ), ) print(result) # Corresponding named functions `and_`, `or_`, and `not_`. result2 = df.select( (pl.col("nrs").is_null().not_().and_(pl.col("groups") == "A")).alias( "number not null and group A" ), ((pl.col("random") < 0.5).or_(pl.col("groups") == "B")).alias( "random < 0.5 or group B" ), ) print(result.equals(result2))`` [`operators`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Operator.html) `let result = df .clone() .lazy() .select([ ((col("nrs").is_null()).not().and(col("groups").eq(lit("A")))) .alias("number not null and group A"), (col("random").lt(lit(0.5)).or(col("groups").eq(lit("B")))) .alias("random < 0.5 or group B"), ]) .collect()?; println!("{result}");` `shape: (5, 2) ┌─────────────────────────────┬─────────────────────────┐ │ number not null and group A ┆ random < 0.5 or group B │ │ --- ┆ --- │ │ bool ┆ bool │ ╞═════════════════════════════╪═════════════════════════╡ │ true ┆ true │ │ true ┆ false │ │ false ┆ true │ │ false ┆ false │ │ false ┆ true │ └─────────────────────────────┴─────────────────────────┘ True` Python trivia The Python functions are called `and_`, `or_`, and `not_`, because the words `and`, `or`, and `not` are reserved keywords in Python. Similarly, we cannot use the keywords `and`, `or`, and `not`, as the Boolean operators because these Python keywords will interpret their operands in the context of Truthy and Falsy through the dunder method `__bool__`. Thus, we overload the bitwise operators `&`, `|`, and `~`, as the Boolean operators because they are the second best choice. These operators/functions can also be used for the respective bitwise operations, alongside the bitwise operator `^` / function `xor`: Python Rust `result = df.select( pl.col("nrs"), (pl.col("nrs") & 6).alias("nrs & 6"), (pl.col("nrs") | 6).alias("nrs | 6"), (~pl.col("nrs")).alias("not nrs"), (pl.col("nrs") ^ 6).alias("nrs ^ 6"), ) print(result)` `let result = df .clone() .lazy() .select([ col("nrs"), col("nrs").and(lit(6)).alias("nrs & 6"), col("nrs").or(lit(6)).alias("nrs | 6"), col("nrs").not().alias("not nrs"), col("nrs").xor(lit(6)).alias("nrs ^ 6"), ]) .collect()?; println!("{result}");` `shape: (5, 5) ┌──────┬─────────┬─────────┬─────────┬─────────┐ │ nrs ┆ nrs & 6 ┆ nrs | 6 ┆ not nrs ┆ nrs ^ 6 │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞══════╪═════════╪═════════╪═════════╪═════════╡ │ 1 ┆ 0 ┆ 7 ┆ -2 ┆ 7 │ │ 2 ┆ 2 ┆ 6 ┆ -3 ┆ 4 │ │ 3 ┆ 2 ┆ 7 ┆ -4 ┆ 5 │ │ null ┆ null ┆ null ┆ null ┆ null │ │ 5 ┆ 4 ┆ 7 ┆ -6 ┆ 3 │ └──────┴─────────┴─────────┴─────────┴─────────┘` Counting (unique) values ------------------------ Polars has two functions to count the number of unique values in a series. The function `n_unique` can be used to count the exact number of unique values in a series. However, for very large data sets, this operation can be quite slow. In those cases, if an approximation is good enough, you can use the function `approx_n_unique` that uses the algorithm [HyperLogLog++](https://en.wikipedia.org/wiki/HyperLogLog) to estimate the result. The example below shows an example series where the `approx_n_unique` estimation is wrong by 0.9%: Python Rust [`n_unique`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.n_unique.html) · [`approx_n_unique`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.approx_n_unique.html) `long_df = pl.DataFrame({"numbers": np.random.randint(0, 100_000, 100_000)}) result = long_df.select( pl.col("numbers").n_unique().alias("n_unique"), pl.col("numbers").approx_n_unique().alias("approx_n_unique"), ) print(result)` [`n_unique`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.n_unique) · [`approx_n_unique`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.approx_n_unique) · [Available on feature approx\_unique](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag approx_unique") `use rand::distr::{Distribution, Uniform}; use rand::rng; let mut rng = rng(); let between = Uniform::new_inclusive(0, 100_000).unwrap(); let arr: Vec = between.sample_iter(&mut rng).take(100_100).collect(); let long_df = df!( "numbers" => &arr )?; let result = long_df .lazy() .select([ col("numbers").n_unique().alias("n_unique"), col("numbers").approx_n_unique().alias("approx_n_unique"), ]) .collect()?; println!("{result}");` `shape: (1, 2) ┌──────────┬─────────────────┐ │ n_unique ┆ approx_n_unique │ │ --- ┆ --- │ │ u32 ┆ u32 │ ╞══════════╪═════════════════╡ │ 63218 ┆ 62649 │ └──────────┴─────────────────┘` You can get more information about the unique values and their counts with the function `value_counts`, that Polars also provides: Python Rust [`value_counts`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.value_counts.html) `result = df.select( pl.col("names").value_counts().alias("value_counts"), ) print(result)` [`value_counts`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.value_counts) · [Available on feature dtype-struct](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-struct") `let result = df .clone() .lazy() .select([col("names") .value_counts(false, false, "count", false) .alias("value_counts")]) .collect()?; println!("{result}");` `shape: (4, 1) ┌──────────────┐ │ value_counts │ │ --- │ │ struct[2] │ ╞══════════════╡ │ {"spam",2} │ │ {"foo",1} │ │ {"ham",1} │ │ {"egg",1} │ └──────────────┘` The function `value_counts` returns the results in [structs, a data type that we will explore in a later section](https://docs.pola.rs/user-guide/expressions/structs/) . Alternatively, if you only need a series with the unique values or a series with the unique counts, they are one function away: Python Rust [`unique`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.unique.html) · [`unique_counts`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.unique_counts.html) `result = df.select( pl.col("names").unique(maintain_order=True).alias("unique"), pl.col("names").unique_counts().alias("unique_counts"), ) print(result)` [`unique`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.unique) · [`unique_counts`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.unique_counts) · [Available on feature unique\_counts](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag unique_counts") `let result = df .clone() .lazy() .select([ col("names").unique_stable().alias("unique"), col("names").unique_counts().alias("unique_counts"), ]) .collect()?; println!("{result}");` `shape: (4, 2) ┌────────┬───────────────┐ │ unique ┆ unique_counts │ │ --- ┆ --- │ │ str ┆ u32 │ ╞════════╪═══════════════╡ │ foo ┆ 1 │ │ ham ┆ 1 │ │ spam ┆ 2 │ │ egg ┆ 1 │ └────────┴───────────────┘` Note that we need to specify `maintain_order=True` in the function `unique` so that the order of the results is consistent with the order of the results in `unique_counts`. See the API reference for more information. Conditionals ------------ Polars supports something akin to a ternary operator through the function `when`, which is followed by one function `then` and an optional function `otherwise`. The function `when` accepts a predicate expression. The values that evaluate to `True` are replaced by the corresponding values of the expression inside the function `then`. The values that evaluate to `False` are replaced by the corresponding values of the expression inside the function `otherwise` or `null`, if `otherwise` is not provided. The example below applies one step of the [Collatz conjecture](https://en.wikipedia.org/wiki/Collatz_conjecture) to the numbers in the column “nrs”: Python Rust [`when`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.when.html) `result = df.select( pl.col("nrs"), pl.when(pl.col("nrs") % 2 == 1) # Is the number odd? .then(3 * pl.col("nrs") + 1) # If so, multiply by 3 and add 1. .otherwise(pl.col("nrs") // 2) # If not, divide by 2. .alias("Collatz"), ) print(result)` [`when`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.when.html) `let result = df .lazy() .select([ col("nrs"), when((col("nrs") % lit(2)).eq(lit(1))) .then(lit(3) * col("nrs") + lit(1)) .otherwise(col("nrs") / lit(2)) .alias("Collatz"), ]) .collect()?; println!("{result}");` `shape: (5, 2) ┌──────┬─────────┐ │ nrs ┆ Collatz │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞══════╪═════════╡ │ 1 ┆ 4 │ │ 2 ┆ 1 │ │ 3 ┆ 10 │ │ null ┆ null │ │ 5 ┆ 16 │ └──────┴─────────┘` You can also emulate a chain of an arbitrary number of conditionals, akin to Python's `elif` statement, by chaining an arbitrary number of consecutive blocks of `.when(...).then(...)`. In those cases, and for each given value, Polars will only consider a replacement expression that is deeper within the chain if the previous predicates all failed for that value. --- # Google Sheets (via Colab) - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/sheets_colab/#google-sheets-via-colab) Google Sheets (via Colab) ========================= Google Colab provides a utility class to read from and write to Google Sheets. Opening and reading from a sheet -------------------------------- We can open existing sheets by initializing `sheets.InteractiveSheet` with either: * the `url` parameter, for example https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/ * the `sheet_id` parameter for example 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms By default the left-most worksheets will be used, we can change this by providing either `worksheet_id` or `worksheet_name`. The first time in each session that we use `InteractiveSheet` we will need to give Colab permission to edit our drive assets on our behalf. Python `import polars as pl from google.colab import sheets url = "https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms" sheet = sheets.InteractiveSheet(url=url, backend="polars", display=False) sheet.as_df()` Creating a new sheet -------------------- When you don't provide the source of the spreadsheet one will be created for you. Python `sheet = sheets.InteractiveSheet(title="Colab <3 Polars", backend="polars")` When you pass the `df` parameter the data will be written to the sheet immediately. Python `df = pl.DataFrame({"a": [1,2,3], "b": ["a", "b", "c"]}) sheet = sheets.InteractiveSheet(df=df, title="Colab <3 Polars", backend="polars")` Writing to a sheet ------------------ By default the `update` method will clear the worksheet and write the dataframe in the top left corner. Python `sheet.update(df)` We can modify where the data is written with the `location` parameter and whether the worksheet is cleared before with `clear`. Python `sheet.update(df, clear=False) sheet.update(df, location="D3") sheet.update(df, location=(3, 4))` A good way to write multiple dataframes onto a worksheet in a loop is: Python `for i, df in dfs: df = pl.select(x=pl.arange(5)).with_columns(pow=pl.col("x") ** i) sheet.update(df, loc=(1, i * 3), clear=i == 0)` This clears the worksheet then writes the dataframes next to each other, one every five columns. --- # Hive - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/hive/#scanning-hive-partitioned-data) Hive ==== Scanning hive partitioned data ------------------------------ Polars supports scanning hive partitioned parquet and IPC datasets, with planned support for other formats in the future. Hive partition parsing is enabled by default if `scan_parquet` receives a single directory path, otherwise it is disabled by default. This can be explicitly configured using the `hive_partitioning` parameter. ### Scanning a hive directory For this example the following directory structure is used: `┌───────────────────────────────────────────────────────┐ │ File path │ ╞═══════════════════════════════════════════════════════╡ │ docs/assets/data/hive/year=2023/month=11/data.parquet │ │ docs/assets/data/hive/year=2023/month=12/data.parquet │ │ docs/assets/data/hive/year=2024/month=01/data.parquet │ │ docs/assets/data/hive/year=2024/month=02/data.parquet │ └───────────────────────────────────────────────────────┘` Simply pass the directory to `scan_parquet`, and all files will be loaded with the hive parts in the path included in the output: Python [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) `import polars as pl df = pl.scan_parquet("docs/assets/data/hive/").collect() with pl.Config(tbl_rows=99): print(df)` `shape: (11, 3) ┌─────┬──────┬───────┐ │ x ┆ year ┆ month │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪══════╪═══════╡ │ 1 ┆ 2023 ┆ 11 │ │ 2 ┆ 2023 ┆ 11 │ │ 3 ┆ 2023 ┆ 12 │ │ 4 ┆ 2023 ┆ 12 │ │ 5 ┆ 2023 ┆ 12 │ │ 6 ┆ 2024 ┆ 1 │ │ 7 ┆ 2024 ┆ 1 │ │ 8 ┆ 2024 ┆ 2 │ │ 9 ┆ 2024 ┆ 2 │ │ 10 ┆ 2024 ┆ 2 │ │ 11 ┆ 2024 ┆ 2 │ └─────┴──────┴───────┘` ### Handling mixed files Passing a directory to `scan_parquet` may not work if there are files with different extensions in the directory. For this example the following directory structure is used: `┌─────────────────────────────────────────────────────────────┐ │ File path │ ╞═════════════════════════════════════════════════════════════╡ │ docs/assets/data/hive_mixed/description.txt │ │ docs/assets/data/hive_mixed/year=2023/month=11/data.parquet │ │ docs/assets/data/hive_mixed/year=2023/month=12/data.parquet │ │ docs/assets/data/hive_mixed/year=2024/month=01/data.parquet │ │ docs/assets/data/hive_mixed/year=2024/month=02/data.parquet │ └─────────────────────────────────────────────────────────────┘` Python [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) `from pathlib import Path try: pl.scan_parquet("docs/assets/data/hive_mixed/").collect() except Exception as e: print(e)` The above fails as `description.txt` is not a valid parquet file: `directory contained paths with different file extensions: first path: docs/assets/data/hive_mixed/description.txt, second path: docs/assets/data/hive_mixed/year=2023/month=11/data.parquet. Please use a glob pattern to explicitly specify which files to read (e.g. 'dir/**/*', 'dir/**/*.parquet')` In this situation, a glob pattern can be used to be more specific about which files to load. Note that `hive_partitioning` must explicitly set to `True`: Python [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) ``df = pl.scan_parquet( # Glob to match all files ending in `.parquet` "docs/assets/data/hive_mixed/**/*.parquet", hive_partitioning=True, ).collect() with pl.Config(tbl_rows=99): print(df)`` `shape: (11, 3) ┌─────┬──────┬───────┐ │ x ┆ year ┆ month │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪══════╪═══════╡ │ 1 ┆ 2023 ┆ 11 │ │ 2 ┆ 2023 ┆ 11 │ │ 3 ┆ 2023 ┆ 12 │ │ 4 ┆ 2023 ┆ 12 │ │ 5 ┆ 2023 ┆ 12 │ │ 6 ┆ 2024 ┆ 1 │ │ 7 ┆ 2024 ┆ 1 │ │ 8 ┆ 2024 ┆ 2 │ │ 9 ┆ 2024 ┆ 2 │ │ 10 ┆ 2024 ┆ 2 │ │ 11 ┆ 2024 ┆ 2 │ └─────┴──────┴───────┘` ### Scanning file paths with hive parts `hive_partitioning` is not enabled by default for file paths: Python [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) `df = pl.scan_parquet( [ "docs/assets/data/hive/year=2024/month=01/data.parquet", "docs/assets/data/hive/year=2024/month=02/data.parquet", ], ).collect() print(df)` `shape: (6, 1) ┌─────┐ │ x │ │ --- │ │ i64 │ ╞═════╡ │ 6 │ │ 7 │ │ 8 │ │ 9 │ │ 10 │ │ 11 │ └─────┘` Pass `hive_partitioning=True` to enable hive partition parsing: Python [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) `df = pl.scan_parquet( [ "docs/assets/data/hive/year=2024/month=01/data.parquet", "docs/assets/data/hive/year=2024/month=02/data.parquet", ], hive_partitioning=True, ).collect() print(df)` `shape: (6, 3) ┌─────┬──────┬───────┐ │ x ┆ year ┆ month │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪══════╪═══════╡ │ 6 ┆ 2024 ┆ 1 │ │ 7 ┆ 2024 ┆ 1 │ │ 8 ┆ 2024 ┆ 2 │ │ 9 ┆ 2024 ┆ 2 │ │ 10 ┆ 2024 ┆ 2 │ │ 11 ┆ 2024 ┆ 2 │ └─────┴──────┴───────┘` Writing hive partitioned data ----------------------------- > Note: The following functionality is considered _unstable_, and is subject to change. Polars supports writing hive partitioned parquet datasets, with planned support for other formats. ### Example For this example the following DataFrame is used: Python `df = pl.DataFrame({"a": [1, 1, 2, 2, 3], "b": [1, 1, 1, 2, 2], "c": 1}) print(df)` `shape: (5, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i32 │ ╞═════╪═════╪═════╡ │ 1 ┆ 1 ┆ 1 │ │ 1 ┆ 1 ┆ 1 │ │ 2 ┆ 1 ┆ 1 │ │ 2 ┆ 2 ┆ 1 │ │ 3 ┆ 2 ┆ 1 │ └─────┴─────┴─────┘` We will write it to a hive-partitioned parquet dataset, partitioned by the columns `a` and `b`: Python [`write_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_parquet.html) `df.write_parquet("docs/assets/data/hive_write/", partition_by=["a", "b"])` The output is a hive partitioned parquet dataset with the following paths: `┌──────────────────────────────────────────────────────┐ │ File path │ ╞══════════════════════════════════════════════════════╡ │ docs/assets/data/hive_write/a=1/b=1/00000000.parquet │ │ docs/assets/data/hive_write/a=2/b=1/00000000.parquet │ │ docs/assets/data/hive_write/a=2/b=2/00000000.parquet │ │ docs/assets/data/hive_write/a=3/b=2/00000000.parquet │ └──────────────────────────────────────────────────────┘` --- # Query execution - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/lazy/execution/#query-execution) Query execution =============== Our example query on the Reddit dataset is: Python [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) `q1 = ( pl.scan_csv("docs/assets/data/reddit.csv") .with_columns(pl.col("name").str.to_uppercase()) .filter(pl.col("comment_karma") > 0) )` If we were to run the code above on the Reddit CSV the query would not be evaluated. Instead Polars takes each line of code, adds it to the internal query graph and optimizes the query graph. When we execute the code Polars executes the optimized query graph by default. ### Execution on the full dataset We can execute our query on the full dataset by calling the `.collect` method on the query. Python [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) · [`collect`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.collect.html) `q4 = ( pl.scan_csv(f"docs/assets/data/reddit.csv") .with_columns(pl.col("name").str.to_uppercase()) .filter(pl.col("comment_karma") > 0) .collect() )` `shape: (14_029, 6) ┌─────────┬───────────────────────────┬─────────────┬────────────┬───────────────┬────────────┐ │ id ┆ name ┆ created_utc ┆ updated_on ┆ comment_karma ┆ link_karma │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════════╪═══════════════════════════╪═════════════╪════════════╪═══════════════╪════════════╡ │ 6 ┆ TAOJIANLONG_JASONBROKEN ┆ 1397113510 ┆ 1536527864 ┆ 4 ┆ 0 │ │ 17 ┆ SSAIG_JASONBROKEN ┆ 1397113544 ┆ 1536527864 ┆ 1 ┆ 0 │ │ 19 ┆ FDBVFDSSDGFDS_JASONBROKEN ┆ 1397113552 ┆ 1536527864 ┆ 3 ┆ 0 │ │ 37 ┆ IHATEWHOWEARE_JASONBROKEN ┆ 1397113636 ┆ 1536527864 ┆ 61 ┆ 0 │ │ … ┆ … ┆ … ┆ … ┆ … ┆ … │ │ 1229384 ┆ DSFOX ┆ 1163177415 ┆ 1536497412 ┆ 44411 ┆ 7917 │ │ 1229459 ┆ NEOCARTY ┆ 1163177859 ┆ 1536533090 ┆ 40 ┆ 0 │ │ 1229587 ┆ TEHSMA ┆ 1163178847 ┆ 1536497412 ┆ 14794 ┆ 5707 │ │ 1229621 ┆ JEREMYLOW ┆ 1163179075 ┆ 1536497412 ┆ 411 ┆ 1063 │ └─────────┴───────────────────────────┴─────────────┴────────────┴───────────────┴────────────┘` Above we see that from the 10 million rows there are 14,029 rows that match our predicate. With the default `collect` method Polars processes all of your data as one batch. This means that all the data has to fit into your available memory at the point of peak memory usage in your query. Reusing `LazyFrame` objects Remember that `LazyFrame`s are query plans i.e. a promise on computation and is not guaranteed to cache common subplans. This means that every time you reuse it in separate downstream queries after it is defined, it is computed all over again. If you define an operation on a `LazyFrame` that doesn't maintain row order (such as a `group_by`), then the order will also change every time it is run. To avoid this, use `maintain_order=True` arguments for such operations. ### Execution on larger-than-memory data If your data requires more memory than you have available Polars may be able to process the data in batches using _streaming_ mode. To use streaming mode you simply pass the `engine="streaming"` argument to `collect` Python [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) · [`collect`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.collect.html) `q5 = ( pl.scan_csv(f"docs/assets/data/reddit.csv") .with_columns(pl.col("name").str.to_uppercase()) .filter(pl.col("comment_karma") > 0) .collect(engine='streaming') )` ### Execution on a partial dataset While you're writing, optimizing or checking your query on a large dataset, querying all available data may lead to a slow development process. Instead, you can scan a subset of your partitions or use `.head`/`.collect` at the beginning and end of your query, respectively. Keep in mind that the results of aggregations and filters on subsets of your data may not be representative of the result you would get on the full data. Python [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) · [`collect`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.collect.html) · [`head`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.head.html) `q9 = ( pl.scan_csv(f"docs/assets/data/reddit.csv") .head(10) .with_columns(pl.col("name").str.to_uppercase()) .filter(pl.col("comment_karma") > 0) .collect() )` `shape: (1, 6) ┌─────┬─────────────────────────┬─────────────┬────────────┬───────────────┬────────────┐ │ id ┆ name ┆ created_utc ┆ updated_on ┆ comment_karma ┆ link_karma │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════════════════════════╪═════════════╪════════════╪═══════════════╪════════════╡ │ 6 ┆ TAOJIANLONG_JASONBROKEN ┆ 1397113510 ┆ 1536527864 ┆ 4 ┆ 0 │ └─────┴─────────────────────────┴─────────────┴────────────┴───────────────┴────────────┘` Diverging queries ----------------- It is very common that a query diverges at one point. In these cases it is recommended to use `collect_all` as they will ensure that diverging queries execute only once. `# Some expensive LazyFrame lf: LazyFrame lf_1 = lf.select(pl.all().sum()) lf_2 = lf.some_other_computation() pl.collect_all([lf_1, lf_2]) # this will execute lf only once!` --- # DataType Expressions - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/lazy/datatype_exprs/#datatype-expressions) DataType Expressions ==================== In your lazy queries, you may want to reason about the datatypes of columns or expressions used in your queries. DataType expressions allow for the inspection and manipulation of datatypes that are used in your query. The datatypes are resolved during query planning and behave the same as static datatypes during runtime. DataType expressions can be especially useful when you don't have full control over input data. This can occur when you try to compartmentalize code, write utility functions or are loading data from heterogeneous data sources. DataType expressions also allow you to express relations between the datatype of expressions or columns. Basic Usage ----------- DataType expressions often start with `pl.dtype_of`. This allows inspecting the datatype of a column or expression. Python [`dtype_of`](https://docs.pola.rs/api/python/stable/reference/api/polars.dtype_of.html) `dtype_expr = pl.dtype_of("UserID") # For debugging you can collect the output datatype in a specific context. schema = pl.Schema({ 'UserID': pl.UInt64, 'Name': pl.String }) dtype_expr.collect_dtype(schema)` These expressions can be manipulated in various ways to transform them into the datatype that you need. Python `dtype_expr.wrap_in_list().collect_dtype(schema) dtype_expr.to_signed_integer().collect_dtype(schema)` You can also inspect information about the datatype to use at runtime. Python `df = schema.to_frame() df.select( userid_dtype_name = pl.dtype_of('UserID').display(), userid_is_signed = pl.dtype_of('UserID').matches(cs.signed_integer()), )` Expressing relations between datatypes -------------------------------------- Datatypes can help with utility functions by being able to express the relation between the output datatype of two expressions. The following example allows you to express that `map_batches` has the same output datatype as input datatype. Python [`map_batches`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.map_batches.html) `def inspect(expr: pl.Expr) -> pl.Expr: def print_and_return(s: pl.Series) -> pl.Series: print(s) return s return expr.map_batches( print_and_return, # Clarify that the expression returns the same datatype as the input # datatype. return_dtype=pl.dtype_of(expr), ) df = pl.DataFrame({ 'UserID': [1, 2, 3, 4, 5], 'Name': ["Alice", "Bob", "Charlie", "Diana", "Ethan"], }) df.select(inspect(pl.col('Name')))` `shape: (5,) Series: 'Name' [str] [ "Alice" "Bob" "Charlie" "Diana" "Ethan" ]` Similarly, you want to express that one column needs to be casted to the datatype of another column. Python [`cast`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html) `df = pl.DataFrame({ 'UserID': [1, 2, 3, 4, 5], 'Name': ["Alice", "Bob", "Charlie", "Diana", "Ethan"], }).with_columns( pl.col('UserID').cast(pl.dtype_of('Name')) )` --- # Usage - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/lazy/using/#usage) Usage ===== With the lazy API, Polars doesn't run each query line-by-line but instead processes the full query end-to-end. To get the most out of Polars it is important that you use the lazy API because: * the lazy API allows Polars to apply automatic query optimization with the query optimizer * the lazy API allows you to work with larger than memory datasets using streaming * the lazy API can catch schema errors before processing the data Here we see how to use the lazy API starting from either a file or an existing `DataFrame`. Using the lazy API from a file ------------------------------ In the ideal case we would use the lazy API right from a file as the query optimizer may help us to reduce the amount of data we read from the file. We create a lazy query from the Reddit CSV data and apply some transformations. By starting the query with `pl.scan_csv` we are using the lazy API. Python [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) · [`with_columns`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.with_columns.html) · [`filter`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.filter.html) · [`col`](https://docs.pola.rs/api/python/stable/reference/expressions/col.html) `q1 = ( pl.scan_csv(f"docs/assets/data/reddit.csv") .with_columns(pl.col("name").str.to_uppercase()) .filter(pl.col("comment_karma") > 0) )` A `pl.scan_` function is available for a number of file types including CSV, IPC, Parquet and JSON. In this query we tell Polars that we want to: * load data from the Reddit CSV file * convert the `name` column to uppercase * apply a filter to the `comment_karma` column The lazy query will not be executed at this point. See this page on [executing lazy queries](https://docs.pola.rs/user-guide/lazy/execution/) for more on running lazy queries. Using the lazy API from a `DataFrame` ------------------------------------- An alternative way to access the lazy API is to call `.lazy` on a `DataFrame` that has already been created in memory. Python [`lazy`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.lazy.html) `q3 = pl.DataFrame({"foo": ["a", "b", "c"], "bar": [0, 1, 2]}).lazy()` By calling `.lazy` we convert the `DataFrame` to a `LazyFrame`. --- # Sources and sinks - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/lazy/sources_sinks/#sources-and-sinks) Sources and sinks ================= Scan ---- When using the `LazyFrame` API, it is important to favor `scan_*` (`scan_parquet`, `scan_csv`, etc.) over `read_*`. A Polars `scan` is lazy and will delay execution until the query is collected. The benefit of this, is that the Polars optimizer can push optimization into the readers. They can skip reading columns and rows that aren't required. Another benefit is that, during streaming execution, the engine already can process batches before the file is completely read. Sink ---- Sinks can execute a query and stream the results to storage (being disk or cloud). The benefit of sinking data to storage is that you don't necessarily have to store all data in RAM, but can process data in batches. If we would want to convert many csv files to parquet, whilst dropping the missing data, we could do something like the query below. We use a partitioning strategy that defines how many rows may be in a single parquet file, before we generate a new file `lf = scan_csv("my_dataset/*.csv").filter(pl.all().is_not_null()) lf.sink_parquet( pl.PartitionBy( "output_folder/" max_rows_per_file=512_000 ) )` This will create the following files on disk: `output_folder/00000000.parquet output_folder/00000001.parquet ... output_folder/0000000f.parquet output_folder/00000010.parquet` Multiplexing sinks ------------------ Sinks can also multiplex. Meaning that we write to different sinks in a single query. In the code snippet below, we take a `LazyFrame` and sink it into 2 sinks at the same time. `# Some expensive computation lf: LazyFrame q1 = lf.sink_parquet(.., lazy=True) q2 = lf.sink_ipc(.., lazy=True) pl.collect_all([q1, q2])` --- # Hugging Face - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/hugging-face/#hugging-face) Hugging Face ============ Scanning datasets from Hugging Face ----------------------------------- All cloud-enabled scan functions, and their `read_` counterparts transparently support scanning from Hugging Face: | Scan | Read | | --- | --- | | [scan\_parquet](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) | [read\_parquet](https://docs.pola.rs/api/python/stable/reference/api/polars.read_parquet.html) | | [scan\_csv](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) | [read\_csv](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html) | | [scan\_ndjson](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_ndjson.html) | [read\_ndjson](https://docs.pola.rs/api/python/stable/reference/api/polars.read_ndjson.html) | | [scan\_ipc](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_ipc.html) | [read\_ipc](https://docs.pola.rs/api/python/stable/reference/api/polars.read_ipc.html) | ### Path format To scan from Hugging Face, a `hf://` path can be passed to the scan functions. The `hf://` path format is defined as `hf://BUCKET/REPOSITORY@REVISION/PATH`, where: * `BUCKET` is one of `datasets` or `spaces` * `REPOSITORY` is the location of the repository, this is usually in the format of `username/repo_name`. A branch can also be optionally specified by appending `@branch` * `REVISION` is the name of the branch (or commit) to use. This is optional and defaults to `main` if not given. * `PATH` is a file or directory path, or a glob pattern from the repository root. Example `hf://` paths: | Path | Path components | | --- | --- | | hf://datasets/nameexhaustion/polars-docs/iris.csv | Bucket: datasets
Repository: nameexhaustion/polars-docs
Branch: main
Path: iris.csv
[Web URL](https://huggingface.co/datasets/nameexhaustion/polars-docs/tree/main/) | | hf://datasets/nameexhaustion/polars-docs@foods/\*.csv | Bucket: datasets
Repository: nameexhaustion/polars-docs
Branch: foods
Path: \*.csv
[Web URL](https://huggingface.co/datasets/nameexhaustion/polars-docs/tree/foods/) | | hf://datasets/nameexhaustion/polars-docs/hive\_dates/ | Bucket: datasets
Repository: nameexhaustion/polars-docs
Branch: main
Path: hive\_dates/
[Web URL](https://huggingface.co/datasets/nameexhaustion/polars-docs/tree/main/hive_dates/) | | hf://spaces/nameexhaustion/polars-docs/orders.feather | Bucket: spaces
Repository: nameexhaustion/polars-docs
Branch: main
Path: orders.feather
[Web URL](https://huggingface.co/spaces/nameexhaustion/polars-docs/tree/main/) | ### Authentication A Hugging Face API key can be passed to Polars to access private locations using either of the following methods: * Passing a `token` in `storage_options` to the scan function, e.g. `scan_parquet(..., storage_options={'token': ''})` * Setting the `HF_TOKEN` environment variable, e.g. `export HF_TOKEN=` ### Examples #### CSV Python [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) `print(pl.scan_csv("hf://datasets/nameexhaustion/polars-docs/iris.csv").collect())` `shape: (150, 5) ┌──────────────┬─────────────┬──────────────┬─────────────┬───────────┐ │ sepal_length ┆ sepal_width ┆ petal_length ┆ petal_width ┆ species │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 ┆ f64 ┆ str │ ╞══════════════╪═════════════╪══════════════╪═════════════╪═══════════╡ │ 5.1 ┆ 3.5 ┆ 1.4 ┆ 0.2 ┆ setosa │ │ 4.9 ┆ 3.0 ┆ 1.4 ┆ 0.2 ┆ setosa │ │ 4.7 ┆ 3.2 ┆ 1.3 ┆ 0.2 ┆ setosa │ │ 4.6 ┆ 3.1 ┆ 1.5 ┆ 0.2 ┆ setosa │ │ 5.0 ┆ 3.6 ┆ 1.4 ┆ 0.2 ┆ setosa │ │ … ┆ … ┆ … ┆ … ┆ … │ │ 6.7 ┆ 3.0 ┆ 5.2 ┆ 2.3 ┆ virginica │ │ 6.3 ┆ 2.5 ┆ 5.0 ┆ 1.9 ┆ virginica │ │ 6.5 ┆ 3.0 ┆ 5.2 ┆ 2.0 ┆ virginica │ │ 6.2 ┆ 3.4 ┆ 5.4 ┆ 2.3 ┆ virginica │ │ 5.9 ┆ 3.0 ┆ 5.1 ┆ 1.8 ┆ virginica │ └──────────────┴─────────────┴──────────────┴─────────────┴───────────┘` See this file at [https://huggingface.co/datasets/nameexhaustion/polars-docs/blob/main/iris.csv](https://huggingface.co/datasets/nameexhaustion/polars-docs/blob/main/iris.csv) #### NDJSON Python [`scan_ndjson`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_ndjson.html) `print(pl.scan_ndjson("hf://datasets/nameexhaustion/polars-docs/iris.jsonl").collect())` `shape: (150, 5) ┌──────────────┬─────────────┬──────────────┬─────────────┬───────────┐ │ sepal_length ┆ sepal_width ┆ petal_length ┆ petal_width ┆ species │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 ┆ f64 ┆ str │ ╞══════════════╪═════════════╪══════════════╪═════════════╪═══════════╡ │ 5.1 ┆ 3.5 ┆ 1.4 ┆ 0.2 ┆ setosa │ │ 4.9 ┆ 3.0 ┆ 1.4 ┆ 0.2 ┆ setosa │ │ 4.7 ┆ 3.2 ┆ 1.3 ┆ 0.2 ┆ setosa │ │ 4.6 ┆ 3.1 ┆ 1.5 ┆ 0.2 ┆ setosa │ │ 5.0 ┆ 3.6 ┆ 1.4 ┆ 0.2 ┆ setosa │ │ … ┆ … ┆ … ┆ … ┆ … │ │ 6.7 ┆ 3.0 ┆ 5.2 ┆ 2.3 ┆ virginica │ │ 6.3 ┆ 2.5 ┆ 5.0 ┆ 1.9 ┆ virginica │ │ 6.5 ┆ 3.0 ┆ 5.2 ┆ 2.0 ┆ virginica │ │ 6.2 ┆ 3.4 ┆ 5.4 ┆ 2.3 ┆ virginica │ │ 5.9 ┆ 3.0 ┆ 5.1 ┆ 1.8 ┆ virginica │ └──────────────┴─────────────┴──────────────┴─────────────┴───────────┘` See this file at [https://huggingface.co/datasets/nameexhaustion/polars-docs/blob/main/iris.jsonl](https://huggingface.co/datasets/nameexhaustion/polars-docs/blob/main/iris.jsonl) #### Parquet Python [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) `print( """\ shape: (4, 3) ┌────────────┬────────────────────────────┬─────┐ │ date1 ┆ date2 ┆ x │ │ --- ┆ --- ┆ --- │ │ date ┆ datetime[μs] ┆ i32 │ ╞════════════╪════════════════════════════╪═════╡ │ 2024-01-01 ┆ 2023-01-01 00:00:00 ┆ 1 │ │ 2024-02-01 ┆ 2023-02-01 00:00:00 ┆ 2 │ │ 2024-03-01 ┆ null ┆ 3 │ │ null ┆ 2023-03-01 01:01:01.000001 ┆ 4 │ └────────────┴────────────────────────────┴─────┘ """ )` `shape: (4, 3) ┌────────────┬────────────────────────────┬─────┐ │ date1 ┆ date2 ┆ x │ │ --- ┆ --- ┆ --- │ │ date ┆ datetime[μs] ┆ i32 │ ╞════════════╪════════════════════════════╪═════╡ │ 2024-01-01 ┆ 2023-01-01 00:00:00 ┆ 1 │ │ 2024-02-01 ┆ 2023-02-01 00:00:00 ┆ 2 │ │ 2024-03-01 ┆ null ┆ 3 │ │ null ┆ 2023-03-01 01:01:01.000001 ┆ 4 │ └────────────┴────────────────────────────┴─────┘` See this folder at [https://huggingface.co/datasets/nameexhaustion/polars-docs/tree/main/hive\_dates/](https://huggingface.co/datasets/nameexhaustion/polars-docs/tree/main/hive_dates/) #### IPC Python [`scan_ipc`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_ipc.html) `print(pl.scan_ipc("hf://spaces/nameexhaustion/polars-docs/orders.feather").collect())` `shape: (10, 9) ┌────────────┬───────────┬───────────────┬──────────────┬───┬─────────────────┬─────────────────┬────────────────┬─────────────────────────┐ │ o_orderkey ┆ o_custkey ┆ o_orderstatus ┆ o_totalprice ┆ … ┆ o_orderpriority ┆ o_clerk ┆ o_shippriority ┆ o_comment │ │ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str ┆ f64 ┆ ┆ str ┆ str ┆ i64 ┆ str │ ╞════════════╪═══════════╪═══════════════╪══════════════╪═══╪═════════════════╪═════════════════╪════════════════╪═════════════════════════╡ │ 1 ┆ 36901 ┆ O ┆ 173665.47 ┆ … ┆ 5-LOW ┆ Clerk#000000951 ┆ 0 ┆ nstructions sleep │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ furiously am… │ │ 2 ┆ 78002 ┆ O ┆ 46929.18 ┆ … ┆ 1-URGENT ┆ Clerk#000000880 ┆ 0 ┆ foxes. pending accounts │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ at th… │ │ 3 ┆ 123314 ┆ F ┆ 193846.25 ┆ … ┆ 5-LOW ┆ Clerk#000000955 ┆ 0 ┆ sly final accounts │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ boost. care… │ │ 4 ┆ 136777 ┆ O ┆ 32151.78 ┆ … ┆ 5-LOW ┆ Clerk#000000124 ┆ 0 ┆ sits. slyly regular │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ warthogs c… │ │ 5 ┆ 44485 ┆ F ┆ 144659.2 ┆ … ┆ 5-LOW ┆ Clerk#000000925 ┆ 0 ┆ quickly. bold deposits │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ sleep s… │ │ 6 ┆ 55624 ┆ F ┆ 58749.59 ┆ … ┆ 4-NOT SPECIFIED ┆ Clerk#000000058 ┆ 0 ┆ ggle. special, final │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ requests … │ │ 7 ┆ 39136 ┆ O ┆ 252004.18 ┆ … ┆ 2-HIGH ┆ Clerk#000000470 ┆ 0 ┆ ly special requests │ │ 32 ┆ 130057 ┆ O ┆ 208660.75 ┆ … ┆ 2-HIGH ┆ Clerk#000000616 ┆ 0 ┆ ise blithely bold, │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ regular req… │ │ 33 ┆ 66958 ┆ F ┆ 163243.98 ┆ … ┆ 3-MEDIUM ┆ Clerk#000000409 ┆ 0 ┆ uriously. furiously │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ final requ… │ │ 34 ┆ 61001 ┆ O ┆ 58949.67 ┆ … ┆ 3-MEDIUM ┆ Clerk#000000223 ┆ 0 ┆ ly final packages. │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ fluffily fi… │ └────────────┴───────────┴───────────────┴──────────────┴───┴─────────────────┴─────────────────┴────────────────┴─────────────────────────┘` See this file at [https://huggingface.co/spaces/nameexhaustion/polars-docs/blob/main/orders.feather](https://huggingface.co/spaces/nameexhaustion/polars-docs/blob/main/orders.feather) --- # JSON files - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/json/#json-files) JSON files ========== Polars can read and write both standard JSON and newline-delimited JSON (NDJSON). Read ---- ### JSON Reading a JSON file should look familiar: Python Rust [`read_json`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_json.html) `df = pl.read_json("docs/assets/data/path.json")` [`JsonReader`](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonReader.html) · [Available on feature json](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag json") `use polars::prelude::*; let mut file = std::fs::File::open("docs/assets/data/path.json").unwrap(); let df = JsonReader::new(&mut file).finish()?;` ### Newline Delimited JSON JSON objects that are delimited by newlines can be read into Polars in a much more performant way than standard json. Polars can read an NDJSON file into a `DataFrame` using the `read_ndjson` function: Python Rust [`read_ndjson`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_ndjson.html) `df = pl.read_ndjson("docs/assets/data/path.json")` [`JsonLineReader`](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/struct.JsonLineReader.html) · [Available on feature json](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag json") `let mut file = std::fs::File::open("docs/assets/data/path.json").unwrap(); let df = JsonLineReader::new(&mut file).finish().unwrap();` Write ----- Python Rust [`write_json`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_json.html) · [`write_ndjson`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_ndjson.html) `df = pl.DataFrame({"foo": [1, 2, 3], "bar": [None, "bak", "baz"]}) df.write_json("docs/assets/data/path.json")` [`JsonWriter`](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonWriter.html) · [`JsonWriter`](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonWriter.html) · [Available on feature json](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag json") `let mut df = df!( "foo" => &[1, 2, 3], "bar" => &[None, Some("bak"), Some("baz")], ) .unwrap(); let mut file = std::fs::File::create("docs/assets/data/path.json").unwrap(); // json JsonWriter::new(&mut file) .with_json_format(JsonFormat::Json) .finish(&mut df) .unwrap(); // ndjson JsonWriter::new(&mut file) .with_json_format(JsonFormat::JsonLines) .finish(&mut df) .unwrap();` Scan ---- Polars allows you to _scan_ a JSON input **only for newline delimited json**. Scanning delays the actual parsing of the file and instead returns a lazy computation holder called a `LazyFrame`. Python Rust [`scan_ndjson`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_ndjson.html) `df = pl.scan_ndjson("docs/assets/data/path.json")` [`LazyJsonLineReader`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyJsonLineReader.html) · [Available on feature json](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag json") `let lf = LazyJsonLineReader::new(PlRefPath::new("docs/assets/data/path.json")) .finish() .unwrap();` --- # User-defined Python functions - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/user-defined-python-functions/#user-defined-python-functions) User-defined Python functions ============================= Polars expressions are quite powerful and flexible, so there is much less need for custom Python functions compared to other libraries. Still, you may need to pass an expression's state to a third party library or apply your black box function to data in Polars. In this part of the documentation we'll be using two APIs that allows you to do this: * [`map_elements`](https://docs.pola.rs/py-polars/html/reference/expressions/api/polars.Expr.map_elements.html) : Call a function separately on each value in the `Series`. * [`map_batches`](https://docs.pola.rs/py-polars/html/reference/expressions/api/polars.Expr.map_batches.html) : Always passes the full `Series` to the function. Processing individual values with `map_elements()` -------------------------------------------------- Let's start with the simplest case: we want to process each value in a `Series` individually. Here is our data: Python Rust `df = pl.DataFrame( { "keys": ["a", "a", "b", "b"], "values": [10, 7, 1, 23], } ) print(df)` `let df = df!( "keys" => &["a", "a", "b", "b"], "values" => &[10, 7, 1, 23], )?; println!("{}", df);` `shape: (4, 2) ┌──────┬────────┐ │ keys ┆ values │ │ --- ┆ --- │ │ str ┆ i64 │ ╞══════╪════════╡ │ a ┆ 10 │ │ a ┆ 7 │ │ b ┆ 1 │ │ b ┆ 23 │ └──────┴────────┘` We'll call `math.log()` on each individual value: Python Rust `def my_log(value): return math.log(value) out = df.select(pl.col("values").map_elements(my_log, return_dtype=pl.Float64)) print(out)` `shape: (4, 1) ┌──────────┐ │ values │ │ --- │ │ f64 │ ╞══════════╡ │ 2.302585 │ │ 1.94591 │ │ 0.0 │ │ 3.135494 │ └──────────┘` While this works, `map_elements()` has two problems: 1. **Limited to individual items:** Often you'll want to have a calculation that needs to operate on the whole `Series`, rather than individual items one by one. 2. **Performance overhead:** Even if you do want to process each item individually, calling a function for each individual item is slow; all those extra function calls add a lot of overhead. Let's start by solving the first problem, and then we'll see how to solve the second problem. Processing a whole `Series` with `map_batches()` ------------------------------------------------ We want to run a custom function on the contents of a whole `Series`. For demonstration purposes, let's say we want to calculate the difference between the mean of a `Series` and each value. We can use the `map_batches()` API to run this function on either the full `Series` or individual groups in a `group_by()`: Python Rust `def diff_from_mean(series): # This will be very slow for non-trivial Series, since it's all Python # code: total = 0 for value in series: total += value mean = total / len(series) return pl.Series([value - mean for value in series]) # Apply our custom function to a full Series with map_batches(): out = df.select(pl.col("values").map_batches(diff_from_mean, return_dtype=pl.Float64)) print("== select() with UDF ==") print(out) # Apply our custom function per group: print("== group_by() with UDF ==") out = df.group_by("keys").agg( pl.col("values").map_batches(diff_from_mean, return_dtype=pl.Float64) ) print(out)` `== select() with UDF == shape: (4, 1) ┌────────┐ │ values │ │ --- │ │ f64 │ ╞════════╡ │ -0.25 │ │ -3.25 │ │ -9.25 │ │ 12.75 │ └────────┘ == group_by() with UDF == shape: (2, 2) ┌──────┬───────────────┐ │ keys ┆ values │ │ --- ┆ --- │ │ str ┆ list[f64] │ ╞══════╪═══════════════╡ │ a ┆ [1.5, -1.5] │ │ b ┆ [-11.0, 11.0] │ └──────┴───────────────┘` Fast operations with user-defined functions ------------------------------------------- The problem with a pure-Python implementation is that it's slow. In general, you want to minimize how much Python code you call if you want fast results. To maximize speed, you'll want to make sure that you're using a function written in a compiled language. For numeric calculations Polars supports a pair of interfaces defined by NumPy called ["ufuncs"](https://numpy.org/doc/stable/reference/ufuncs.html) and ["generalized ufuncs"](https://numpy.org/neps/nep-0005-generalized-ufuncs.html) . The former runs on each item individually, and the latter accepts a whole NumPy array, which allows for more flexible operations. [NumPy](https://numpy.org/doc/stable/reference/ufuncs.html) and other libraries like [SciPy](https://docs.scipy.org/doc/scipy/reference/special.html#module-scipy.special) come with pre-written ufuncs you can use with Polars. For example: Python Rust `out = df.select(pl.col("values").map_batches(np.log, return_dtype=pl.Float64)) print(out)` `shape: (4, 1) ┌──────────┐ │ values │ │ --- │ │ f64 │ ╞══════════╡ │ 2.302585 │ │ 1.94591 │ │ 0.0 │ │ 3.135494 │ └──────────┘` Notice that we can use `map_batches()`, because `numpy.log()` is able to run on both individual items and on whole NumPy arrays. This means it will run much faster than our original example, since we only have a single Python call and then all processing happens in a fast low-level language. Example: A fast custom function using Numba ------------------------------------------- The pre-written functions NumPy provides are helpful, but our goal is to write our own functions. For example, let's say we want a fast version of our `diff_from_mean()` example above. The easiest way to write this in Python is to use [Numba](https://numba.readthedocs.io/en/stable/) , which allows you to write custom functions in (a subset) of Python while still getting the benefit of compiled code. In particular, Numba provides a decorator called [`@guvectorize`](https://numba.readthedocs.io/en/stable/user/vectorize.html#the-guvectorize-decorator) . This creates a generalized ufunc by compiling a Python function to fast machine code, in a way that allows it to be used by Polars. In the following example the `diff_from_mean_numba()` will be compiled to fast machine code at import time, which will take a little time. After that all calls to the function will run quickly. The `Series` will be converted to a NumPy array before being passed to the function: Python Rust `# This will be compiled to machine code, so it will be fast. The Series is # converted to a NumPy array before being passed to the function. See the # Numba documentation for more details: # https://numba.readthedocs.io/en/stable/user/vectorize.html @guvectorize([(int64[:], float64[:])], "(n)->(n)") def diff_from_mean_numba(arr, result): total = 0 for value in arr: total += value mean = total / len(arr) for i, value in enumerate(arr): result[i] = value - mean out = df.select( pl.col("values").map_batches(diff_from_mean_numba, return_dtype=pl.Float64) ) print("== select() with UDF ==") print(out) out = df.group_by("keys").agg( pl.col("values").map_batches(diff_from_mean_numba, return_dtype=pl.Float64) ) print("== group_by() with UDF ==") print(out)` `== select() with UDF == shape: (4, 1) ┌────────┐ │ values │ │ --- │ │ f64 │ ╞════════╡ │ -0.25 │ │ -3.25 │ │ -9.25 │ │ 12.75 │ └────────┘ == group_by() with UDF == shape: (2, 2) ┌──────┬───────────────┐ │ keys ┆ values │ │ --- ┆ --- │ │ str ┆ list[f64] │ ╞══════╪═══════════════╡ │ b ┆ [-11.0, 11.0] │ │ a ┆ [1.5, -1.5] │ └──────┴───────────────┘` Missing data is not allowed when calling generalized ufuncs ----------------------------------------------------------- Before being passed to a user-defined function like `diff_from_mean_numba()`, a `Series` will be converted to a NumPy array. Unfortunately, NumPy arrays don't have a concept of missing data. If there is missing data in the original `Series`, this means the resulting array won't actually match the `Series`. If you're calculating results item by item, this doesn't matter. For example, `numpy.log()` gets called on each individual value separately, so those missing values don't change the calculation. But if the result of a user-defined function depend on multiple values in the `Series`, it's not clear what exactly should happen with the missing values. Therefore, when calling generalized ufuncs such as Numba functions decorated with `@guvectorize`, Polars will raise an error if you try to pass in a `Series` with missing data. How do you get rid of missing data? Either [fill it in](https://docs.pola.rs/user-guide/expressions/missing-data/) or [drop it](https://docs.pola.rs/py-polars/html/reference/dataframe/api/polars.DataFrame.drop_nulls.html) before calling your custom function. Combining multiple column values -------------------------------- If you want to pass multiple columns to a user-defined function, you can use `Struct`s, which are [covered in detail in a different section](https://docs.pola.rs/user-guide/expressions/structs/) . The basic idea is to combine multiple columns into a `Struct`, and then the function can extract the columns back out: Python Rust `# Add two arrays together: @guvectorize([(int64[:], int64[:], float64[:])], "(n),(n)->(n)") def add(arr, arr2, result): for i in range(len(arr)): result[i] = arr[i] + arr2[i] df3 = pl.DataFrame({"values_1": [1, 2, 3], "values_2": [10, 20, 30]}) out = df3.select( # Create a struct that has two columns in it: pl.struct(["values_1", "values_2"]) # Pass the struct to a lambda that then passes the individual columns to # the add() function: .map_batches( lambda combined: add( combined.struct.field("values_1"), combined.struct.field("values_2") ), return_dtype=pl.Float64, ) .alias("add_columns") ) print(out)` `shape: (3, 1) ┌─────────────┐ │ add_columns │ │ --- │ │ f64 │ ╞═════════════╡ │ 11.0 │ │ 22.0 │ │ 33.0 │ └─────────────┘` Streaming calculations ---------------------- Passing the full `Series` to the user-defined function has a cost: it may use a lot of memory, as its contents are copied into a NumPy array. You can use the `is_elementwise=True` argument to [`map_batches`](https://docs.pola.rs/py-polars/html/reference/expressions/api/polars.Expr.map_batches.html) to stream results into the function, which means it might not get all values at once. Note The `is_elementwise` argument can lead to incorrect results if set incorrectly. If you set `is_elementwise=True`, make sure that your function actually operates element-by-element (e.g. "calculate the logarithm of each value") - our example function `diff_from_mean()`, for instance, does not. Return types ------------ Custom Python functions are often black boxes; Polars doesn't know what your function is doing or what it will return. The return data type is therefore automatically inferred. We do that by waiting for the first non-null value. That value will then be used to determine the type of the resulting `Series`. The mapping of Python types to Polars data types is as follows: * `int` -> `Int64` * `float` -> `Float64` * `bool` -> `Boolean` * `str` -> `String` * `list[tp]` -> `List[tp]` (where the inner type is inferred with the same rules) * `dict[str, [tp]]` -> `struct` * `Any` -> `object` (Prevent this at all times) Rust types map as follows: * `i32` or `i64` -> `Int64` * `f32` or `f64` -> `Float64` * `bool` -> `Boolean` * `String` or `str` -> `String` * `Vec` -> `List[tp]` (where the inner type is inferred with the same rules) You can pass a `return_dtype` argument to [`map_batches`](https://docs.pola.rs/py-polars/html/reference/expressions/api/polars.Expr.map_batches.html) if you want to override the inferred type. --- # Numpy functions - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/numpy-functions/#numpy-functions) Numpy functions =============== Polars expressions support NumPy [ufuncs](https://numpy.org/doc/stable/reference/ufuncs.html) . See [the NumPy documentation for a list of all supported NumPy functions](https://numpy.org/doc/stable/reference/ufuncs.html#available-ufuncs) . This means that if a function is not provided by Polars, we can use NumPy and we still have fast columnar operations through the NumPy API. Example ------- Python [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) · [`log`](https://numpy.org/doc/stable/reference/generated/numpy.log.html) · [Available on feature numpy](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag numpy") `import polars as pl import numpy as np df = pl.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) out = df.select(np.log(pl.all()).name.suffix("_log")) print(out)` `shape: (3, 2) ┌──────────┬──────────┐ │ a_log ┆ b_log │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞══════════╪══════════╡ │ 0.0 ┆ 1.386294 │ │ 0.693147 ┆ 1.609438 │ │ 1.098612 ┆ 1.791759 │ └──────────┴──────────┘` Interoperability ---------------- Polars' series have support for NumPy universal functions (ufuncs) and generalized ufuncs. Element-wise functions such as `np.exp`, `np.cos`, `np.div`, etc, all work with almost zero overhead. However, bear in mind that [Polars keeps track of missing values with a separate bitmask](https://docs.pola.rs/user-guide/expressions/missing-data/) and NumPy does not receive this information. This can lead to a window function or a `np.convolve` giving flawed or incomplete results, so an error will be raised if you pass a series with missing data to a generalized ufunc. Convert a Polars series to a NumPy array with the function `to_numpy`. Missing values will be replaced by `np.nan` during the conversion. --- # Aggregation - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/aggregation/#aggregation) Aggregation =========== The Polars [context](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/#contexts) `group_by` lets you apply expressions on subsets of columns, as defined by the unique values of the column over which the data is grouped. This is a very powerful capability that we explore in this section of the user guide. We start by reading in a [US congress `dataset`](https://github.com/unitedstates/congress-legislators) : Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) · [`Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html) `import polars as pl url = "hf://datasets/nameexhaustion/polars-docs/legislators-historical.csv" schema_overrides = { "first_name": pl.Categorical, "gender": pl.Categorical, "type": pl.Categorical, "state": pl.Categorical, "party": pl.Categorical, } dataset = ( pl.read_csv(url, schema_overrides=schema_overrides) .with_columns(pl.col("first", "middle", "last").name.suffix("_name")) .with_columns(pl.col("birthday").str.to_date(strict=False)) )` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) · [`Categorical`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataType.html#variant.Categorical) · [Available on feature dtype-categorical](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-categorical") `use std::io::Cursor; use polars::prelude::*; use reqwest::blocking::Client; let url = "https://huggingface.co/datasets/nameexhaustion/polars-docs/resolve/main/legislators-historical.csv"; let mut schema = Schema::default(); schema.with_column( "first_name".into(), DataType::from_categories(Categories::global()), ); schema.with_column( "gender".into(), DataType::from_categories(Categories::global()), ); schema.with_column( "type".into(), DataType::from_categories(Categories::global()), ); schema.with_column( "state".into(), DataType::from_categories(Categories::global()), ); schema.with_column( "party".into(), DataType::from_categories(Categories::global()), ); schema.with_column("birthday".into(), DataType::Date); let data = Client::new().get(url).send()?.bytes()?; let dataset = CsvReadOptions::default() .with_has_header(true) .with_schema_overwrite(Some(Arc::new(schema))) .map_parse_options(|parse_options| parse_options.with_try_parse_dates(true)) .into_reader_with_file_handle(Cursor::new(data)) .finish()? .lazy() .with_columns([ col("first").name().suffix("_name"), col("middle").name().suffix("_name"), col("last").name().suffix("_name"), ]) .collect()?; println!("{}", &dataset);` Basic aggregations ------------------ You can easily apply multiple expressions to your aggregated values. Simply list all of the expressions you want inside the function `agg`. There is no upper bound on the number of aggregations you can do and you can make any combination you want. In the snippet below we will group the data based on the column “first\_name” and then we will apply the following aggregations: * count the number of rows in the group (which means we count how many people in the data set have each unique first name); * combine the values of the column “gender” into a list by referring the column but omitting an aggregate function; and * get the first value of the column “last\_name” within the group. After computing the aggregations, we immediately sort the result and limit it to the top five rows so that we have a nice summary overview: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) ``q = ( dataset.lazy() .group_by("first_name") .agg( pl.len(), pl.col("gender"), pl.first("last_name"), # Short for `pl.col("last_name").first()` ) .sort("len", descending=True) .limit(5) ) df = q.collect() print(df)`` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) `let df = dataset .clone() .lazy() .group_by(["first_name"]) .agg([len(), col("gender"), col("last_name").first()]) .sort( ["len"], SortMultipleOptions::default() .with_order_descending(true) .with_nulls_last(true), ) .limit(5) .collect()?; println!("{df}");` `shape: (5, 4) ┌────────────┬──────┬───────────────────┬───────────┐ │ first_name ┆ len ┆ gender ┆ last_name │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ u32 ┆ list[cat] ┆ str │ ╞════════════╪══════╪═══════════════════╪═══════════╡ │ John ┆ 4227 ┆ ["M", "M", … "M"] ┆ Walker │ │ William ┆ 3309 ┆ ["M", "M", … "M"] ┆ Few │ │ James ┆ 2414 ┆ ["M", "M", … "M"] ┆ Armstrong │ │ Charles ┆ 1514 ┆ ["M", "M", … "M"] ┆ Carroll │ │ Thomas ┆ 1502 ┆ ["M", "M", … "M"] ┆ Tucker │ └────────────┴──────┴───────────────────┴───────────┘` It's that easy! Let's turn it up a notch. Conditionals ------------ Let's say we want to know how many delegates of a state are “Pro” or “Anti” administration. We can query that directly in the aggregation without the need for a `lambda` or grooming the dataframe: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) `q = ( dataset.lazy() .group_by("state") .agg( (pl.col("party") == "Anti-Administration").sum().alias("anti"), (pl.col("party") == "Pro-Administration").sum().alias("pro"), ) .sort("pro", descending=True) .limit(5) ) df = q.collect() print(df)` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) `let df = dataset .clone() .lazy() .group_by(["state"]) .agg([ (col("party").eq(lit("Anti-Administration"))) .sum() .alias("anti"), (col("party").eq(lit("Pro-Administration"))) .sum() .alias("pro"), ]) .sort( ["pro"], SortMultipleOptions::default().with_order_descending(true), ) .limit(5) .collect()?; println!("{df}");` `shape: (5, 3) ┌───────┬──────┬─────┐ │ state ┆ anti ┆ pro │ │ --- ┆ --- ┆ --- │ │ cat ┆ u32 ┆ u32 │ ╞═══════╪══════╪═════╡ │ CT ┆ 0 ┆ 5 │ │ NJ ┆ 0 ┆ 3 │ │ DE ┆ 1 ┆ 3 │ │ MA ┆ 0 ┆ 2 │ │ MD ┆ 0 ┆ 2 │ └───────┴──────┴─────┘` Filtering --------- We can also filter the groups. Let's say we want to compute a mean per group, but we don't want to include all values from that group, and we also don't want to actually filter the rows from the dataframe because we need those rows for another aggregation. In the example below we show how this can be done. Note Note that we can define Python functions for clarity. These functions don't cost us anything because they return Polars expressions, we don't apply a custom function over a series during runtime of the query. Of course, you can write functions that return expressions in Rust, too. Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) `from datetime import date def compute_age(): return date.today().year - pl.col("birthday").dt.year() def avg_age(gender: str) -> pl.Expr: return ( compute_age() .filter(pl.col("gender") == gender) .mean() .alias(f"avg {gender} age") ) q = ( dataset.lazy() .group_by("state") .agg( avg_age("M"), avg_age("F"), (pl.col("gender") == "M").sum().alias("# male"), (pl.col("gender") == "F").sum().alias("# female"), ) .limit(5) ) df = q.collect() print(df)` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) `fn compute_age() -> Expr { lit(2024) - col("birthday").dt().year() } fn avg_birthday(gender: &str) -> Expr { compute_age() .filter(col("gender").eq(lit(gender))) .mean() .alias(format!("avg {gender} birthday")) } let df = dataset .clone() .lazy() .group_by(["state"]) .agg([ avg_birthday("M"), avg_birthday("F"), (col("gender").eq(lit("M"))).sum().alias("# male"), (col("gender").eq(lit("F"))).sum().alias("# female"), ]) .limit(5) .collect()?; println!("{df}");` `shape: (5, 5) ┌───────┬────────────┬───────────┬────────┬──────────┐ │ state ┆ avg M age ┆ avg F age ┆ # male ┆ # female │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ cat ┆ f64 ┆ f64 ┆ u32 ┆ u32 │ ╞═══════╪════════════╪═══════════╪════════╪══════════╡ │ AR ┆ 147.384454 ┆ 118.25 ┆ 484 ┆ 12 │ │ ID ┆ 134.163522 ┆ 108.0 ┆ 159 ┆ 8 │ │ SD ┆ 136.383648 ┆ 71.7 ┆ 159 ┆ 10 │ │ IA ┆ 151.072109 ┆ 53.333333 ┆ 737 ┆ 3 │ │ PI ┆ 149.219512 ┆ null ┆ 41 ┆ 0 │ └───────┴────────────┴───────────┴────────┴──────────┘` Do the average age values look nonsensical? That's because we are working with historical data that dates back to the 1800s and we are doing our computations assuming everyone represented in the dataset is still alive and kicking. Nested grouping --------------- The two previous queries could have been done with a nested `group_by`, but that wouldn't have let us show off some of these features. 😉 To do a nested `group_by`, simply list the columns that will be used for grouping. First, we use a nested `group_by` to figure out how many delegates of a state are “Pro” or “Anti” administration: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) `q = ( dataset.lazy() .group_by("state", "party") .agg(pl.len().alias("count")) .filter( (pl.col("party") == "Anti-Administration") | (pl.col("party") == "Pro-Administration") ) .sort("count", descending=True) .limit(5) ) df = q.collect() print(df)` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) `let df = dataset .clone() .lazy() .group_by(["state", "party"]) .agg([len().alias("count")]) .filter( col("party") .eq(lit("Anti-Administration")) .or(col("party").eq(lit("Pro-Administration"))), ) .sort( ["count"], SortMultipleOptions::default() .with_order_descending(true) .with_nulls_last(true), ) .limit(5) .collect()?; println!("{df}");` `shape: (5, 3) ┌───────┬─────────────────────┬───────┐ │ state ┆ party ┆ count │ │ --- ┆ --- ┆ --- │ │ cat ┆ cat ┆ u32 │ ╞═══════╪═════════════════════╪═══════╡ │ CT ┆ Pro-Administration ┆ 5 │ │ VA ┆ Anti-Administration ┆ 5 │ │ NJ ┆ Pro-Administration ┆ 3 │ │ PA ┆ Anti-Administration ┆ 3 │ │ DE ┆ Pro-Administration ┆ 3 │ └───────┴─────────────────────┴───────┘` Next, we use a nested `group_by` to compute the average age of delegates per state and per gender: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) ``q = ( dataset.lazy() .group_by("state", "gender") .agg( # The function `avg_age` is not needed: compute_age().mean().alias("avg age"), pl.len().alias("#"), ) .sort("#", descending=True) .limit(5) ) df = q.collect() print(df)`` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) `let df = dataset .clone() .lazy() .group_by(["state", "gender"]) .agg([compute_age().mean().alias("avg birthday"), len().alias("#")]) .sort( ["#"], SortMultipleOptions::default() .with_order_descending(true) .with_nulls_last(true), ) .limit(5) .collect()?; println!("{df}");` `shape: (5, 4) ┌───────┬────────┬────────────┬──────┐ │ state ┆ gender ┆ avg age ┆ # │ │ --- ┆ --- ┆ --- ┆ --- │ │ cat ┆ cat ┆ f64 ┆ u32 │ ╞═══════╪════════╪════════════╪══════╡ │ NY ┆ M ┆ 165.204634 ┆ 3965 │ │ PA ┆ M ┆ 167.008592 ┆ 3205 │ │ OH ┆ M ┆ 157.579961 ┆ 2142 │ │ IL ┆ M ┆ 146.069482 ┆ 1895 │ │ CA ┆ M ┆ 115.400464 ┆ 1725 │ └───────┴────────┴────────────┴──────┘` Note that we get the same results but the format of the data is different. Depending on the situation, one format may be more suitable than the other. Sorting ------- It is common to see a dataframe being sorted for the sole purpose of managing the ordering during a grouping operation. Let's say that we want to get the names of the oldest and youngest politicians per state. We could start by sorting and then grouping: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) `def get_name() -> pl.Expr: return pl.col("first_name") + pl.lit(" ") + pl.col("last_name") q = ( dataset.lazy() .sort("birthday", descending=True) .group_by("state") .agg( get_name().first().alias("youngest"), get_name().last().alias("oldest"), ) .limit(5) ) df = q.collect() print(df)` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) `fn get_name() -> Expr { col("first_name") + lit(" ") + col("last_name") } let df = dataset .clone() .lazy() .sort( ["birthday"], SortMultipleOptions::default() .with_order_descending(true) .with_nulls_last(true), ) .group_by(["state"]) .agg([ get_name().first().alias("youngest"), get_name().last().alias("oldest"), ]) .limit(5) .collect()?; println!("{df}");` `shape: (5, 3) ┌───────┬───────────────────┬───────────────────┐ │ state ┆ youngest ┆ oldest │ │ --- ┆ --- ┆ --- │ │ cat ┆ str ┆ str │ ╞═══════╪═══════════════════╪═══════════════════╡ │ VA ┆ William Grayson ┆ Robert Rutherford │ │ PA ┆ Thomas Fitzsimons ┆ Israel Jacobs │ │ NH ┆ John Sherburne ┆ Samuel Livermore │ │ KY ┆ John Edwards ┆ Matthew Lyon │ │ MS ┆ Narsworthy Hunter ┆ Thomas Greene │ └───────┴───────────────────┴───────────────────┘` However, if we also want to sort the names alphabetically, we need to perform an extra sort operation. Luckily, we can sort in a `group_by` context without changing the sorting of the underlying dataframe: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) `q = ( dataset.lazy() .sort("birthday", descending=True) .group_by("state") .agg( get_name().first().alias("youngest"), get_name().last().alias("oldest"), get_name().sort().first().alias("alphabetical_first"), ) .limit(5) ) df = q.collect() print(df)` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) `let df = dataset .clone() .lazy() .sort( ["birthday"], SortMultipleOptions::default() .with_order_descending(true) .with_nulls_last(true), ) .group_by(["state"]) .agg([ get_name().first().alias("youngest"), get_name().last().alias("oldest"), get_name() .sort(Default::default()) .first() .alias("alphabetical_first"), ]) .limit(5) .collect()?; println!("{df}");` `shape: (5, 4) ┌───────┬────────────────┬─────────────────┬────────────────────┐ │ state ┆ youngest ┆ oldest ┆ alphabetical_first │ │ --- ┆ --- ┆ --- ┆ --- │ │ cat ┆ str ┆ str ┆ str │ ╞═══════╪════════════════╪═════════════════╪════════════════════╡ │ MI ┆ Edward Bradley ┆ Gabriel Richard ┆ Aaron Bliss │ │ ID ┆ Raúl Labrador ┆ William Wallace ┆ Abe Goff │ │ CT ┆ Henry Edwards ┆ Roger Sherman ┆ Abner Sibal │ │ OR ┆ George Shiel ┆ Joseph Lane ┆ Abraham Lafferty │ │ AL ┆ John McKee ┆ Israel Pickens ┆ Albert Goodwyn │ └───────┴────────────────┴─────────────────┴────────────────────┘` We can even sort a column with the order induced by another column, and this also works inside the context `group_by`. This modification to the previous query lets us check if the delegate with the first name is male or female: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) `q = ( dataset.lazy() .sort("birthday", descending=True) .group_by("state") .agg( get_name().first().alias("youngest"), get_name().last().alias("oldest"), get_name().sort().first().alias("alphabetical_first"), pl.col("gender").sort_by(get_name()).first(), ) .sort("state") .limit(5) ) df = q.collect() print(df)` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) `let df = dataset .lazy() .sort( ["birthday"], SortMultipleOptions::default() .with_order_descending(true) .with_nulls_last(true), ) .group_by(["state"]) .agg([ get_name().first().alias("youngest"), get_name().last().alias("oldest"), get_name() .sort(Default::default()) .first() .alias("alphabetical_first"), col("gender") .sort_by(["first_name"], SortMultipleOptions::default()) .first(), ]) .sort(["state"], SortMultipleOptions::default()) .limit(5) .collect()?; println!("{df}");` `shape: (5, 5) ┌───────┬──────────────────┬────────────────┬────────────────────┬────────┐ │ state ┆ youngest ┆ oldest ┆ alphabetical_first ┆ gender │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ cat ┆ str ┆ str ┆ str ┆ cat │ ╞═══════╪══════════════════╪════════════════╪════════════════════╪════════╡ │ AK ┆ Mary Peltola ┆ Thomas Cale ┆ Anthony Dimond ┆ M │ │ AL ┆ John McKee ┆ Israel Pickens ┆ Albert Goodwyn ┆ M │ │ AR ┆ Archibald Yell ┆ James Bates ┆ Albert Rust ┆ M │ │ AS ┆ Eni Faleomavaega ┆ Fofó Sunia ┆ Eni Faleomavaega ┆ M │ │ AZ ┆ Ben Quayle ┆ Coles Bashford ┆ Ann Kirkpatrick ┆ F │ └───────┴──────────────────┴────────────────┴────────────────────┴────────┘` Do not kill parallelization --------------------------- Python users only The following section is specific to Python, and doesn't apply to Rust. Within Rust, blocks and closures (lambdas) can, and will, be executed concurrently. Python is generally slower than Rust. Besides the overhead of running “slow” bytecode, Python has to remain within the constraints of the Global Interpreter Lock (GIL). This means that if you were to use a `lambda` or a custom Python function to apply during a parallelized phase, Polars' speed is capped running Python code, preventing any multiple threads from executing the function. Polars will try to parallelize the computation of the aggregating functions over the groups, so it is recommended that you avoid using `lambda`s and custom Python functions as much as possible. Instead, try to stay within the realm of the Polars expression API. This is not always possible, though, so if you want to learn more about using `lambda`s you can go [the user guide section on using user-defined functions](https://docs.pola.rs/user-guide/expressions/user-defined-python-functions/) . --- # Parquet - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/parquet/#parquet) Parquet ======= Loading or writing [`Parquet` files](https://parquet.apache.org/) is lightning fast as the layout of data in a Polars `DataFrame` in memory mirrors the layout of a Parquet file on disk in many respects. Unlike CSV, Parquet is a columnar format. This means that the data is stored in columns rather than rows. This is a more efficient way of storing data as it allows for better compression and faster access to data. Read ---- We can read a `Parquet` file into a `DataFrame` using the `read_parquet` function: Python Rust [`read_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_parquet.html) `df = pl.read_parquet("docs/assets/data/path.parquet")` [`ParquetReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetReader.html) · [Available on feature parquet](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag parquet") `let mut file = std::fs::File::open("docs/assets/data/path.parquet").unwrap(); let df = ParquetReader::new(&mut file).finish().unwrap();` Write ----- Python Rust [`write_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_parquet.html) `df = pl.DataFrame({"foo": [1, 2, 3], "bar": [None, "bak", "baz"]}) df.write_parquet("docs/assets/data/path.parquet")` [`ParquetWriter`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetWriter.html) · [Available on feature parquet](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag parquet") `let mut df = df!( "foo" => &[1, 2, 3], "bar" => &[None, Some("bak"), Some("baz")], ) .unwrap(); let mut file = std::fs::File::create("docs/assets/data/path.parquet").unwrap(); ParquetWriter::new(&mut file).finish(&mut df).unwrap();` Scan ---- Polars allows you to _scan_ a `Parquet` input. Scanning delays the actual parsing of the file and instead returns a lazy computation holder called a `LazyFrame`. Python Rust [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) `df = pl.scan_parquet("docs/assets/data/path.parquet")` [`scan_parquet`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html#method.scan_parquet) · [Available on feature parquet](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag parquet") `let args = ScanArgsParquet::default(); let lf = LazyFrame::scan_parquet(PlRefPath::new("docs/assets/data/path.parquet"), args).unwrap();` If you want to know why this is desirable, you can read more about those Polars optimizations [here](https://docs.pola.rs/user-guide/concepts/lazy-api/) . When we scan a `Parquet` file stored in the cloud, we can also apply predicate and projection pushdowns. This can significantly reduce the amount of data that needs to be downloaded. For scanning a Parquet file in the cloud, see [Cloud storage](https://docs.pola.rs/user-guide/io/cloud-storage/#scanning-from-cloud-storage-with-query-optimisation) . --- # Generating Polars code with LLMs - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/misc/polars_llms/#generating-polars-code-with-llms) Generating Polars code with LLMs ================================ Large Language Models (LLMs) can sometimes return pandas code or invalid Polars code in their output. This guide presents approaches that help LLMs generate valid Polars code more consistently. These approaches have been developed by the Polars community through testing model responses to various inputs. If you find additional effective approaches for generating Polars code from LLMs, please raise a [pull request](https://github.com/pola-rs/polars/pulls) . Polars MCP server ----------------- The new remote Model Context Protocol (MCP) server for Polars provides access to the latest version of the official Polars and Polars Cloud documentation. The server enables LLMs to query the user guide and API references directly, making it easier to get more accurate answers about DataFrame operations, expressions, lazy evaluation, and cloud deployments. The MCP server delivers up-to-date documentation to help you rewrite existing queries from other libraries to Polars or work with Polars more efficiently. `{ "mcpServers": { "ask_polars": { "command": "npx", "args": ["mcp-remote", "https://mcp.polars.workers.dev/sse"] } } }` If you run into an issue or are missing a feature, please [open an issue](https://github.com/pola-rs/polars/issues) on the public issue tracker. We plan to expand the capabilities over time. MCP server installation Please refer to the documentation of your preferred client to connect to the MCP server. System prompt ------------- Many LLMs allow you to provide a system prompt that is included with every individual prompt you send to the model. In the system prompt, you can specify your preferred defaults, such as "Use Polars as the default dataframe library". Including such a system prompt typically leads to models consistently generating Polars code rather than Pandas code. You can set this system prompt in the settings menu of both web-based LLMs like ChatGPT and IDE-based LLMs like Cursor. Refer to each application's documentation for specific instructions. Enable web search ----------------- Some LLMs can search the web to access information beyond their pre-training data. Enabling web search allows an LLM to reference up-to-date Polars documentation for the current API. Some IDE-based LLMs can index the Polars API documentation and reference this when generating code. For example, in Cursor you can add Polars as a custom docs source and instruct the agent to reference the Polars documentation in a prompt. However, web search does not yet guarantee that valid code will be produced. If a model is confident in a result based on its pre-training data, it may not incorporate web search results in its output. The Polars API pages also have AI-enabled search to help you find the information you need more easily. Provide examples ---------------- You can guide LLMs to use correct syntax by including relevant examples in your prompt. For instance, this basic query: `df = pl.DataFrame({ "id": ["a", "b", "a", "b", "c"], "score": [1, 2, 1, 3, 3], "year": [2020, 2020, 2021, 2021, 2021], }) # Compute average of score by id` Often results in outdated `groupby` syntax instead of the correct `group_by`. However, including a simple example from the Polars `group_by` documentation (preferably with web search enabled) like this: `df = pl.DataFrame({ "id": ["a", "b", "a", "b", "c"], "score": [1, 2, 1, 3, 3], "year": [2020, 2020, 2021, 2021, 2021], }) # Compute average of score by id # Examples of Polars code: # df.group_by("a").agg(pl.col("b").mean())` Produces valid outputs more often. This approach has been validated across several leading models. The combination of web search and examples is more effective than either independently. Model outputs indicate that when an example contradicts the model's pre-trained expectations, it seems more likely to trigger a web search for verification. Additionally, explicit instructions like "use `group_by` instead of `groupby`" can be effective in guiding the model to use correct syntax. Common examples such as `df.group_by("a").agg(pl.col("b").mean())` can also be added the system prompt for more consistency. --- # Coming from Apache Spark - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/migration/spark/#coming-from-apache-spark) Coming from Apache Spark ======================== Column-based API vs. Row-based API ---------------------------------- Whereas the `Spark` `DataFrame` is analogous to a collection of rows, a Polars `DataFrame` is closer to a collection of columns. This means that you can combine columns in Polars in ways that are not possible in `Spark`, because `Spark` preserves the relationship of the data in each row. Consider this sample dataset: `import polars as pl df = pl.DataFrame({ "foo": ["a", "b", "c", "d", "d"], "bar": [1, 2, 3, 4, 5], }) dfs = spark.createDataFrame( [ ("a", 1), ("b", 2), ("c", 3), ("d", 4), ("d", 5), ], schema=["foo", "bar"], )` ### Example 1: Combining `head` and `sum` In Polars you can write something like this: `df.select( pl.col("foo").sort().head(2), pl.col("bar").filter(pl.col("foo") == "d").sum() )` Output: `shape: (2, 2) ┌─────┬─────┐ │ foo ┆ bar │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪═════╡ │ a ┆ 9 │ ├╌╌╌╌╌┼╌╌╌╌╌┤ │ b ┆ 9 │ └─────┴─────┘` The expressions on columns `foo` and `bar` are completely independent. Since the expression on `bar` returns a single value, that value is repeated for each value output by the expression on `foo`. But `a` and `b` have no relation to the data that produced the sum of `9`. To do something similar in `Spark`, you'd need to compute the sum separately and provide it as a literal: `from pyspark.sql.functions import col, sum, lit bar_sum = ( dfs .where(col("foo") == "d") .groupBy() .agg(sum(col("bar"))) .take(1)[0][0] ) ( dfs .orderBy("foo") .limit(2) .withColumn("bar", lit(bar_sum)) .show() )` Output: `+---+---+ |foo|bar| +---+---+ | a| 9| | b| 9| +---+---+` ### Example 2: Combining Two `head`s In Polars you can combine two different `head` expressions on the same DataFrame, provided that they return the same number of values. `df.select( pl.col("foo").sort().head(2), pl.col("bar").sort(descending=True).head(2), )` Output: `shape: (3, 2) ┌─────┬─────┐ │ foo ┆ bar │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪═════╡ │ a ┆ 5 │ ├╌╌╌╌╌┼╌╌╌╌╌┤ │ b ┆ 4 │ └─────┴─────┘` Again, the two `head` expressions here are completely independent, and the pairing of `a` to `5` and `b` to `4` results purely from the juxtaposition of the two columns output by the expressions. To accomplish something similar in `Spark`, you would need to generate an artificial key that enables you to join the values in this way. `from pyspark.sql import Window from pyspark.sql.functions import row_number foo_dfs = ( dfs .withColumn( "rownum", row_number().over(Window.orderBy("foo")) ) ) bar_dfs = ( dfs .withColumn( "rownum", row_number().over(Window.orderBy(col("bar").desc())) ) ) ( foo_dfs.alias("foo") .join(bar_dfs.alias("bar"), on="rownum") .select("foo.foo", "bar.bar") .limit(2) .show() )` Output: `+---+---+ |foo|bar| +---+---+ | a| 5| | b| 4| +---+---+` ### Example 3: Composing expressions Polars allows you compose expressions quite liberally. For example, if you want to find the rolling mean of a lagged variable, you can compose `shift` and `rolling_mean` and evaluate them in a single `over` expression: `df.with_columns( feature=pl.col('price').shift(7).rolling_mean(7).over('store', order_by='date') )` In PySpark however this is not allowed. They allow composing expressions such as `F.mean(F.abs("price")).over(window)` because `F.abs` is an elementwise function, but not `F.mean(F.lag("price", 1)).over(window)` because `F.lag` is a window function. To produce the same result, both `F.lag` and `F.mean` need their own window. `from pyspark.sql import Window from pyspark.sql import functions as F window = Window().partitionBy("store").orderBy("date") rolling_window = window.rowsBetween(-6, 0) ( df.withColumn("lagged_price", F.lag("price", 7).over(window)).withColumn( "feature", F.when( F.count("lagged_price").over(rolling_window) >= 7, F.mean("lagged_price").over(rolling_window), ), ) )` --- # Missing data - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/missing-data/#missing-data) Missing data ============ This section of the user guide teaches how to work with missing data in Polars. `null` and `NaN` values ----------------------- In Polars, missing data is represented by the value `null`. This missing value `null` is used for all data types, including numerical types. Polars also supports the value `NaN` (“Not a Number”) for columns with floating point numbers. The value `NaN` is considered to be a valid floating point value, which is different from missing data. [We discuss the value `NaN` separately below](https://docs.pola.rs/user-guide/expressions/missing-data/#not-a-number-or-nan-values) . When creating a series or a dataframe, you can set a value to `null` by using the appropriate construct for your language: Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) `import polars as pl df = pl.DataFrame( { "value": [1, None], }, ) print(df)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) `use polars::prelude::*; let df = df! ( "value" => &[Some(1), None], )?; println!("{df}");` `shape: (2, 1) ┌───────┐ │ value │ │ --- │ │ i64 │ ╞═══════╡ │ 1 │ │ null │ └───────┘` Difference from pandas In pandas, the value used to represent missing data depends on the data type of the column. In Polars, missing data is always represented by the value `null`. Missing data metadata --------------------- Polars keeps track of some metadata regarding the missing data of each series. This metadata allows Polars to answer some basic queries about missing values in a very efficient way, namely how many values are missing and which ones are missing. To determine how many values are missing from a column you can use the function `null_count`: Python Rust [`null_count`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.null_count.html) `null_count_df = df.null_count() print(null_count_df)` [`null_count`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.null_count) `let null_count_df = df.null_count(); println!("{null_count_df}");` `shape: (1, 1) ┌───────┐ │ value │ │ --- │ │ u32 │ ╞═══════╡ │ 1 │ └───────┘` The function `null_count` can be called on a dataframe, a column from a dataframe, or on a series directly. The function `null_count` is a cheap operation because the result is already known. Polars uses something called a “validity bitmap” to know which values are missing in a series. The validity bitmap is memory efficient as it is bit encoded. If a series has length \\(n\\), then its validity bitmap will cost \\(n / 8\\) bytes. The function `is_null` uses the validity bitmap to efficiently report which values are `null` and which are not: Python Rust [`is_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_null.html) `is_null_series = df.select( pl.col("value").is_null(), ) print(is_null_series)` [`is_null`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html#method.is_null) `let is_null_series = df.lazy().select([col("value").is_null()]).collect()?; println!("{is_null_series}");` `shape: (2, 1) ┌───────┐ │ value │ │ --- │ │ bool │ ╞═══════╡ │ false │ │ true │ └───────┘` The function `is_null` can be used on a column of a dataframe or on a series directly. Again, this is a cheap operation because the result is already known by Polars. Why does Polars waste memory on a validity bitmap? It all comes down to a tradeoff. By using a bit more memory per column, Polars can be much more efficient when performing most operations on your columns. If the validity bitmap wasn't known, every time you wanted to compute something you would have to check each position of the series to see if a legal value was present or not. With the validity bitmap, Polars knows automatically the positions where your operations can be applied. Filling missing data -------------------- Missing data in a series can be filled with the function `fill_null`. You can specify how missing data is effectively filled in a couple of different ways: * a literal of the correct data type; * a Polars expression, such as replacing with values computed from another column; * a strategy based on neighbouring values, such as filling forwards or backwards; and * interpolation. To illustrate how each of these methods work we start by defining a simple dataframe with two missing values in the second column: Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) `df = pl.DataFrame( { "col1": [0.5, 1, 1.5, 2, 2.5], "col2": [1, None, 3, None, 5], }, ) print(df)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) `let df = df! ( "col1" => [0.5, 1.0, 1.5, 2.0, 2.5], "col2" => [Some(1), None, Some(3), None, Some(5)], )?; println!("{df}");` `shape: (5, 2) ┌──────┬──────┐ │ col1 ┆ col2 │ │ --- ┆ --- │ │ f64 ┆ i64 │ ╞══════╪══════╡ │ 0.5 ┆ 1 │ │ 1.0 ┆ null │ │ 1.5 ┆ 3 │ │ 2.0 ┆ null │ │ 2.5 ┆ 5 │ └──────┴──────┘` ### Fill with a specified literal value You can fill the missing data with a specified literal value. This literal value will replace all of the occurrences of the value `null`: Python Rust [`fill_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_null.html) `fill_literal_df = df.with_columns( pl.col("col2").fill_null(3), ) print(fill_literal_df)` [`fill_null`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.fill_null) `let fill_literal_df = df .clone() .lazy() .with_column(col("col2").fill_null(3)) .collect()?; println!("{fill_literal_df}");` `shape: (5, 2) ┌──────┬──────┐ │ col1 ┆ col2 │ │ --- ┆ --- │ │ f64 ┆ i64 │ ╞══════╪══════╡ │ 0.5 ┆ 1 │ │ 1.0 ┆ 3 │ │ 1.5 ┆ 3 │ │ 2.0 ┆ 3 │ │ 2.5 ┆ 5 │ └──────┴──────┘` However, this is actually just a special case of the general case where [the function `fill_null` replaces missing values with the corresponding values from the result of a Polars expression](https://docs.pola.rs/user-guide/expressions/missing-data/#fill-with-a-strategy-based-on-neighbouring-values) , as seen next. ### Fill with an expression In the general case, the missing data can be filled by extracting the corresponding values from the result of a general Polars expression. For example, we can fill the second column with values taken from the double of the first column: Python Rust [`fill_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_null.html) `fill_expression_df = df.with_columns( pl.col("col2").fill_null((2 * pl.col("col1")).cast(pl.Int64)), ) print(fill_expression_df)` [`fill_null`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.fill_null) `let fill_expression_df = df .clone() .lazy() .with_column(col("col2").fill_null((lit(2) * col("col1")).cast(DataType::Int64))) .collect()?; println!("{fill_expression_df}");` `shape: (5, 2) ┌──────┬──────┐ │ col1 ┆ col2 │ │ --- ┆ --- │ │ f64 ┆ i64 │ ╞══════╪══════╡ │ 0.5 ┆ 1 │ │ 1.0 ┆ 2 │ │ 1.5 ┆ 3 │ │ 2.0 ┆ 4 │ │ 2.5 ┆ 5 │ └──────┴──────┘` ### Fill with a strategy based on neighbouring values You can also fill the missing data by following a fill strategy based on the neighbouring values. The two simpler strategies look for the first non-`null` value that comes immediately before or immediately after the value `null` that is being filled: Python Rust [`fill_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_null.html) `fill_forward_df = df.with_columns( pl.col("col2").fill_null(strategy="forward").alias("forward"), pl.col("col2").fill_null(strategy="backward").alias("backward"), ) print(fill_forward_df)` [`fill_null`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.fill_null) `let fill_literal_df = df .clone() .lazy() .with_columns([ col("col2") .fill_null_with_strategy(FillNullStrategy::Forward(None)) .alias("forward"), col("col2") .fill_null_with_strategy(FillNullStrategy::Backward(None)) .alias("backward"), ]) .collect()?; println!("{fill_literal_df}");` `shape: (5, 4) ┌──────┬──────┬─────────┬──────────┐ │ col1 ┆ col2 ┆ forward ┆ backward │ │ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ i64 ┆ i64 ┆ i64 │ ╞══════╪══════╪═════════╪══════════╡ │ 0.5 ┆ 1 ┆ 1 ┆ 1 │ │ 1.0 ┆ null ┆ 1 ┆ 3 │ │ 1.5 ┆ 3 ┆ 3 ┆ 3 │ │ 2.0 ┆ null ┆ 3 ┆ 5 │ │ 2.5 ┆ 5 ┆ 5 ┆ 5 │ └──────┴──────┴─────────┴──────────┘` You can find other fill strategies in the API docs. ### Fill with interpolation Additionally, you can fill intermediate missing data with interpolation by using the function `interpolate` instead of the function `fill_null`: Python Rust [`interpolate`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.interpolate.html) `fill_interpolation_df = df.with_columns( pl.col("col2").interpolate(), ) print(fill_interpolation_df)` [`interpolate`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.interpolate) `let fill_interpolation_df = df .lazy() .with_column(col("col2").interpolate(InterpolationMethod::Linear)) .collect()?; println!("{fill_interpolation_df}");` `shape: (5, 2) ┌──────┬──────┐ │ col1 ┆ col2 │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞══════╪══════╡ │ 0.5 ┆ 1.0 │ │ 1.0 ┆ 2.0 │ │ 1.5 ┆ 3.0 │ │ 2.0 ┆ 4.0 │ │ 2.5 ┆ 5.0 │ └──────┴──────┘` Note: With interpolate, nulls at the beginning and end of the series remain null. Not a Number, or `NaN` values ----------------------------- Missing data in a series is only ever represented by the value `null`, regardless of the data type of the series. Columns with a floating point data type can sometimes have the value `NaN`, which might be confused with `null`. The special value `NaN` can be created directly: Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) `import numpy as np nan_df = pl.DataFrame( { "value": [1.0, np.nan, float("nan"), 3.0], }, ) print(nan_df)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) `let nan_df = df!( "value" => [1.0, f64::NAN, f64::NAN, 3.0], )?; println!("{nan_df}");` `shape: (4, 1) ┌───────┐ │ value │ │ --- │ │ f64 │ ╞═══════╡ │ 1.0 │ │ NaN │ │ NaN │ │ 3.0 │ └───────┘` And it might also arise as the result of a computation: Python Rust `df = pl.DataFrame( { "dividend": [1, 0, -1], "divisor": [1, 0, -1], } ) result = df.select(pl.col("dividend") / pl.col("divisor")) print(result)` `let df = df!( "dividend" => [1.0, 0.0, -1.0], "divisor" => [1.0, 0.0, -1.0], )?; let result = df .lazy() .select([col("dividend") / col("divisor")]) .collect()?; println!("{result}");` `shape: (3, 1) ┌──────────┐ │ dividend │ │ --- │ │ f64 │ ╞══════════╡ │ 1.0 │ │ NaN │ │ 1.0 │ └──────────┘` Info By default, a `NaN` value in an integer column causes the column to be cast to a float data type in pandas. This does not happen in Polars; instead, an exception is raised. `NaN` values are considered to be a type of floating point data and are **not considered to be missing data** in Polars. This means: * `NaN` values are **not** counted with the function `null_count`; and * `NaN` values are filled when you use the specialised function `fill_nan` method but are **not** filled with the function `fill_null`. Polars has the functions `is_nan` and `fill_nan`, which work in a similar way to the functions `is_null` and `fill_null`. Unlike with missing data, Polars does not hold any metadata regarding the `NaN` values, so the function `is_nan` entails actual computation. One further difference between the values `null` and `NaN` is that numerical aggregating functions, like `mean` and `sum`, skip the missing values when computing the result, whereas the value `NaN` is considered for the computation and typically propagates into the result. If desirable, this behavior can be avoided by replacing the occurrences of the value `NaN` with the value `null`: Python Rust [`fill_nan`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_nan.html) `mean_nan_df = nan_df.with_columns( pl.col("value").fill_nan(None).alias("replaced"), ).select( pl.all().mean().name.suffix("_mean"), pl.all().sum().name.suffix("_sum"), ) print(mean_nan_df)` [`fill_nan`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.fill_nan) `let mean_nan_df = nan_df .lazy() .with_column(col("value").fill_nan(Null {}.lit()).alias("replaced")) .select([ col("*").mean().name().suffix("_mean"), col("*").sum().name().suffix("_sum"), ]) .collect()?; println!("{mean_nan_df}");` `shape: (1, 4) ┌────────────┬───────────────┬───────────┬──────────────┐ │ value_mean ┆ replaced_mean ┆ value_sum ┆ replaced_sum │ │ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 ┆ f64 │ ╞════════════╪═══════════════╪═══════════╪══════════════╡ │ NaN ┆ 2.0 ┆ NaN ┆ 4.0 │ └────────────┴───────────────┴───────────┴──────────────┘` You can learn more about the value `NaN` in [the section about floating point number data types](https://docs.pola.rs/user-guide/concepts/data-types-and-structures/#floating-point-numbers) . --- # Plugins - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/plugins/#plugins) Plugins ======= Polars allows you to extend its functionality with either Expression plugins or IO plugins. * [Expression plugins](https://docs.pola.rs/user-guide/plugins/expr_plugins/) * [IO plugins](https://docs.pola.rs/user-guide/plugins/io_plugins/) Community plugins ----------------- Here is a curated (non-exhaustive) list of community-implemented plugins. ### Various * [polars-xdt](https://github.com/pola-rs/polars-xdt) Polars plugin with extra datetime-related functionality which isn't quite in-scope for the main library * [polars-hash](https://github.com/ion-elgreco/polars-hash) Stable non-cryptographic and cryptographic hashing functions for Polars ### Data science * [polars-distance](https://github.com/ion-elgreco/polars-distance) Polars plugin for pairwise distance functions * [polars-ds](https://github.com/abstractqqq/polars_ds_extension) Polars extension aiming to simplify common numerical/string data analysis procedures ### Geo * [polars-st](https://github.com/Oreilles/polars-st) Polars ST provides spatial operations on Polars DataFrames, Series and Expressions. Just like Shapely and Geopandas. * [polars-reverse-geocode](https://github.com/MarcoGorelli/polars-reverse-geocode) Offline reverse geocoder for finding the closest city to a given (latitude, longitude) pair. * [polars-h3](https://github.com/Filimoa/polars-h3) This is a Polars extension that adds support for the H3 discrete global grid system, so you can index points and geometries to hexagons directly in Polars. Other material -------------- * [Ritchie Vink - Keynote on Polars Plugins](https://youtu.be/jKW-CBV7NUM) * [Polars plugins tutorial](https://marcogorelli.github.io/polars-plugins-tutorial/) Learn how to write a plugin by going through some very simple and minimal examples * [cookiecutter-polars-plugin](https://github.com/MarcoGorelli/cookiecutter-polars-plugins) Project template for Polars Plugins --- # Common Table Expressions - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/sql/cte/#common-table-expressions) Common Table Expressions ======================== Common Table Expressions (CTEs) are a feature of SQL that allow you to define a temporary named result set that can be referenced within a SQL statement. CTEs provide a way to break down complex SQL queries into smaller, more manageable pieces, making them easier to read, write, and maintain. A CTE is defined using the `WITH` keyword followed by a comma-separated list of subqueries, each of which defines a named result set that can be used in subsequent queries. The syntax for a CTE is as follows: `WITH cte_name AS ( subquery ) SELECT ...` In this syntax, `cte_name` is the name of the CTE, and `subquery` is the subquery that defines the result set. The CTE can then be referenced in subsequent queries as if it were a table or view. CTEs are particularly useful when working with complex queries that involve multiple levels of subqueries, as they allow you to break down the query into smaller, more manageable pieces that are easier to understand and debug. Additionally, CTEs can help improve query performance by allowing the database to optimize and cache the results of subqueries, reducing the number of times they need to be executed. Polars supports Common Table Expressions (CTEs) using the WITH clause in SQL syntax. Below is an example Python [`register`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.register.html#polars.SQLContext.register) · [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `ctx = pl.SQLContext() df = pl.LazyFrame( {"name": ["Alice", "Bob", "Charlie", "David"], "age": [25, 30, 35, 40]} ) ctx.register("my_table", df) result = ctx.execute( """ WITH older_people AS ( SELECT * FROM my_table WHERE age > 30 ) SELECT * FROM older_people WHERE STARTS_WITH(name,'C') """, eager=True, ) print(result)` `shape: (1, 2) ┌─────────┬─────┐ │ name ┆ age │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════════╪═════╡ │ Charlie ┆ 35 │ └─────────┴─────┘` In this example, we use the `execute()` method of the `SQLContext` to execute a SQL query that includes a CTE. The CTE selects all rows from the `my_table` LazyFrame where the `age` column is greater than 30 and gives it the alias `older_people`. We then execute a second SQL query that selects all rows from the `older_people` CTE where the `name` column starts with the letter 'C'. --- # Comparison with other tools - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/misc/comparison/#comparison-with-other-tools) Comparison with other tools =========================== These are several libraries and tools that share similar functionalities with Polars. This often leads to questions from data experts about what the differences are. Below is a short comparison between some of the more popular data processing tools and Polars, to help data experts make a deliberate decision on which tool to use. You can find performance benchmarks (h2oai benchmark) of these tools here: [Polars blog post](https://pola.rs/posts/benchmarks/) or a more recent benchmark [done by DuckDB](https://duckdblabs.github.io/db-benchmark/) ### Pandas Pandas stands as a widely-adopted and comprehensive tool in Python data analysis, renowned for its rich feature set and strong community support. However, due to its single threaded nature, it can struggle with performance and memory usage on medium and large datasets. In contrast, Polars is optimised for high-performance multithreaded computing on single nodes, providing significant improvements in speed and memory efficiency, particularly for medium to large data operations. Its more composable and stricter API results in greater expressiveness and fewer schema-related bugs. ### Dask Dask extends Pandas' capabilities to large, distributed datasets. Dask mimics Pandas' API, offering a familiar environment for Pandas users, but with the added benefit of parallel and distributed computing. While Dask excels at scaling Pandas workflows across clusters, it only supports a subset of the Pandas API and therefore cannot be used for all use cases. Polars offers a more versatile API that delivers strong performance within the constraints of a single node. The choice between Dask and Polars often comes down to familiarity with the Pandas API and the need for distributed processing for extremely large datasets versus the need for efficiency and speed in a vertically scaled environment for a wide range of use cases. ### Modin Similar to Dask. In 2023, Snowflake acquired Ponder, the organisation that maintains Modin. ### Spark Spark (specifically PySpark) represents a different approach to large-scale data processing. While Polars has an optimised performance for single-node environments, Spark is designed for distributed data processing across clusters, making it suitable for extremely large datasets. However, Spark's distributed nature can introduce complexity and overhead, especially for small datasets and tasks that can run on a single machine. Another consideration is collaboration between data scientists and engineers. As they typically work with different tools (Pandas and Pyspark), refactoring is often required by engineers to deploy data scientists' data processing pipelines. Polars offers a single syntax that, due to vertical scaling, works in local environments and on a single machine in the cloud. The choice between Polars and Spark often depends on the scale of data and the specific requirements of the processing task. If you need to process TBs of data, Spark is a better choice. ### DuckDB Polars and DuckDB have many similarities. However, DuckDB is focused on providing an in-process SQL OLAP database management system, while Polars is focused on providing a scalable `DataFrame` interface to many languages. The different front-ends lead to different optimisation strategies and different algorithm prioritisation. The interoperability between both is zero-copy. DuckDB offers a guide on [how to integrate with Polars](https://duckdb.org/docs/guides/python/polars.html) . --- # Getting started - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/getting-started/#getting-started) Getting started =============== This chapter is here to help you get started with Polars. It covers all the fundamental features and functionalities of the library, making it easy for new users to familiarise themselves with the basics from initial installation and setup to core functionalities. If you're already an advanced user or familiar with dataframes, feel free to skip ahead to the [next chapter about installation options](https://docs.pola.rs/user-guide/installation/) . Installing Polars ----------------- Python Rust `pip install polars` `cargo add polars -F lazy # Or Cargo.toml [dependencies] polars = { version = "x", features = ["lazy", ...]}` Reading & writing ----------------- Polars supports reading and writing for common file formats (e.g., csv, json, parquet), cloud storage (S3, Azure Blob, BigQuery) and databases (e.g., postgres, mysql). Below, we create a small dataframe and show how to write it to disk and read it back. Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) `import polars as pl import datetime as dt df = pl.DataFrame( { "name": ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"], "birthdate": [ dt.date(1997, 1, 10), dt.date(1985, 2, 15), dt.date(1983, 3, 22), dt.date(1981, 4, 30), ], "weight": [57.9, 72.5, 53.6, 83.1], # (kg) "height": [1.56, 1.77, 1.65, 1.75], # (m) } ) print(df)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) `use chrono::prelude::*; use polars::prelude::*; let mut df: DataFrame = df!( "name" => ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"], "birthdate" => [ NaiveDate::from_ymd_opt(1997, 1, 10).unwrap(), NaiveDate::from_ymd_opt(1985, 2, 15).unwrap(), NaiveDate::from_ymd_opt(1983, 3, 22).unwrap(), NaiveDate::from_ymd_opt(1981, 4, 30).unwrap(), ], "weight" => [57.9, 72.5, 53.6, 83.1], // (kg) "height" => [1.56, 1.77, 1.65, 1.75], // (m) ) .unwrap(); println!("{df}");` `shape: (4, 4) ┌────────────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞════════════════╪════════════╪════════╪════════╡ │ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 │ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │ │ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 │ └────────────────┴────────────┴────────┴────────┘` In the example below we write the dataframe to a csv file called `output.csv`. After that, we read it back using `read_csv` and then print the result for inspection. Python Rust [`read_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html) · [`write_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_csv.html) `df.write_csv("docs/assets/data/output.csv") df_csv = pl.read_csv("docs/assets/data/output.csv", try_parse_dates=True) print(df_csv)` [`CsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReader.html) · [`CsvWriter`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvWriter.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") `use std::fs::File; let mut file = File::create("docs/assets/data/output.csv").expect("could not create file"); CsvWriter::new(&mut file) .include_header(true) .with_separator(b',') .finish(&mut df)?; let df_csv = CsvReadOptions::default() .with_has_header(true) .with_parse_options(CsvParseOptions::default().with_try_parse_dates(true)) .try_into_reader_with_file_path(Some("docs/assets/data/output.csv".into()))? .finish()?; println!("{df_csv}");` `shape: (4, 4) ┌────────────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞════════════════╪════════════╪════════╪════════╡ │ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 │ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │ │ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 │ └────────────────┴────────────┴────────┴────────┘` For more examples on the CSV file format and other data formats, see the [IO section](https://docs.pola.rs/user-guide/io/) of the user guide. Expressions and contexts ------------------------ _Expressions_ are one of the main strengths of Polars because they provide a modular and flexible way of expressing data transformations. Here is an example of a Polars expression: `pl.col("weight") / (pl.col("height") ** 2)` As you might be able to guess, this expression takes the column named “weight” and divides its values by the square of the values in the column “height”, computing a person's BMI. Note that the code above expresses an abstract computation: it's only inside a Polars _context_ that the expression materalizes into a series with the results. Below, we will show examples of Polars expressions inside different contexts: * `select` * `with_columns` * `filter` * `group_by` For a more [detailed exploration of expressions and contexts see the respective user guide section](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/) . ### `select` The context `select` allows you to select and manipulate columns from a dataframe. In the simplest case, each expression you provide will map to a column in the result dataframe: Python Rust [`select`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.select.html) · [`alias`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.alias.html) · [`dt namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/temporal.html) `result = df.select( pl.col("name"), pl.col("birthdate").dt.year().alias("birth_year"), (pl.col("weight") / (pl.col("height") ** 2)).alias("bmi"), ) print(result)` [`select`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.select) · [`alias`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.alias) · [`dt namespace`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/struct.DateLikeNameSpace.html) · [Available on feature temporal](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag temporal") `let result = df .clone() .lazy() .select([ col("name"), col("birthdate").dt().year().alias("birth_year"), (col("weight") / col("height").pow(2)).alias("bmi"), ]) .collect()?; println!("{result}");` `shape: (4, 3) ┌────────────────┬────────────┬───────────┐ │ name ┆ birth_year ┆ bmi │ │ --- ┆ --- ┆ --- │ │ str ┆ i32 ┆ f64 │ ╞════════════════╪════════════╪═══════════╡ │ Alice Archer ┆ 1997 ┆ 23.791913 │ │ Ben Brown ┆ 1985 ┆ 23.141498 │ │ Chloe Cooper ┆ 1983 ┆ 19.687787 │ │ Daniel Donovan ┆ 1981 ┆ 27.134694 │ └────────────────┴────────────┴───────────┘` Polars also supports a feature called “expression expansion”, in which one expression acts as shorthand for multiple expressions. In the example below, we use expression expansion to manipulate the columns “weight” and “height” with a single expression. When using expression expansion you can use `.name.suffix` to add a suffix to the names of the original columns: Python Rust [`select`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.select.html) · [`alias`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.alias.html) · [`name namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/name.html) `result = df.select( pl.col("name"), (pl.col("weight", "height") * 0.95).round(2).name.suffix("-5%"), ) print(result)` [`select`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.select) · [`alias`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.alias) · [`name namespace`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ExprNameNameSpace.html) · [Available on feature lazy](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag lazy") `let result = df .clone() .lazy() .select([ col("name"), (cols(["weight", "height"]).as_expr() * lit(0.95)) .round(2, RoundMode::default()) .name() .suffix("-5%"), ]) .collect()?; println!("{result}");` `shape: (4, 3) ┌────────────────┬───────────┬───────────┐ │ name ┆ weight-5% ┆ height-5% │ │ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ f64 │ ╞════════════════╪═══════════╪═══════════╡ │ Alice Archer ┆ 55.0 ┆ 1.48 │ │ Ben Brown ┆ 68.88 ┆ 1.68 │ │ Chloe Cooper ┆ 50.92 ┆ 1.57 │ │ Daniel Donovan ┆ 78.94 ┆ 1.66 │ └────────────────┴───────────┴───────────┘` You can check other sections of the user guide to learn more about [basic operations](https://docs.pola.rs/user-guide/expressions/basic-operations/) or [column selections in expression expansion](https://docs.pola.rs/user-guide/expressions/expression-expansion/) . ### `with_columns` The context `with_columns` is very similar to the context `select` but `with_columns` adds columns to the dataframe instead of selecting them. Notice how the resulting dataframe contains the four columns of the original dataframe plus the two new columns introduced by the expressions inside `with_columns`: Python Rust [`with_columns`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.with_columns.html) `result = df.with_columns( birth_year=pl.col("birthdate").dt.year(), bmi=pl.col("weight") / (pl.col("height") ** 2), ) print(result)` [`with_columns`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.with_columns) `let result = df .clone() .lazy() .with_columns([ col("birthdate").dt().year().alias("birth_year"), (col("weight") / col("height").pow(2)).alias("bmi"), ]) .collect()?; println!("{result}");` `shape: (4, 6) ┌────────────────┬────────────┬────────┬────────┬────────────┬───────────┐ │ name ┆ birthdate ┆ weight ┆ height ┆ birth_year ┆ bmi │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 ┆ i32 ┆ f64 │ ╞════════════════╪════════════╪════════╪════════╪════════════╪═══════════╡ │ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 ┆ 1997 ┆ 23.791913 │ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 ┆ 1985 ┆ 23.141498 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 ┆ 1983 ┆ 19.687787 │ │ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 ┆ 1981 ┆ 27.134694 │ └────────────────┴────────────┴────────┴────────┴────────────┴───────────┘` In the example above we also decided to use named expressions instead of the method `alias` to specify the names of the new columns. Other contexts like `select` and `group_by` also accept named expressions. ### `filter` The context `filter` allows us to create a second dataframe with a subset of the rows of the original one: Python Rust [`filter`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.filter.html) · [`dt namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/temporal.html) `result = df.filter(pl.col("birthdate").dt.year() < 1990) print(result)` [`filter`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.filter) · [`dt namespace`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/struct.DateLikeNameSpace.html) · [Available on feature temporal](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag temporal") `let result = df .clone() .lazy() .filter(col("birthdate").dt().year().lt(lit(1990))) .collect()?; println!("{result}");` `shape: (3, 4) ┌────────────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞════════════════╪════════════╪════════╪════════╡ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │ │ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 │ └────────────────┴────────────┴────────┴────────┘` You can also provide multiple predicate expressions as separate parameters, which is more convenient than putting them all together with `&`: Python Rust [`filter`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.filter.html) · [`is_between`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_between.html) `result = df.filter( pl.col("birthdate").is_between(dt.date(1982, 12, 31), dt.date(1996, 1, 1)), pl.col("height") > 1.7, ) print(result)` [`filter`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.filter) · [`is_between`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html#method.is_between) · [Available on feature is\_between](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag is_between") `let result = df .clone() .lazy() .filter( col("birthdate") .is_between( lit(NaiveDate::from_ymd_opt(1982, 12, 31).unwrap()), lit(NaiveDate::from_ymd_opt(1996, 1, 1).unwrap()), ClosedInterval::Both, ) .and(col("height").gt(lit(1.7))), ) .collect()?; println!("{result}");` `shape: (1, 4) ┌───────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞═══════════╪════════════╪════════╪════════╡ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ └───────────┴────────────┴────────┴────────┘` ### `group_by` The context `group_by` can be used to group together the rows of the dataframe that share the same value across one or more expressions. The example below counts how many people were born in each decade: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) · [`alias`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.alias.html) · [`dt namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/temporal.html) `result = df.group_by( (pl.col("birthdate").dt.year() // 10 * 10).alias("decade"), maintain_order=True, ).len() print(result)` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) · [`alias`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.alias) · [`dt namespace`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/struct.DateLikeNameSpace.html) · [Available on feature temporal](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag temporal") ``// Use `group_by_stable` if you want the Python behaviour of `maintain_order=True`. let result = df .clone() .lazy() .group_by([(col("birthdate").dt().year() / lit(10) * lit(10)).alias("decade")]) .agg([len()]) .collect()?; println!("{result}");`` `shape: (2, 2) ┌────────┬─────┐ │ decade ┆ len │ │ --- ┆ --- │ │ i32 ┆ u32 │ ╞════════╪═════╡ │ 1990 ┆ 1 │ │ 1980 ┆ 3 │ └────────┴─────┘` The keyword argument `maintain_order` forces Polars to present the resulting groups in the same order as they appear in the original dataframe. This slows down the grouping operation but is used here to ensure reproducibility of the examples. After using the context `group_by` we can use `agg` to compute aggregations over the resulting groups: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) · [`agg`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.dataframe.group_by.GroupBy.agg.html) `result = df.group_by( (pl.col("birthdate").dt.year() // 10 * 10).alias("decade"), maintain_order=True, ).agg( pl.len().alias("sample_size"), pl.col("weight").mean().round(2).alias("avg_weight"), pl.col("height").max().alias("tallest"), ) print(result)` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) · [`agg`](https://docs.rs/polars/latest/polars/prelude/struct.LazyGroupBy.html#method.agg) `let result = df .clone() .lazy() .group_by([(col("birthdate").dt().year() / lit(10) * lit(10)).alias("decade")]) .agg([ len().alias("sample_size"), col("weight") .mean() .round(2, RoundMode::default()) .alias("avg_weight"), col("height").max().alias("tallest"), ]) .collect()?; println!("{result}");` `shape: (2, 4) ┌────────┬─────────────┬────────────┬─────────┐ │ decade ┆ sample_size ┆ avg_weight ┆ tallest │ │ --- ┆ --- ┆ --- ┆ --- │ │ i32 ┆ u32 ┆ f64 ┆ f64 │ ╞════════╪═════════════╪════════════╪═════════╡ │ 1990 ┆ 1 ┆ 57.9 ┆ 1.56 │ │ 1980 ┆ 3 ┆ 69.73 ┆ 1.77 │ └────────┴─────────────┴────────────┴─────────┘` ### More complex queries Contexts and the expressions within can be chained to create more complex queries according to your needs. In the example below we combine some of the contexts we have seen so far to create a more complex query: Python Rust [`group_by`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by.html) · [`agg`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.dataframe.group_by.GroupBy.agg.html) · [`select`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.select.html) · [`with_columns`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.with_columns.html) · [`str namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/string.html) · [`list namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/list.html) `result = ( df.with_columns( (pl.col("birthdate").dt.year() // 10 * 10).alias("decade"), pl.col("name").str.split(by=" ").list.first(), ) .select( pl.all().exclude("birthdate"), ) .group_by( pl.col("decade"), maintain_order=True, ) .agg( pl.col("name"), pl.col("weight", "height").mean().round(2).name.prefix("avg_"), ) ) print(result)` [`group_by`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by) · [`agg`](https://docs.rs/polars/latest/polars/prelude/struct.LazyGroupBy.html#method.agg) · [`select`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.select) · [`with_columns`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.with_columns) · [`str namespace`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.StringNameSpaceImpl.html) · [`list namespace`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ListNameSpace.html) · [Available on feature strings](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag strings") `let result = df .clone() .lazy() .with_columns([ (col("birthdate").dt().year() / lit(10) * lit(10)).alias("decade"), col("name").str().split(lit(" ")).list().first(), ]) .select([all().exclude_cols(["birthdate"]).as_expr()]) .group_by([col("decade")]) .agg([ col("name"), cols(["weight", "height"]) .as_expr() .mean() .round(2, RoundMode::default()) .name() .prefix("avg_"), ]) .collect()?; println!("{result}");` `shape: (2, 4) ┌────────┬────────────────────────────┬────────────┬────────────┐ │ decade ┆ name ┆ avg_weight ┆ avg_height │ │ --- ┆ --- ┆ --- ┆ --- │ │ i32 ┆ list[str] ┆ f64 ┆ f64 │ ╞════════╪════════════════════════════╪════════════╪════════════╡ │ 1990 ┆ ["Alice"] ┆ 57.9 ┆ 1.56 │ │ 1980 ┆ ["Ben", "Chloe", "Daniel"] ┆ 69.73 ┆ 1.72 │ └────────┴────────────────────────────┴────────────┴────────────┘` Combining dataframes -------------------- Polars provides a number of tools to combine two dataframes. In this section, we show an example of a join and an example of a concatenation. ### Joining dataframes Polars provides many different join algorithms. The example below shows how to use a left outer join to combine two dataframes when a column can be used as a unique identifier to establish a correspondence between rows across the dataframes: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `df2 = pl.DataFrame( { "name": ["Ben Brown", "Daniel Donovan", "Alice Archer", "Chloe Cooper"], "parent": [True, False, False, False], "siblings": [1, 2, 3, 4], } ) print(df.join(df2, on="name", how="left"))` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) `let df2: DataFrame = df!( "name" => ["Ben Brown", "Daniel Donovan", "Alice Archer", "Chloe Cooper"], "parent" => [true, false, false, false], "siblings" => [1, 2, 3, 4], ) .unwrap(); let result = df .clone() .lazy() .join( df2.lazy(), [col("name")], [col("name")], JoinArgs::new(JoinType::Left), ) .collect()?; println!("{result}");` `shape: (4, 6) ┌────────────────┬────────────┬────────┬────────┬────────┬──────────┐ │ name ┆ birthdate ┆ weight ┆ height ┆ parent ┆ siblings │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 ┆ bool ┆ i64 │ ╞════════════════╪════════════╪════════╪════════╪════════╪══════════╡ │ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 ┆ false ┆ 3 │ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 ┆ true ┆ 1 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 ┆ false ┆ 4 │ │ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 ┆ false ┆ 2 │ └────────────────┴────────────┴────────┴────────┴────────┴──────────┘` Polars provides many different join algorithms that you can learn about in the [joins section of the user guide](https://docs.pola.rs/user-guide/transformations/joins/) . ### Concatenating dataframes Concatenating dataframes creates a taller or wider dataframe, depending on the method used. Assuming we have a second dataframe with data from other people, we could use vertical concatenation to create a taller dataframe: Python Rust [`concat`](https://docs.pola.rs/api/python/stable/reference/api/polars.concat.html) `df3 = pl.DataFrame( { "name": ["Ethan Edwards", "Fiona Foster", "Grace Gibson", "Henry Harris"], "birthdate": [ dt.date(1977, 5, 10), dt.date(1975, 6, 23), dt.date(1973, 7, 22), dt.date(1971, 8, 3), ], "weight": [67.9, 72.5, 57.6, 93.1], # (kg) "height": [1.76, 1.6, 1.66, 1.8], # (m) } ) print(pl.concat([df, df3], how="vertical"))` [`concat`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat.html) `let df3: DataFrame = df!( "name" => ["Ethan Edwards", "Fiona Foster", "Grace Gibson", "Henry Harris"], "birthdate" => [ NaiveDate::from_ymd_opt(1977, 5, 10).unwrap(), NaiveDate::from_ymd_opt(1975, 6, 23).unwrap(), NaiveDate::from_ymd_opt(1973, 7, 22).unwrap(), NaiveDate::from_ymd_opt(1971, 8, 3).unwrap(), ], "weight" => [67.9, 72.5, 57.6, 93.1], // (kg) "height" => [1.76, 1.6, 1.66, 1.8], // (m) ) .unwrap(); let result = concat([df.clone().lazy(), df3.lazy()], UnionArgs::default())?.collect()?; println!("{result}");` `shape: (8, 4) ┌────────────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞════════════════╪════════════╪════════╪════════╡ │ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 │ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │ │ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 │ │ Ethan Edwards ┆ 1977-05-10 ┆ 67.9 ┆ 1.76 │ │ Fiona Foster ┆ 1975-06-23 ┆ 72.5 ┆ 1.6 │ │ Grace Gibson ┆ 1973-07-22 ┆ 57.6 ┆ 1.66 │ │ Henry Harris ┆ 1971-08-03 ┆ 93.1 ┆ 1.8 │ └────────────────┴────────────┴────────┴────────┘` Polars provides vertical and horizontal concatenation, as well as diagonal concatenation. You can learn more about these in the [concatenations section of the user guide](https://docs.pola.rs/user-guide/transformations/concatenation/) . --- # CREATE - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/sql/create/#create) CREATE ====== In Polars, the `SQLContext` provides a way to execute SQL statements against `LazyFrames` and `DataFrames` using SQL syntax. One of the SQL statements that can be executed using `SQLContext` is the `CREATE TABLE` statement, which is used to create a new table. The syntax for the `CREATE TABLE` statement in Polars is as follows: `CREATE TABLE table_name AS SELECT ...` In this syntax, `table_name` is the name of the new table that will be created, and `SELECT ...` is a SELECT statement that defines the data that will be inserted into the table. Here's an example of how to use the `CREATE TABLE` statement in Polars: Python [`register`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.register.html#polars.SQLContext.register) · [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `data = {"name": ["Alice", "Bob", "Charlie", "David"], "age": [25, 30, 35, 40]} df = pl.LazyFrame(data) ctx = pl.SQLContext(my_table=df, eager=True) result = ctx.execute( """ CREATE TABLE older_people AS SELECT * FROM my_table WHERE age > 30 """ ) print(ctx.execute("SELECT * FROM older_people"))` `shape: (2, 2) ┌─────────┬─────┐ │ name ┆ age │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════════╪═════╡ │ Charlie ┆ 35 │ │ David ┆ 40 │ └─────────┴─────┘` In this example, we use the `execute()` method of the `SQLContext` to execute a `CREATE TABLE` statement that creates a new table called `older_people` based on a SELECT statement that selects all rows from the `my_table` DataFrame where the `age` column is greater than 30. Note Note that the result of a `CREATE TABLE` statement is not the table itself. The table is registered in the `SQLContext`. In case you want to turn the table back to a `DataFrame` you can use a `SELECT * FROM ...` statement --- # Arrow producer/consumer - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/misc/arrow/#arrow-producerconsumer) Arrow producer/consumer ======================= Using pyarrow ------------- Polars can move data in and out of arrow zero copy. This can be done either via pyarrow or natively. Let's first start by showing the pyarrow solution: Python `import polars as pl df = pl.DataFrame({"foo": [1, 2, 3], "bar": ["ham", "spam", "jam"]}) arrow_table = df.to_arrow() print(arrow_table)` `pyarrow.Table foo: int64 bar: large_string ---- foo: [[1,2,3]] bar: [["ham","spam","jam"]]` Or if you want to ensure the output is zero-copy: Python `arrow_table_zero_copy = df.to_arrow(compat_level=pl.CompatLevel.newest()) print(arrow_table_zero_copy)` `pyarrow.Table foo: int64 bar: string_view ---- foo: [[1,2,3]] bar: [["ham","spam","jam"]]` Importing from pyarrow can be achieved with `pl.from_arrow`. Using the Arrow PyCapsule Interface ----------------------------------- As of Polars v1.3 and higher, Polars implements the [Arrow PyCapsule Interface](https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html) , a protocol for sharing Arrow data across Python libraries. ### Exporting data from Polars to pyarrow To convert a Polars `DataFrame` to a `pyarrow.Table`, use the `pyarrow.table` constructor: Note This requires pyarrow v15 or higher. Python `import polars as pl import pyarrow as pa df = pl.DataFrame({"foo": [1, 2, 3], "bar": ["ham", "spam", "jam"]}) arrow_table = pa.table(df) print(arrow_table)` `pyarrow.Table foo: int64 bar: string_view ---- foo: [[1,2,3]] bar: [["ham","spam","jam"]]` To convert a Polars `Series` to a `pyarrow.ChunkedArray`, use the `pyarrow.chunked_array` constructor. Python `arrow_chunked_array = pa.chunked_array(df["foo"]) print(arrow_chunked_array)` `[ [ 1, 2, 3 ] ]` You can also pass a `Series` to the `pyarrow.array` constructor to create a contiguous array. Note that this will not be zero-copy if the underlying `Series` had multiple chunks. Python `arrow_array = pa.array(df["foo"]) print(arrow_array)` `[ 1, 2, 3 ]` ### Importing data from pyarrow to Polars We can pass the pyarrow `Table` back to Polars by using the `polars.DataFrame` constructor: Python `polars_df = pl.DataFrame(arrow_table) print(polars_df)` `shape: (3, 2) ┌─────┬──────┐ │ foo ┆ bar │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪══════╡ │ 1 ┆ ham │ │ 2 ┆ spam │ │ 3 ┆ jam │ └─────┴──────┘` Similarly, we can pass the pyarrow `ChunkedArray` or `Array` back to Polars by using the `polars.Series` constructor: Python `polars_series = pl.Series(arrow_chunked_array) print(polars_series)` `shape: (3,) Series: '' [i64] [ 1 2 3 ]` ### Usage with other arrow libraries There's a [growing list](https://github.com/apache/arrow/issues/39195#issuecomment-2245718008) of libraries that support the PyCapsule Interface directly. Polars `Series` and `DataFrame` objects work automatically with every such library. ### For library maintainers If you're developing a library that you wish to integrate with Polars, it's suggested to implement the [Arrow PyCapsule Interface](https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html) yourself. This comes with a number of benefits: * Zero-copy exchange for both Polars Series and DataFrame * No required dependency on pyarrow. * No direct dependency on Polars. * Harder to cause memory leaks than handling pointers as raw integers. * Automatic zero-copy integration other PyCapsule Interface-supported libraries. Using Polars directly --------------------- Polars can also consume and export to and import from the [Arrow C Data Interface](https://arrow.apache.org/docs/format/CDataInterface.html) directly. This is recommended for libraries that don't support the Arrow PyCapsule Interface and want to interop with Polars without requiring a pyarrow installation. * To export `ArrowArray` C structs, Polars exposes: `Series._export_arrow_to_c`. * To import an `ArrowArray` C struct, Polars exposes `Series._import_arrow_from_c`. --- # Cloud storage - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/cloud-storage/#cloud-storage) Cloud storage ============= Polars can read and write to AWS S3, Azure Blob Storage and Google Cloud Storage. The API is the same for all three storage providers. To read from cloud storage, additional dependencies may be needed depending on the use case and cloud storage provider: Python Rust `$ pip install fsspec s3fs adlfs gcsfs` `$ cargo add aws_sdk_s3 aws_config tokio --features tokio/full` Reading from cloud storage -------------------------- Polars supports reading Parquet, CSV, IPC and NDJSON files from cloud storage: Python Rust [`read_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_parquet.html) · [`read_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html) · [`read_ipc`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_ipc.html) `import polars as pl source = "s3://bucket/*.parquet" df = pl.read_parquet(source)` [`ParquetReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetReader.html) · [`CsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReader.html) · [`IpcReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcReader.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") · [Available on feature ipc](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag ipc") · [Available on feature parquet](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag parquet") `use aws_config::BehaviorVersion; use polars::prelude::*; #[tokio::main] async fn main() { let bucket = ""; let path = ""; let config = aws_config::load_defaults(BehaviorVersion::latest()).await; let client = aws_sdk_s3::Client::new(&config); let object = client .get_object() .bucket(bucket) .key(path) .send() .await .unwrap(); let bytes = object.body.collect().await.unwrap().into_bytes(); let cursor = std::io::Cursor::new(bytes); let df = CsvReader::new(cursor).finish().unwrap(); println!("{df:?}"); }` Scanning from cloud storage with query optimisation --------------------------------------------------- Using `pl.scan_*` functions to read from cloud storage can benefit from [predicate and projection pushdowns](https://docs.pola.rs/user-guide/lazy/optimizations/) , where the query optimizer will apply them before the file is downloaded. This can significantly reduce the amount of data that needs to be downloaded. The query evaluation is triggered by calling `collect`. Python Rust `import polars as pl source = "s3://bucket/*.parquet" df = pl.scan_parquet(source).filter(pl.col("id") < 100).select("id","value").collect()` Cloud authentication -------------------- Polars is able to automatically load default credential configurations for some cloud providers. For cases when this does not happen, it is possible to manually configure the credentials for Polars to use for authentication. This can be done in a few ways: ### Using `storage_options`: * Credentials can be passed as configuration keys in a dict with the `storage_options` parameter: Python Rust [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) `import polars as pl source = "s3://bucket/*.parquet" storage_options = { "aws_access_key_id": "", "aws_secret_access_key": "", "aws_region": "us-east-1", } df = pl.scan_parquet(source, storage_options=storage_options).collect()` [`scan_parquet`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html#method.scan_parquet) · [Available on feature parquet](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag parquet") ### Using one of the available `CredentialProvider*` utility classes * There may be a utility class `pl.CredentialProvider*` that provides the required authentication functionality. For example, `pl.CredentialProviderAWS` supports selecting AWS profiles, as well as assuming an IAM role: Python Rust [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) · [`CredentialProviderAWS`](https://docs.pola.rs/api/python/stable/reference/api/polars.CredentialProviderAWS.html) `lf = pl.scan_parquet( "s3://.../...", credential_provider=pl.CredentialProviderAWS( profile_name="...", assume_role={ "RoleArn": f"...", "RoleSessionName": "...", } ), ) df = lf.collect()` [`scan_parquet`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html#method.scan_parquet) · [Available on feature parquet](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag parquet") ### Using a custom `credential_provider` function * Some environments may require custom authentication logic (e.g. AWS IAM role-chaining). For these cases a Python function can be provided for Polars to use to retrieve credentials: Python Rust [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) `def get_credentials() -> pl.CredentialProviderFunctionReturn: expiry = None return { "aws_access_key_id": "...", "aws_secret_access_key": "...", "aws_session_token": "...", }, expiry lf = pl.scan_parquet( "s3://.../...", credential_provider=get_credentials, ) df = lf.collect()` [`scan_parquet`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html#method.scan_parquet) · [Available on feature parquet](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag parquet") * Example for Azure: Python Rust [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) · [`CredentialProviderAzure`](https://docs.pola.rs/api/python/stable/reference/api/polars.CredentialProviderAzure.html) `def credential_provider(): credential = DefaultAzureCredential(exclude_managed_identity_credential=True) token = credential.get_token("https://storage.azure.com/.default") return {"bearer_token": token.token}, token.expires_on pl.scan_parquet( "abfss://...@.../...", credential_provider=credential_provider, ) # Note that for the above case, this shortcut is also available: pl.scan_parquet( "abfss://...@.../...", credential_provider=pl.CredentialProviderAzure( credential=DefaultAzureCredential(exclude_managed_identity_credential=True) ), )` [`scan_parquet`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html#method.scan_parquet) · [Available on feature parquet](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag parquet") ### Set a default credential provider to use * It is possible to globally configure a default credential provider, so that it does not need to be passed to every I/O function call. This can be convenient in the case where there are many cloud I/O operations that use the same credential provider. Python Rust [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html) · [`CredentialProviderAWS`](https://docs.pola.rs/api/python/stable/reference/api/polars.CredentialProviderAWS.html) `pl.Config.set_default_credential_provider( pl.CredentialProviderAWS( profile_name="...", assume_role={ "RoleArn": f"...", "RoleSessionName": "...", }, ) )` [`scan_parquet`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html#method.scan_parquet) · [Available on feature parquet](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag parquet") Scanning with PyArrow --------------------- We can also scan from cloud storage using PyArrow. This is particularly useful for partitioned datasets such as Hive partitioning. We first create a PyArrow dataset and then create a `LazyFrame` from the dataset. Python Rust [`scan_pyarrow_dataset`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_pyarrow_dataset.html) `import polars as pl import pyarrow.dataset as ds dset = ds.dataset("s3://my-partitioned-folder/", format="parquet") ( pl.scan_pyarrow_dataset(dset) .filter(pl.col("foo") == "a") .select(["foo", "bar"]) .collect() )` [`scan_pyarrow_dataset`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_pyarrow_dataset.html) Writing to cloud storage ------------------------ `DataFrame`s can also be written to cloud storage by passing a cloud URL: Python Rust [`write_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_parquet.html) `import polars as pl df = pl.DataFrame( { "foo": ["a", "b", "c", "d", "d"], "bar": [1, 2, 3, 4, 5], } ) destination = "s3://bucket/my_file.parquet" df.write_parquet(destination)` [`ParquetWriter`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetWriter.html) · [Available on feature parquet](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag parquet") Note that `DataFrame`s can also be written to any Python file object that supports writes. This can be helpful for performing operations that are not yet natively supported, e.g. writing a compressed CSV directly to cloud: Python Rust [`write_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_csv.html) `import polars as pl import s3fs import gzip df = pl.DataFrame( { "foo": ["a", "b", "c", "d", "d"], "bar": [1, 2, 3, 4, 5], } ) destination = "s3://bucket/my_file.csv.gz" fs = s3fs.S3FileSystem() with fs.open(destination, "wb") as cloud_f: with gzip.open(cloud_f, "w") as f: df.write_csv(f)` [`CsvWriter`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvWriter.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") --- # SHOW TABLES - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/sql/show/#show-tables) SHOW TABLES =========== In Polars, the `SHOW TABLES` statement is used to list all the tables that have been registered in the current `SQLContext`. When you register a DataFrame with the `SQLContext`, you give it a name that can be used to refer to the DataFrame in subsequent SQL statements. The `SHOW TABLES` statement allows you to see a list of all the registered tables, along with their names. The syntax for the `SHOW TABLES` statement in Polars is as follows: `SHOW TABLES` Here's an example of how to use the `SHOW TABLES` statement in Polars: Python [`register`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.register.html#polars.SQLContext.register) · [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `# Create some DataFrames and register them with the SQLContext df1 = pl.LazyFrame( { "name": ["Alice", "Bob", "Charlie", "David"], "age": [25, 30, 35, 40], } ) df2 = pl.LazyFrame( { "name": ["Ellen", "Frank", "Gina", "Henry"], "age": [45, 50, 55, 60], } ) ctx = pl.SQLContext(mytable1=df1, mytable2=df2) tables = ctx.execute("SHOW TABLES", eager=True) print(tables)` `shape: (2, 1) ┌──────────┐ │ name │ │ --- │ │ str │ ╞══════════╡ │ mytable1 │ │ mytable2 │ └──────────┘` In this example, we create two DataFrames and register them with the `SQLContext` using different names. We then execute a `SHOW TABLES` statement using the `execute()` method of the `SQLContext` object, which returns a DataFrame containing a list of all the registered tables and their names. The resulting DataFrame is then printed using the `print()` function. Note that the `SHOW TABLES` statement only lists tables that have been registered with the current `SQLContext`. If you register a DataFrame with a different `SQLContext` or in a different Python session, it will not appear in the list of tables returned by `SHOW TABLES`. --- # Transformations - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/transformations/#transformations) Transformations =============== The focus of this section is to describe different types of data transformations and provide some examples on how to use them. * [Joins](https://docs.pola.rs/user-guide/transformations/joins/) * [Concatenation](https://docs.pola.rs/user-guide/transformations/concatenation/) * [Pivot](https://docs.pola.rs/user-guide/transformations/pivot/) * [Unpivot](https://docs.pola.rs/user-guide/transformations/unpivot/) --- # Multiprocessing - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/misc/multiprocessing/#multiprocessing) Multiprocessing =============== TLDR: if you find that using Python's built-in `multiprocessing` module together with Polars results in a Polars error about multiprocessing methods, you should make sure you are using `spawn`, not `fork`, as the starting method: Python `from multiprocessing import get_context def my_fun(s): print(s) with get_context("spawn").Pool() as pool: pool.map(my_fun, ["input1", "input2", ...])` When not to use multiprocessing ------------------------------- Before we dive into the details, it is important to emphasize that Polars has been built from the start to use all your CPU cores. It does this by executing computations which can be done in parallel in separate threads. For example, requesting two expressions in a `select` statement can be done in parallel, with the results only being combined at the end. Another example is aggregating a value within groups using `group_by().agg()`, each group can be evaluated separately. It is very unlikely that the `multiprocessing` module can improve your code performance in these cases. If you're using the GPU Engine with Polars you should also avoid manual multiprocessing. When used simultaneously, they can compete for system memory and processing power, leading to reduced performance. See [the optimizations section](https://docs.pola.rs/user-guide/lazy/optimizations/) for more optimizations. When to use multiprocessing --------------------------- Although Polars is multithreaded, other libraries may be single-threaded. When the other library is the bottleneck, and the problem at hand is parallelizable, it makes sense to use multiprocessing to gain a speed up. The problem with the default multiprocessing config --------------------------------------------------- ### Summary The [Python multiprocessing documentation](https://docs.python.org/3/library/multiprocessing.html) lists the three methods to create a process pool: 1. spawn 2. fork 3. forkserver The description of fork is (as of 2022-10-15): > The parent process uses os.fork() to fork the Python interpreter. The child process, when it begins, is effectively identical to the parent process. All resources of the parent are inherited by the child process. Note that safely forking a multithreaded process is problematic. > > Available on Unix only. The default on Unix. The short summary is: Polars is multithreaded as to provide strong performance out-of-the-box. Thus, it cannot be combined with `fork`. If you are on Unix (Linux, BSD, etc), you are using `fork`, unless you explicitly override it. The reason you may not have encountered this before is that pure Python code, and most Python libraries, are (mostly) single threaded. Alternatively, you are on Windows or MacOS, on which `fork` is not even available as a method (for MacOS it was up to Python 3.7). Thus one should use `spawn`, or `forkserver`, instead. `spawn` is available on all platforms and the safest choice, and hence the recommended method. ### Example The problem with `fork` is in the copying of the parent's process. Consider the example below, which is a slightly modified example posted on the [Polars issue tracker](https://github.com/pola-rs/polars/issues/3144) : Python `import multiprocessing import polars as pl def test_sub_process(df: pl.DataFrame, job_id): df_filtered = df.filter(pl.col("a") > 0) print(f"Filtered (job_id: {job_id})", df_filtered, sep="\n") def create_dataset(): return pl.DataFrame({"a": [0, 2, 3, 4, 5], "b": [0, 4, 5, 56, 4]}) def setup(): # some setup work df = create_dataset() df.write_parquet("/tmp/test.parquet") def main(): test_df = pl.read_parquet("/tmp/test.parquet") for i in range(0, 5): proc = multiprocessing.get_context("spawn").Process( target=test_sub_process, args=(test_df, i) ) proc.start() proc.join() print(f"Executed sub process {i}") if __name__ == "__main__": setup() main()` Using `fork` as the method, instead of `spawn`, will cause a dead lock. The fork method is equivalent to calling `os.fork()`, which is a system call as defined in [the POSIX standard](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fork.html) : > A process shall be created with a single thread. If a multi-threaded process calls fork(), the new process shall contain a replica of the calling thread and its entire address space, possibly including the states of mutexes and other resources. Consequently, to avoid errors, the child process may only execute async-signal-safe operations until such time as one of the exec functions is called. In contrast, `spawn` will create a completely new fresh Python interpreter, and not inherit the state of mutexes. So what happens in the code example? For reading the file with `pl.read_parquet` the file has to be locked. Then `os.fork()` is called, copying the state of the parent process, including mutexes. Thus all child processes will copy the file lock in an acquired state, leaving them hanging indefinitely waiting for the file lock to be released, which never happens. What makes debugging these issues tricky is that `fork` can work. Change the example to not having the call to `pl.read_parquet`: Python `import multiprocessing import polars as pl def test_sub_process(df: pl.DataFrame, job_id): df_filtered = df.filter(pl.col("a") > 0) print(f"Filtered (job_id: {job_id})", df_filtered, sep="\n") def create_dataset(): return pl.DataFrame({"a": [0, 2, 3, 4, 5], "b": [0, 4, 5, 56, 4]}) def main(): test_df = create_dataset() for i in range(0, 5): proc = multiprocessing.get_context("fork").Process( target=test_sub_process, args=(test_df, i) ) proc.start() proc.join() print(f"Executed sub process {i}") if __name__ == "__main__": main()` This works fine. Therefore debugging these issues in larger code bases, i.e. not the small toy examples here, can be a real pain, as a seemingly unrelated change can break your multiprocessing code. In general, one should therefore never use the `fork` start method with multithreaded libraries unless there are very specific requirements that cannot be met otherwise. ### Pro's and cons of fork Based on the example, you may think, why is `fork` available in Python to start with? First, probably because of historical reasons: `spawn` was added to Python in version 3.4, whilst `fork` has been part of Python from the 2.x series. Second, there are several limitations for `spawn` and `forkserver` that do not apply to `fork`, in particular all arguments should be pickleable. See the [Python multiprocessing docs](https://docs.python.org/3/library/multiprocessing.html#the-spawn-and-forkserver-start-methods) for more information. Third, because it is faster to create new processes compared to `spawn`, as `spawn` is effectively `fork` + creating a brand new Python process without the locks by calling [execv](https://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html) . Hence the warning in the Python docs that it is slower: there is more overhead to `spawn`. However, in almost all cases, one would like to use multiple processes to speed up computations that take multiple minutes or even hours, meaning the overhead is negligible in the grand scheme of things. And more importantly, it actually works in combination with multithreaded libraries. Fourth, `spawn` starts a new process, and therefore it requires code to be importable, in contrast to `fork`. In particular, this means that when using `spawn` the relevant code should not be in the global scope, such as in Jupyter notebooks or in plain scripts. Hence in the examples above, we define functions where we spawn within, and run those functions from a `__main__` clause. This is not an issue for typical projects, but during quick experimentation in notebooks it could fail. References ---------- 1. https://docs.python.org/3/library/multiprocessing.html 2. https://pythonspeed.com/articles/python-multiprocessing/ 3. https://pubs.opengroup.org/onlinepubs/9699919799/functions/fork.html 4. https://bnikolic.co.uk/blog/python/parallelism/2019/11/13/python-forkserver-preload.html --- # IO Plugins - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/plugins/io_plugins/#io-plugins) IO Plugins ========== Besides [expression plugins](https://docs.pola.rs/user-guide/plugins/expr_plugins/) , we also support IO plugins. These allow you to register different file formats as sources to the Polars engines. Because sources can move data zero copy via Arrow FFI and sources can produce large chunks of data before returning, we've decided to interface to IO plugins via Python for now, as we don't think the short time the GIL is needed should lead to any contention. E.g. an IO source can read their dataframe's in rust and only at the rendez-vous move the data zero-copy having only a short time the GIL is needed. Use case -------- You want IO plugins if you have a source file not supported by Polars and you want to benefit from optimizations like projection pushdown, predicate pushdown, early stopping and support of our streaming engine. Example ------- So let's write a simple, very bad, custom CSV source and register that as an IO plugin. I want to stress that this is a very bad example and is only given for learning purposes. First we define some imports we need: `# Use python for csv parsing. import csv import polars as pl # Used to register a new generator on every instantiation. from polars.io.plugins import register_io_source from typing import Iterator import io` ### Parsing the schema Every `scan` function in Polars has to be able to provide the schema of the data it reads. For this simple csv parser we will always read the data as `pl.String`. The only thing that differs are the field names and the number of fields. `def parse_schema(csv_str: str) -> pl.Schema: first_line = csv_str.split("\n")[0] return pl.Schema({k: pl.String for k in first_line.split(",")})` If we run this with small csv file `"a,b,c\n1,2,3"` we get the schema: `Schema([('a', String), ('b', String), ('c', String)])`. `>>> print(parse_schema("a,b,c\n1,2,3")) Schema([('a', String), ('b', String), ('c', String)])` ### Writing the source Next up is the actual source. For this we create an outer and an inner function. The outer function `my_scan_csv` is the user facing function. This function will accept the file name and other potential arguments you would need for reading the source. For csv files, these arguments could be "delimiter", "quote\_char" and such. This outer function calls `register_io_source` which accepts a `callable` and a `schema`. The schema is the Polars schema of the complete source file (independent of projection pushdown). The callable is a function that will return a generator that produces `pl.DataFrame` objects. The arguments of this function are predefined and this function must accept: * `with_columns` Columns that are projected. The reader must project these columns if applied * `predicate` Polars expression. The reader must filter their rows accordingly. * `n_rows` Materialize only n rows from the source. The reader can stop when `n_rows` are read. * `batch_size` A hint of the ideal batch size the reader's generator must produce. The inner function is the actual implementation of the IO source and can also call into Rust/C++ or wherever the IO plugin is written. If you want to see an IO source implemented in Rust, take a look at our [plugins repository](https://github.com/pola-rs/pyo3-polars/tree/main/example/io_plugin) . `def my_scan_csv(csv_str: str) -> pl.LazyFrame: schema = parse_schema(csv_str) def source_generator( with_columns: list[str] | None, predicate: pl.Expr | None, n_rows: int | None, batch_size: int | None, ) -> Iterator[pl.DataFrame]: """ Generator function that creates the source. This function will be registered as IO source. """ if batch_size is None: batch_size = 100 # Initialize the reader. reader = csv.reader(io.StringIO(csv_str), delimiter=',') # Skip the header. _ = next(reader) # Ensure we don't read more rows than requested from the engine while n_rows is None or n_rows > 0: if n_rows is not None: batch_size = min(batch_size, n_rows) rows = [] for _ in range(batch_size): try: row = next(reader) except StopIteration: n_rows = 0 break rows.append(row) df = pl.from_records(rows, schema=schema, orient="row") n_rows -= df.height # If we would make a performant reader, we would not read these # columns at all. if with_columns is not None: df = df.select(with_columns) # If the source supports predicate pushdown, the expression can be parsed # to skip rows/groups. if predicate is not None: df = df.filter(predicate) yield df return register_io_source(io_source=source_generator, schema=schema)` ### Taking it for a (very slow) spin Finally we can test our source: `csv_str1 = """a,b,c,d 1,2,3,4 9,10,11,2 1,2,3,4 1,122,3,4""" print(my_scan_csv(csv_str1).collect()) csv_str2 = """a,b 1,2 9,10 1,2 1,122""" print(my_scan_csv(csv_str2).head(2).collect())` Running the script above would print the following output to the console: `shape: (4, 4) ┌─────┬─────┬─────┬─────┐ │ a ┆ b ┆ c ┆ d │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ str │ ╞═════╪═════╪═════╪═════╡ │ 1 ┆ 2 ┆ 3 ┆ 4 │ │ 9 ┆ 10 ┆ 11 ┆ 2 │ │ 1 ┆ 2 ┆ 3 ┆ 4 │ │ 1 ┆ 122 ┆ 3 ┆ 4 │ └─────┴─────┴─────┴─────┘ shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ str ┆ str │ ╞═════╪═════╡ │ 1 ┆ 2 │ │ 9 ┆ 10 │ └─────┴─────┘` Further reading --------------- * [Rust example (distribution source)](https://github.com/pola-rs/pyo3-polars/tree/main/example/io_plugin) --- # Strings - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/strings/#strings) Strings ======= The following section discusses operations performed on string data, which is a frequently used data type when working with dataframes. String processing functions are available in the namespace `str`. Working with strings in other dataframe libraries can be highly inefficient due to the fact that strings have unpredictable lengths. Polars mitigates these inefficiencies by [following the Arrow Columnar Format specification](https://docs.pola.rs/user-guide/concepts/data-types-and-structures/#data-types-internals) , so you can write performant data queries on string data too. The string namespace -------------------- When working with string data you will likely need to access the namespace `str`, which aggregates 40+ functions that let you work with strings. As an example of how to access functions from within that namespace, the snippet below shows how to compute the length of the strings in a column in terms of the number of bytes and the number of characters: Python Rust [`str.len_bytes`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.len_bytes.html) · [`str.len_chars`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.len_chars.html) `import polars as pl df = pl.DataFrame( { "language": ["English", "Dutch", "Portuguese", "Finish"], "fruit": ["pear", "peer", "pêra", "päärynä"], } ) result = df.with_columns( pl.col("fruit").str.len_bytes().alias("byte_count"), pl.col("fruit").str.len_chars().alias("letter_count"), ) print(result)` [`str.len_bytes`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.len_bytes) · [`str.len_chars`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.len_chars) `use polars::prelude::*; let df = df! ( "language" => ["English", "Dutch", "Portuguese", "Finish"], "fruit" => ["pear", "peer", "pêra", "päärynä"], )?; let result = df .clone() .lazy() .with_columns([ col("fruit").str().len_bytes().alias("byte_count"), col("fruit").str().len_chars().alias("letter_count"), ]) .collect()?; println!("{result}");` `shape: (4, 4) ┌────────────┬─────────┬────────────┬──────────────┐ │ language ┆ fruit ┆ byte_count ┆ letter_count │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ u32 ┆ u32 │ ╞════════════╪═════════╪════════════╪══════════════╡ │ English ┆ pear ┆ 4 ┆ 4 │ │ Dutch ┆ peer ┆ 4 ┆ 4 │ │ Portuguese ┆ pêra ┆ 5 ┆ 4 │ │ Finish ┆ päärynä ┆ 10 ┆ 7 │ └────────────┴─────────┴────────────┴──────────────┘` Note If you are working exclusively with ASCII text, then the results of the two computations will be the same and using `len_bytes` is recommended since it is faster. Parsing strings --------------- Polars offers multiple methods for checking and parsing elements of a string column, namely checking for the existence of given substrings or patterns, and counting, extracting, or replacing, them. We will demonstrate some of these operations in the upcoming examples. ### Check for the existence of a pattern We can use the function `contains` to check for the presence of a pattern within a string. By default, the argument to the function `contains` is interpreted as a regular expression. If you want to specify a literal substring, set the parameter `literal` to `True`. For the special cases where you want to check if the strings start or end with a fixed substring, you can use the functions `starts_with` or `ends_with`, respectively. Python Rust [`str.contains`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.contains.html) · [`str.starts_with`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.starts_with.html) · [`str.ends_with`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.ends_with.html) `result = df.select( pl.col("fruit"), pl.col("fruit").str.starts_with("p").alias("starts_with_p"), pl.col("fruit").str.contains("p..r").alias("p..r"), pl.col("fruit").str.contains("e+").alias("e+"), pl.col("fruit").str.ends_with("r").alias("ends_with_r"), ) print(result)` [`str.contains`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.contains) · [`str.starts_with`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.starts_with) · [`str.ends_with`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.ends_with) · [Available on feature regex](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag regex") `let result = df .lazy() .select([ col("fruit"), col("fruit") .str() .starts_with(lit("p")) .alias("starts_with_p"), col("fruit").str().contains(lit("p..r"), true).alias("p..r"), col("fruit").str().contains(lit("e+"), true).alias("e+"), col("fruit").str().ends_with(lit("r")).alias("ends_with_r"), ]) .collect()?; println!("{result}");` `shape: (4, 5) ┌─────────┬───────────────┬───────┬───────┬─────────────┐ │ fruit ┆ starts_with_p ┆ p..r ┆ e+ ┆ ends_with_r │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ bool ┆ bool ┆ bool ┆ bool │ ╞═════════╪═══════════════╪═══════╪═══════╪═════════════╡ │ pear ┆ true ┆ true ┆ true ┆ true │ │ peer ┆ true ┆ true ┆ true ┆ true │ │ pêra ┆ true ┆ false ┆ false ┆ false │ │ päärynä ┆ true ┆ true ┆ false ┆ false │ └─────────┴───────────────┴───────┴───────┴─────────────┘` ### Regex specification Polars relies on the Rust crate `regex` to work with regular expressions, so you may need to [refer to the syntax documentation](https://docs.rs/regex/latest/regex/#syntax) to see what features and flags are supported. In particular, note that the flavor of regex supported by Polars is different from Python's module `re`. ### Extract a pattern The function `extract` allows us to extract patterns from the string values in a column. The function `extract` accepts a regex pattern with one or more capture groups and extracts the capture group specified as the second argument. Python Rust [`str.extract`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.extract.html) `df = pl.DataFrame( { "urls": [ "http://vote.com/ballon_dor?candidate=messi&ref=polars", "http://vote.com/ballon_dor?candidat=jorginho&ref=polars", "http://vote.com/ballon_dor?candidate=ronaldo&ref=polars", ] } ) result = df.select( pl.col("urls").str.extract(r"candidate=(\w+)", group_index=1), ) print(result)` [`str.extract`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.extract) `let df = df! ( "urls" => [ "http://vote.com/ballon_dor?candidate=messi&ref=polars", "http://vote.com/ballon_dor?candidat=jorginho&ref=polars", "http://vote.com/ballon_dor?candidate=ronaldo&ref=polars", ] )?; let result = df .lazy() .select([col("urls").str().extract(lit(r"candidate=(\w+)"), 1)]) .collect()?; println!("{result}");` `shape: (3, 1) ┌─────────┐ │ urls │ │ --- │ │ str │ ╞═════════╡ │ messi │ │ null │ │ ronaldo │ └─────────┘` To extract all occurrences of a pattern within a string, we can use the function `extract_all`. In the example below, we extract all numbers from a string using the regex pattern `(\d+)`, which matches one or more digits. The resulting output of the function `extract_all` is a list containing all instances of the matched pattern within the string. Python Rust [`str.extract_all`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.extract_all.html) `df = pl.DataFrame({"text": ["123 bla 45 asd", "xyz 678 910t"]}) result = df.select( pl.col("text").str.extract_all(r"(\d+)").alias("extracted_nrs"), ) print(result)` [`str.extract_all`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.extract_all) `let df = df! ( "text" => ["123 bla 45 asd", "xyz 678 910t"] )?; let result = df .lazy() .select([col("text") .str() .extract_all(lit(r"(\d+)")) .alias("extracted_nrs")]) .collect()?; println!("{result}");` `shape: (2, 1) ┌────────────────┐ │ extracted_nrs │ │ --- │ │ list[str] │ ╞════════════════╡ │ ["123", "45"] │ │ ["678", "910"] │ └────────────────┘` ### Replace a pattern Akin to the functions `extract` and `extract_all`, Polars provides the functions `replace` and `replace_all`. These accept a regex pattern or a literal substring (if the parameter `literal` is set to `True`) and perform the replacements specified. The function `replace` will make at most one replacement whereas the function `replace_all` will make all the non-overlapping replacements it finds. Python Rust [`str.replace`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.replace.html) · [`str.replace_all`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.replace_all.html) `df = pl.DataFrame({"text": ["123abc", "abc456"]}) result = df.with_columns( pl.col("text").str.replace(r"\d", "-"), pl.col("text").str.replace_all(r"\d", "-").alias("text_replace_all"), ) print(result)` [`str.replace`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.replace) · [`str.replace_all`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.replace_all) · [Available on feature regex](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag regex") `let df = df! ( "text" => ["123abc", "abc456"] )?; let result = df .lazy() .with_columns([ col("text").str().replace(lit(r"\d"), lit("-"), false), col("text") .str() .replace_all(lit(r"\d"), lit("-"), false) .alias("text_replace_all"), ]) .collect()?; println!("{result}");` `shape: (2, 2) ┌────────┬──────────────────┐ │ text ┆ text_replace_all │ │ --- ┆ --- │ │ str ┆ str │ ╞════════╪══════════════════╡ │ -23abc ┆ ---abc │ │ abc-56 ┆ abc--- │ └────────┴──────────────────┘` Modifying strings ----------------- ### Case conversion Converting the casing of a string is a common operation and Polars supports it out of the box with the functions `to_lowercase`, `to_titlecase`, and `to_uppercase`: Python Rust [`str.to_lowercase`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.to_lowercase.html) · [`str.to_titlecase`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.to_titlecase.html) · [`str.to_uppercase`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.to_uppercase.html) `addresses = pl.DataFrame( { "addresses": [ "128 PERF st", "Rust blVD, 158", "PoLaRs Av, 12", "1042 Query sq", ] } ) addresses = addresses.select( pl.col("addresses").alias("originals"), pl.col("addresses").str.to_titlecase(), pl.col("addresses").str.to_lowercase().alias("lower"), pl.col("addresses").str.to_uppercase().alias("upper"), ) print(addresses)` [`str.to_lowercase`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.to_lowercase) · [`str.to_titlecase`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.to_titlecase) · [`str.to_uppercase`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.to_uppercase) · [Available on feature nightly](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag nightly") `let addresses = df! ( "addresses" => [ "128 PERF st", "Rust blVD, 158", "PoLaRs Av, 12", "1042 Query sq", ] )?; let addresses = addresses .lazy() .select([ col("addresses").alias("originals"), col("addresses").str().to_titlecase(), col("addresses").str().to_lowercase().alias("lower"), col("addresses").str().to_uppercase().alias("upper"), ]) .collect()?; println!("{addresses}");` `shape: (4, 4) ┌────────────────┬────────────────┬────────────────┬────────────────┐ │ originals ┆ addresses ┆ lower ┆ upper │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ str │ ╞════════════════╪════════════════╪════════════════╪════════════════╡ │ 128 PERF st ┆ 128 Perf St ┆ 128 perf st ┆ 128 PERF ST │ │ Rust blVD, 158 ┆ Rust Blvd, 158 ┆ rust blvd, 158 ┆ RUST BLVD, 158 │ │ PoLaRs Av, 12 ┆ Polars Av, 12 ┆ polars av, 12 ┆ POLARS AV, 12 │ │ 1042 Query sq ┆ 1042 Query Sq ┆ 1042 query sq ┆ 1042 QUERY SQ │ └────────────────┴────────────────┴────────────────┴────────────────┘` ### Stripping characters from the ends Polars provides five functions in the namespace `str` that let you strip characters from the ends of the string: | Function | Behaviour | | --- | --- | | `strip_chars` | Removes leading and trailing occurrences of the characters specified. | | `strip_chars_end` | Removes trailing occurrences of the characters specified. | | `strip_chars_start` | Removes leading occurrences of the characters specified. | | `strip_prefix` | Removes an exact substring prefix if present. | | `strip_suffix` | Removes an exact substring suffix if present. | Similarity to Python string methods `strip_chars` is similar to Python's string method `strip` and `strip_prefix`/`strip_suffix` are similar to Python's string methods `removeprefix` and `removesuffix`, respectively. It is important to understand that the first three functions interpret their string argument as a set of characters whereas the functions `strip_prefix` and `strip_suffix` do interpret their string argument as a literal string. Python Rust [`str.strip_chars`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.strip_chars.html) · [`str.strip_chars_end`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.strip_chars_end.html) · [`str.strip_chars_start`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.strip_chars_start.html) · [`str.strip_prefix`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.strip_prefix.html) · [`str.strip_suffix`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.strip_suffix.html) `addr = pl.col("addresses") chars = ", 0123456789" result = addresses.select( addr.str.strip_chars(chars).alias("strip"), addr.str.strip_chars_end(chars).alias("end"), addr.str.strip_chars_start(chars).alias("start"), addr.str.strip_prefix("128 ").alias("prefix"), addr.str.strip_suffix(", 158").alias("suffix"), ) print(result)` [`str.strip_chars`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.strip_chars) · [`str.strip_chars_end`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.strip_chars_end) · [`str.strip_chars_start`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.strip_chars_start) · [`str.strip_prefix`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.strip_prefix) · [`str.strip_suffix`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.strip_suffix) `let addr = col("addresses"); let chars = lit(", 0123456789"); let result = addresses .lazy() .select([ addr.clone().str().strip_chars(chars.clone()).alias("strip"), addr.clone() .str() .strip_chars_end(chars.clone()) .alias("end"), addr.clone().str().strip_chars_start(chars).alias("start"), addr.clone().str().strip_prefix(lit("128 ")).alias("prefix"), addr.str().strip_suffix(lit(", 158")).alias("suffix"), ]) .collect()?; println!("{result}");` `shape: (4, 5) ┌───────────┬───────────────┬────────────────┬────────────────┬───────────────┐ │ strip ┆ end ┆ start ┆ prefix ┆ suffix │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ str ┆ str │ ╞═══════════╪═══════════════╪════════════════╪════════════════╪═══════════════╡ │ Perf St ┆ 128 Perf St ┆ Perf St ┆ Perf St ┆ 128 Perf St │ │ Rust Blvd ┆ Rust Blvd ┆ Rust Blvd, 158 ┆ Rust Blvd, 158 ┆ Rust Blvd │ │ Polars Av ┆ Polars Av ┆ Polars Av, 12 ┆ Polars Av, 12 ┆ Polars Av, 12 │ │ Query Sq ┆ 1042 Query Sq ┆ Query Sq ┆ 1042 Query Sq ┆ 1042 Query Sq │ └───────────┴───────────────┴────────────────┴────────────────┴───────────────┘` If no argument is provided, the three functions `strip_chars`, `strip_chars_end`, and `strip_chars_start`, remove whitespace by default. ### Slicing Besides [extracting substrings as specified by patterns](https://docs.pola.rs/user-guide/expressions/strings/#extract-a-pattern) , you can also slice strings at specified offsets to produce substrings. The general-purpose function for slicing is `slice` and it takes the starting offset and the optional _length_ of the slice. If the length of the slice is not specified or if it's past the end of the string, Polars slices the string all the way to the end. The functions `head` and `tail` are specialised versions used for slicing the beginning and end of a string, respectively. Python Rust [`str.slice`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.slice.html) · [`str.head`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.head.html) · [`str.tail`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.tail.html) `df = pl.DataFrame( { "fruits": ["pear", "mango", "dragonfruit", "passionfruit"], "n": [1, -1, 4, -4], } ) result = df.with_columns( pl.col("fruits").str.slice(pl.col("n")).alias("slice"), pl.col("fruits").str.head(pl.col("n")).alias("head"), pl.col("fruits").str.tail(pl.col("n")).alias("tail"), ) print(result)` [`str.str_slice`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.str_slice) · [`str.str_head`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.str_head) · [`str.str_tail`](https://docs.rs/polars/latest/polars/prelude/trait.StringNameSpaceImpl.html#method.str_tail) `let df = df! ( "fruits" => ["pear", "mango", "dragonfruit", "passionfruit"], "n" => [1, -1, 4, -4], )?; let result = df .lazy() .with_columns([ col("fruits") .str() .slice(col("n"), lit(NULL)) .alias("slice"), col("fruits").str().head(col("n")).alias("head"), col("fruits").str().tail(col("n")).alias("tail"), ]) .collect()?; println!("{result}");` `shape: (4, 5) ┌──────────────┬─────┬─────────┬──────────┬──────────┐ │ fruits ┆ n ┆ slice ┆ head ┆ tail │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str ┆ str ┆ str │ ╞══════════════╪═════╪═════════╪══════════╪══════════╡ │ pear ┆ 1 ┆ ear ┆ p ┆ r │ │ mango ┆ -1 ┆ o ┆ mang ┆ ango │ │ dragonfruit ┆ 4 ┆ onfruit ┆ drag ┆ ruit │ │ passionfruit ┆ -4 ┆ ruit ┆ passionf ┆ ionfruit │ └──────────────┴─────┴─────────┴──────────┴──────────┘` API documentation ----------------- In addition to the examples covered above, Polars offers various other string manipulation functions. To explore these additional methods, you can go to the API documentation of your chosen programming language for Polars. --- # Multiple - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/io/multiple/#dealing-with-multiple-files) Multiple ======== Dealing with multiple files. ---------------------------- Polars can deal with multiple files differently depending on your needs and memory strain. Let's create some files to give us some context: Python [`write_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_csv.html) `import polars as pl df = pl.DataFrame({"foo": [1, 2, 3], "bar": [None, "ham", "spam"]}) for i in range(5): df.write_csv(f"docs/assets/data/my_many_files_{i}.csv")` Reading into a single `DataFrame` --------------------------------- To read multiple files into a single `DataFrame`, we can use globbing patterns: Python [`read_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html) `df = pl.read_csv("docs/assets/data/my_many_files_*.csv") print(df)` `shape: (15, 2) ┌─────┬──────┐ │ foo ┆ bar │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪══════╡ │ 1 ┆ null │ │ 2 ┆ ham │ │ 3 ┆ spam │ │ 1 ┆ null │ │ 2 ┆ ham │ │ … ┆ … │ │ 2 ┆ ham │ │ 3 ┆ spam │ │ 1 ┆ null │ │ 2 ┆ ham │ │ 3 ┆ spam │ └─────┴──────┘` To see how this works we can take a look at the query plan. Below we see that all files are read separately and concatenated into a single `DataFrame`. Polars will try to parallelize the reading. Python [`show_graph`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.show_graph.html) `pl.scan_csv("docs/assets/data/my_many_files_*.csv").show_graph()` ![](data:image/png;base64, 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) Reading and processing in parallel ---------------------------------- If your files don't have to be in a single table you can also build a query plan for each file and execute them in parallel on the Polars thread pool. All query plan execution is embarrassingly parallel and doesn't require any communication. Python [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html) `import glob import polars as pl queries = [] for file in glob.glob("docs/assets/data/my_many_files_*.csv"): q = pl.scan_csv(file).group_by("bar").agg(pl.len(), pl.sum("foo")) queries.append(q) dataframes = pl.collect_all(queries) print(dataframes)` `[shape: (3, 3) ┌──────┬─────┬─────┐ │ bar ┆ len ┆ foo │ │ --- ┆ --- ┆ --- │ │ str ┆ u32 ┆ i64 │ ╞══════╪═════╪═════╡ │ ham ┆ 1 ┆ 2 │ │ null ┆ 1 ┆ 1 │ │ spam ┆ 1 ┆ 3 │ └──────┴─────┴─────┘, shape: (3, 3) ┌──────┬─────┬─────┐ │ bar ┆ len ┆ foo │ │ --- ┆ --- ┆ --- │ │ str ┆ u32 ┆ i64 │ ╞══════╪═════╪═════╡ │ ham ┆ 1 ┆ 2 │ │ null ┆ 1 ┆ 1 │ │ spam ┆ 1 ┆ 3 │ └──────┴─────┴─────┘, shape: (3, 3) ┌──────┬─────┬─────┐ │ bar ┆ len ┆ foo │ │ --- ┆ --- ┆ --- │ │ str ┆ u32 ┆ i64 │ ╞══════╪═════╪═════╡ │ ham ┆ 1 ┆ 2 │ │ null ┆ 1 ┆ 1 │ │ spam ┆ 1 ┆ 3 │ └──────┴─────┴─────┘, shape: (3, 3) ┌──────┬─────┬─────┐ │ bar ┆ len ┆ foo │ │ --- ┆ --- ┆ --- │ │ str ┆ u32 ┆ i64 │ ╞══════╪═════╪═════╡ │ ham ┆ 1 ┆ 2 │ │ null ┆ 1 ┆ 1 │ │ spam ┆ 1 ┆ 3 │ └──────┴─────┴─────┘, shape: (3, 3) ┌──────┬─────┬─────┐ │ bar ┆ len ┆ foo │ │ --- ┆ --- ┆ --- │ │ str ┆ u32 ┆ i64 │ ╞══════╪═════╪═════╡ │ ham ┆ 1 ┆ 2 │ │ null ┆ 1 ┆ 1 │ │ spam ┆ 1 ┆ 3 │ └──────┴─────┴─────┘]` --- # Lists and arrays - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/lists-and-arrays/#lists-and-arrays) Lists and arrays ================ Polars has first-class support for two homogeneous container data types: `List` and `Array`. Polars supports many operations with the two data types and their APIs overlap, so this section of the user guide has the objective of clarifying when one data type should be chosen in favour of the other. Lists vs arrays --------------- ### The data type `List` The data type list is suitable for columns whose values are homogeneous 1D containers of varying lengths. The dataframe below contains three examples of columns with the data type `List`: Python Rust [`List`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.List.html) `from datetime import datetime import polars as pl df = pl.DataFrame( { "names": [ ["Anne", "Averill", "Adams"], ["Brandon", "Brooke", "Borden", "Branson"], ["Camila", "Campbell"], ["Dennis", "Doyle"], ], "children_ages": [ [5, 7], [], [], [8, 11, 18], ], "medical_appointments": [ [], [], [], [datetime(2022, 5, 22, 16, 30)], ], } ) print(df)` [`List`](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.DataType.html#variant.List) `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (4, 3) ┌─────────────────────────────────┬───────────────┬───────────────────────┐ │ names ┆ children_ages ┆ medical_appointments │ │ --- ┆ --- ┆ --- │ │ list[str] ┆ list[i64] ┆ list[datetime[μs]] │ ╞═════════════════════════════════╪═══════════════╪═══════════════════════╡ │ ["Anne", "Averill", "Adams"] ┆ [5, 7] ┆ [] │ │ ["Brandon", "Brooke", … "Brans… ┆ [] ┆ [] │ │ ["Camila", "Campbell"] ┆ [] ┆ [] │ │ ["Dennis", "Doyle"] ┆ [8, 11, 18] ┆ [2022-05-22 16:30:00] │ └─────────────────────────────────┴───────────────┴───────────────────────┘`\ \ Note that the data type `List` is different from Python's type `list`, where elements can be of any type. If you want to store true Python lists in a column, you can do so with the data type `Object` and your column will not have the list manipulation features that we're about to discuss.\ \ ### The data type `Array`\ \ The data type `Array` is suitable for columns whose values are homogeneous containers of an arbitrary dimension with a known and fixed shape.\ \ The dataframe below contains two examples of columns with the data type `Array`.\ \ Python Rust\ \ [`Array`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Array.html)\ \ `df = pl.DataFrame( { "bit_flags": [ [True, True, True, True, False], [False, True, True, True, True], ], "tic_tac_toe": [ [ [" ", "x", "o"], [" ", "x", " "], ["o", "x", " "], ], [ ["o", "x", "x"], [" ", "o", "x"], [" ", " ", "o"], ], ], }, schema={ "bit_flags": pl.Array(pl.Boolean, 5), "tic_tac_toe": pl.Array(pl.String, (3, 3)), }, ) print(df)`\ \ [`Array`](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.DataType.html#variant.Array)\ · [Available on feature dtype-array](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-array")\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (2, 2) ┌───────────────────────┬─────────────────────────────────┐ │ bit_flags ┆ tic_tac_toe │ │ --- ┆ --- │ │ array[bool, 5] ┆ array[str, (3, 3)] │ ╞═══════════════════════╪═════════════════════════════════╡ │ [true, true, … false] ┆ [[" ", "x", "o"], [" ", "x", "… │ │ [false, true, … true] ┆ [["o", "x", "x"], [" ", "o", "… │ └───────────────────────┴─────────────────────────────────┘`\ \ The example above shows how to specify that the columns “bit\_flags” and “tic\_tac\_toe” have the data type `Array`, parametrised by the data type of the elements contained within and by the shape of each array.\ \ In general, Polars does not infer that a column has the data type `Array` for performance reasons, and defaults to the appropriate variant of the data type `List`. In Python, an exception to this rule is when you provide a NumPy array to build a column. In that case, Polars has the guarantee from NumPy that all subarrays have the same shape, so an array of \\(n + 1\\) dimensions will generate a column of \\(n\\) dimensional arrays:\ \ Python Rust\ \ [`Array`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Array.html)\ \ `import numpy as np array = np.arange(0, 120).reshape((5, 2, 3, 4)) # 4D array print(pl.Series(array).dtype) # Column with the 3D subarrays`\ \ [`Array`](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.DataType.html#variant.Array)\ · [Available on feature dtype-array](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-array")\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `Array(Int64, shape=(2, 3, 4))`\ \ ### When to use each\ \ In short, prefer the data type `Array` over `List` because it is more memory efficient and more performant. If you cannot use `Array`, then use `List`:\ \ * when the values within a column do not have a fixed shape; or\ * when you need functions that are only available in the list API.\ \ Working with lists\ ------------------\ \ ### The namespace `list`\ \ Polars provides many functions to work with values of the data type `List` and these are grouped inside the namespace `list`. We will explore this namespace a bit now.\ \ `arr` then, `list` now\ \ In previous versions of Polars, the namespace for list operations used to be `arr`. `arr` is now the namespace for the data type `Array`. If you find references to the namespace `arr` on StackOverflow or other sources, note that those sources _may_ be outdated.\ \ The dataframe `weather` defined below contains data from different weather stations across a region. When the weather station is unable to get a result, an error code is recorded instead of the actual temperature at that time.\ \ Python Rust\ \ `weather = pl.DataFrame( { "station": [f"Station {idx}" for idx in range(1, 6)], "temperatures": [ "20 5 5 E1 7 13 19 9 6 20", "18 8 16 11 23 E2 8 E2 E2 E2 90 70 40", "19 24 E9 16 6 12 10 22", "E2 E0 15 7 8 10 E1 24 17 13 6", "14 8 E0 16 22 24 E1", ], } ) print(weather)`\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (5, 2) ┌───────────┬─────────────────────────────────┐ │ station ┆ temperatures │ │ --- ┆ --- │ │ str ┆ str │ ╞═══════════╪═════════════════════════════════╡ │ Station 1 ┆ 20 5 5 E1 7 13 19 9 6 20 │ │ Station 2 ┆ 18 8 16 11 23 E2 8 E2 E2 E2 90… │ │ Station 3 ┆ 19 24 E9 16 6 12 10 22 │ │ Station 4 ┆ E2 E0 15 7 8 10 E1 24 17 13 6 │ │ Station 5 ┆ 14 8 E0 16 22 24 E1 │ └───────────┴─────────────────────────────────┘`\ \ ### Programmatically creating lists\ \ Given the dataframe `weather` defined previously, it is very likely we need to run some analysis on the temperatures that are captured by each station. To make this happen, we need to first be able to get individual temperature measurements. We [can use the namespace `str`](https://docs.pola.rs/user-guide/expressions/strings/#the-string-namespace)\ for this:\ \ Python Rust\ \ [`str.split`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.split.html)\ \ `weather = weather.with_columns( pl.col("temperatures").str.split(" "), ) print(weather)`\ \ [`str.split`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.split)\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (5, 2) ┌───────────┬──────────────────────┐ │ station ┆ temperatures │ │ --- ┆ --- │ │ str ┆ list[str] │ ╞═══════════╪══════════════════════╡ │ Station 1 ┆ ["20", "5", … "20"] │ │ Station 2 ┆ ["18", "8", … "40"] │ │ Station 3 ┆ ["19", "24", … "22"] │ │ Station 4 ┆ ["E2", "E0", … "6"] │ │ Station 5 ┆ ["14", "8", … "E1"] │ └───────────┴──────────────────────┘`\ \ A natural follow-up would be to explode the list of temperatures so that each measurement is in its own row:\ \ Python Rust\ \ [`explode`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.explode.html)\ \ `result = weather.explode("temperatures") print(result)`\ \ [`explode`](https://docs.rs/polars/latest/polars/frame/struct.DataFrame.html#method.explode)\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (49, 2) ┌───────────┬──────────────┐ │ station ┆ temperatures │ │ --- ┆ --- │ │ str ┆ str │ ╞═══════════╪══════════════╡ │ Station 1 ┆ 20 │ │ Station 1 ┆ 5 │ │ Station 1 ┆ 5 │ │ Station 1 ┆ E1 │ │ Station 1 ┆ 7 │ │ … ┆ … │ │ Station 5 ┆ E0 │ │ Station 5 ┆ 16 │ │ Station 5 ┆ 22 │ │ Station 5 ┆ 24 │ │ Station 5 ┆ E1 │ └───────────┴──────────────┘`\ \ However, in Polars we often do not need to do this to operate on the list elements.\ \ ### Operating on lists\ \ Polars provides several standard operations on columns with the `List` data type. [Similar to what you can do with strings](https://docs.pola.rs/user-guide/expressions/strings/#slicing)\ , lists can be sliced with the functions `head`, `tail`, and `slice`:\ \ Python Rust\ \ [`list namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/list.html)\ \ `result = weather.with_columns( pl.col("temperatures").list.head(3).alias("head"), pl.col("temperatures").list.tail(3).alias("tail"), pl.col("temperatures").list.slice(-3, 2).alias("two_next_to_last"), ) print(result)`\ \ [`list namespace`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ListNameSpace.html)\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (5, 5) ┌───────────┬──────────────────────┬────────────────────┬────────────────────┬──────────────────┐ │ station ┆ temperatures ┆ head ┆ tail ┆ two_next_to_last │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ list[str] ┆ list[str] ┆ list[str] ┆ list[str] │ ╞═══════════╪══════════════════════╪════════════════════╪════════════════════╪══════════════════╡ │ Station 1 ┆ ["20", "5", … "20"] ┆ ["20", "5", "5"] ┆ ["9", "6", "20"] ┆ ["9", "6"] │ │ Station 2 ┆ ["18", "8", … "40"] ┆ ["18", "8", "16"] ┆ ["90", "70", "40"] ┆ ["90", "70"] │ │ Station 3 ┆ ["19", "24", … "22"] ┆ ["19", "24", "E9"] ┆ ["12", "10", "22"] ┆ ["12", "10"] │ │ Station 4 ┆ ["E2", "E0", … "6"] ┆ ["E2", "E0", "15"] ┆ ["17", "13", "6"] ┆ ["17", "13"] │ │ Station 5 ┆ ["14", "8", … "E1"] ┆ ["14", "8", "E0"] ┆ ["22", "24", "E1"] ┆ ["22", "24"] │ └───────────┴──────────────────────┴────────────────────┴────────────────────┴──────────────────┘`\ \ ### Element-wise computation within lists\ \ If we need to identify the stations that are giving the most number of errors we need to\ \ 1. try to convert the measurements into numbers;\ 2. count the number of non-numeric values (i.e., `null` values) in the list, by row; and\ 3. rename this output column as “errors” so that we can easily identify the stations.\ \ To perform these steps, we need to perform a casting operation on each measurement within the list values. The function `eval` is used as the entry point to perform operations on the elements of the list. Within it, you can use the context `element` to refer to each single element of the list individually, and then you can use any Polars expression on the element:\ \ Python Rust\ \ [`element`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.element.html)\ \ `result = weather.with_columns( pl.col("temperatures") .list.eval(pl.element().cast(pl.Int64, strict=False).is_null()) .list.sum() .alias("errors"), ) print(result)`\ \ [`element`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.col.html)\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (5, 3) ┌───────────┬──────────────────────┬────────┐ │ station ┆ temperatures ┆ errors │ │ --- ┆ --- ┆ --- │ │ str ┆ list[str] ┆ u32 │ ╞═══════════╪══════════════════════╪════════╡ │ Station 1 ┆ ["20", "5", … "20"] ┆ 1 │ │ Station 2 ┆ ["18", "8", … "40"] ┆ 4 │ │ Station 3 ┆ ["19", "24", … "22"] ┆ 1 │ │ Station 4 ┆ ["E2", "E0", … "6"] ┆ 3 │ │ Station 5 ┆ ["14", "8", … "E1"] ┆ 2 │ └───────────┴──────────────────────┴────────┘`\ \ Another alternative would be to use a regular expression to check if a measurement starts with a letter:\ \ Python Rust\ \ [`element`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.element.html)\ \ `result2 = weather.with_columns( pl.col("temperatures") .list.eval(pl.element().str.contains("(?i)[a-z]")) .list.sum() .alias("errors"), ) print(result.equals(result2))`\ \ [`element`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.col.html)\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `True`\ \ If you are unfamiliar with the namespace `str` or the notation `(?i)` in the regex, now is a good time to [look at how to work with strings and regular expressions in Polars](https://docs.pola.rs/user-guide/expressions/strings/#check-for-the-existence-of-a-pattern)\ .\ \ ### Aggregation & sorting\ \ Like `select` on data frames, the two related functions `eval` and `agg` can also be used to aggregate over or sort the list elements.\ \ We'll reuse a slightly modified version of the example data from the very beginning:\ \ Python Rust\ \ [`List`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.List.html)\ \ `df = pl.DataFrame( { "children": [ [ {"name": "Anne", "age": 5}, {"name": "Averill", "age": 7}, ], [ {"name": "Brandon", "age": 12}, {"name": "Brooke", "age": 9}, {"name": "Branson", "age": 11}, ], [{"name": "Camila", "age": 19}], [ {"name": "Dennis", "age": 8}, {"name": "Doyle", "age": 11}, {"name": "Dina", "age": 18}, ], ], } ) print(df)`\ \ [`List`](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.DataType.html#variant.List)\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (4, 1) ┌─────────────────────────────────┐ │ children │ │ --- │ │ list[struct[2]] │ ╞═════════════════════════════════╡ │ [{"Anne",5}, {"Averill",7}] │ │ [{"Brandon",12}, {"Brooke",9},… │ │ [{"Camila",19}] │ │ [{"Dennis",8}, {"Doyle",11}, {… │ └─────────────────────────────────┘`\ \ Using `eval`, we can sort the list elements or compute some aggregations:\ \ Python Rust\ \ [`list.eval`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.list.eval.html)\ \ `result = df.select( pl.col("children") .list.eval( pl.element() .sort_by(pl.element().struct.field("age"), descending=True) .struct.field("name") ) .alias("names_by_age"), pl.col("children") .list.eval(pl.element().struct.field("age").min()) .alias("min_age"), pl.col("children") .list.eval(pl.element().struct.field("age").max()) .alias("max_age"), ) print(result)`\ \ [`list.eval`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/trait.ListNameSpaceExtension.html#method.eval)\ · [Available on feature list\_eval](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag list_eval")\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (4, 3) ┌─────────────────────────────────┬───────────┬───────────┐ │ names_by_age ┆ min_age ┆ max_age │ │ --- ┆ --- ┆ --- │ │ list[str] ┆ list[i64] ┆ list[i64] │ ╞═════════════════════════════════╪═══════════╪═══════════╡ │ ["Averill", "Anne"] ┆ [5] ┆ [7] │ │ ["Brandon", "Branson", "Brooke… ┆ [9] ┆ [12] │ │ ["Camila"] ┆ [19] ┆ [19] │ │ ["Dina", "Doyle", "Dennis"] ┆ [8] ┆ [18] │ └─────────────────────────────────┴───────────┴───────────┘`\ \ `eval` will always return a list. Use `agg` to get `min_age` and `max_age` as scalar values instead of single-element lists:\ \ Python Rust\ \ `result = df.select( pl.col("children") .list.eval( pl.element() .sort_by(pl.element().struct.field("age"), descending=True) .struct.field("name") ) .alias("names_by_age"), pl.col("children") .list.agg(pl.element().struct.field("age").min()) .alias("min_age"), pl.col("children") .list.agg(pl.element().struct.field("age").max()) .alias("max_age"), ) print(result)`\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (4, 3) ┌─────────────────────────────────┬─────────┬─────────┐ │ names_by_age ┆ min_age ┆ max_age │ │ --- ┆ --- ┆ --- │ │ list[str] ┆ i64 ┆ i64 │ ╞═════════════════════════════════╪═════════╪═════════╡ │ ["Averill", "Anne"] ┆ 5 ┆ 7 │ │ ["Brandon", "Branson", "Brooke… ┆ 9 ┆ 12 │ │ ["Camila"] ┆ 19 ┆ 19 │ │ ["Dina", "Doyle", "Dennis"] ┆ 8 ┆ 18 │ └─────────────────────────────────┴─────────┴─────────┘`\ \ If the evaluated expression is statically determined to return only one value, `agg` will automatically explode the resulting list into the inner values. This matches what `df.group_by(...).agg(...)` does, hence the name. This is in contrast with `eval`, which will not perform such unwrapping.\ \ While some aggregation functions like `.list.sum()` are directly available in the `list` namespace, you can access more exotic aggregations like `entropy` via `agg`/`eval` only:\ \ Python Rust\ \ `result = df.with_columns( pl.col("children") .list.agg(pl.element().struct.field("age").entropy()) .alias("age_entropy"), ) print(result)`\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (4, 2) ┌─────────────────────────────────┬─────────────┐ │ children ┆ age_entropy │ │ --- ┆ --- │ │ list[struct[2]] ┆ f64 │ ╞═════════════════════════════════╪═════════════╡ │ [{"Anne",5}, {"Averill",7}] ┆ 0.679193 │ │ [{"Brandon",12}, {"Brooke",9},… ┆ 1.09165 │ │ [{"Camila",19}] ┆ 0.0 │ │ [{"Dennis",8}, {"Doyle",11}, {… ┆ 1.042294 │ └─────────────────────────────────┴─────────────┘`\ \ ### Row-wise computations\ \ `pl.all()` can be combined with `pl.concat_list(...)` to perform row-wise aggregations over a subset of columns.\ \ To show this in action, we will start by creating another dataframe with some more weather data:\ \ Python Rust\ \ `weather_by_day = pl.DataFrame( { "station": [f"Station {idx}" for idx in range(1, 11)], "day_1": [17, 11, 8, 22, 9, 21, 20, 8, 8, 17], "day_2": [15, 11, 10, 8, 7, 14, 18, 21, 15, 13], "day_3": [16, 15, 24, 24, 8, 23, 19, 23, 16, 10], } ) print(weather_by_day)`\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (10, 4) ┌────────────┬───────┬───────┬───────┐ │ station ┆ day_1 ┆ day_2 ┆ day_3 │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 │ ╞════════════╪═══════╪═══════╪═══════╡ │ Station 1 ┆ 17 ┆ 15 ┆ 16 │ │ Station 2 ┆ 11 ┆ 11 ┆ 15 │ │ Station 3 ┆ 8 ┆ 10 ┆ 24 │ │ Station 4 ┆ 22 ┆ 8 ┆ 24 │ │ Station 5 ┆ 9 ┆ 7 ┆ 8 │ │ Station 6 ┆ 21 ┆ 14 ┆ 23 │ │ Station 7 ┆ 20 ┆ 18 ┆ 19 │ │ Station 8 ┆ 8 ┆ 21 ┆ 23 │ │ Station 9 ┆ 8 ┆ 15 ┆ 16 │ │ Station 10 ┆ 17 ┆ 13 ┆ 10 │ └────────────┴───────┴───────┴───────┘`\ \ Now, we will calculate the percentage rank of the temperatures by day, measured across stations. Polars does not provide a function to do this directly, but because expressions are so versatile we can create our own percentage rank expression for highest temperature. Let's try that:\ \ Python Rust\ \ [`element`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.element.html)\ · [`rank`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rank.html)\ \ ``rank_pct = (pl.element().rank(descending=True) / pl.element().count()).round(2) result = weather_by_day.with_columns( # create the list of homogeneous data pl.concat_list(pl.all().exclude("station")).alias("all_temps") ).select( # select all columns except the intermediate list pl.all().exclude("all_temps"), # compute the rank by calling `list.eval` pl.col("all_temps").list.eval(rank_pct, parallel=True).alias("temps_rank"), ) print(result)``\ \ [`element`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.col.html)\ · [`rank`](https://docs.rs/polars/latest/polars/prelude/enum.Expr.html#method.rank)\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (10, 5) ┌────────────┬───────┬───────┬───────┬────────────────────┐ │ station ┆ day_1 ┆ day_2 ┆ day_3 ┆ temps_rank │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 ┆ list[f64] │ ╞════════════╪═══════╪═══════╪═══════╪════════════════════╡ │ Station 1 ┆ 17 ┆ 15 ┆ 16 ┆ [0.33, 1.0, 0.67] │ │ Station 2 ┆ 11 ┆ 11 ┆ 15 ┆ [0.83, 0.83, 0.33] │ │ Station 3 ┆ 8 ┆ 10 ┆ 24 ┆ [1.0, 0.67, 0.33] │ │ Station 4 ┆ 22 ┆ 8 ┆ 24 ┆ [0.67, 1.0, 0.33] │ │ Station 5 ┆ 9 ┆ 7 ┆ 8 ┆ [0.33, 1.0, 0.67] │ │ Station 6 ┆ 21 ┆ 14 ┆ 23 ┆ [0.67, 1.0, 0.33] │ │ Station 7 ┆ 20 ┆ 18 ┆ 19 ┆ [0.33, 1.0, 0.67] │ │ Station 8 ┆ 8 ┆ 21 ┆ 23 ┆ [1.0, 0.67, 0.33] │ │ Station 9 ┆ 8 ┆ 15 ┆ 16 ┆ [1.0, 0.67, 0.33] │ │ Station 10 ┆ 17 ┆ 13 ┆ 10 ┆ [0.33, 0.67, 1.0] │ └────────────┴───────┴───────┴───────┴────────────────────┘`\ \ Working with arrays\ -------------------\ \ ### Creating an array column\ \ As [we have seen above](https://docs.pola.rs/user-guide/expressions/lists-and-arrays/#the-data-type-array)\ , Polars usually does not infer the data type `Array` automatically. You have to specify the data type `Array` when creating a series/dataframe or [cast a column](https://docs.pola.rs/user-guide/expressions/casting/)\ explicitly unless you create the column out of a NumPy array.\ \ ### The namespace `arr`\ \ The data type `Array` was recently introduced and is still pretty nascent in features that it offers. Even so, the namespace `arr` aggregates several functions that you can use to work with arrays.\ \ `arr` then, `list` now\ \ In previous versions of Polars, the namespace for list operations used to be `arr`. `arr` is now the namespace for the data type `Array`. If you find references to the namespace `arr` on StackOverflow or other sources, note that those sources _may_ be outdated.\ \ The API documentation should give you a good overview of the functions in the namespace `arr`, of which we present a couple:\ \ Python Rust\ \ [`arr namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/array.html)\ \ `df = pl.DataFrame( { "first_last": [ ["Anne", "Adams"], ["Brandon", "Branson"], ["Camila", "Campbell"], ["Dennis", "Doyle"], ], "fav_numbers": [ [42, 0, 1], [2, 3, 5], [13, 21, 34], [73, 3, 7], ], }, schema={ "first_last": pl.Array(pl.String, 2), "fav_numbers": pl.Array(pl.Int32, 3), }, ) result = df.select( pl.col("first_last").arr.join(" ").alias("name"), pl.col("fav_numbers").arr.sort(), pl.col("fav_numbers").arr.max().alias("largest_fav"), pl.col("fav_numbers").arr.sum().alias("summed"), pl.col("fav_numbers").arr.contains(3).alias("likes_3"), ) print(result)`\ \ [`` `arr `` namespace\`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html#method.arr)\ · [Available on feature dtype-array](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-array")\ \ `// Contribute the Rust translation of the Python example by opening a PR.`\ \ `shape: (4, 5) ┌─────────────────┬───────────────┬─────────────┬────────┬─────────┐ │ name ┆ fav_numbers ┆ largest_fav ┆ summed ┆ likes_3 │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ array[i32, 3] ┆ i32 ┆ i32 ┆ bool │ ╞═════════════════╪═══════════════╪═════════════╪════════╪═════════╡ │ Anne Adams ┆ [0, 1, 42] ┆ 42 ┆ 43 ┆ false │ │ Brandon Branson ┆ [2, 3, 5] ┆ 5 ┆ 10 ┆ true │ │ Camila Campbell ┆ [13, 21, 34] ┆ 34 ┆ 68 ┆ false │ │ Dennis Doyle ┆ [3, 7, 73] ┆ 73 ┆ 83 ┆ true │ └─────────────────┴───────────────┴─────────────┴────────┴─────────┘` --- # Introduction - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/sql/intro/#introduction) Introduction ============ While Polars supports interaction with SQL, it's recommended that users familiarize themselves with the [expression syntax](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/#expressions) to produce more readable and expressive code. As the DataFrame interface is primary, new features are typically added to the expression API first. However, if you already have an existing SQL codebase or prefer the use of SQL, Polars does offers support for this. Note There is no separate SQL engine because Polars translates SQL queries into [expressions](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/#expressions) , which are then executed using its own engine. This approach ensures that Polars maintains its performance and scalability advantages as a native DataFrame library, while still providing users with the ability to work with SQL. Context ------- Polars uses the `SQLContext` object to manage SQL queries. The context contains a mapping of `DataFrame` and `LazyFrame` identifier names to their corresponding datasets[1](https://docs.pola.rs/user-guide/sql/intro/#fn:1) . The example below starts a `SQLContext`: Python [`SQLContext`](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html#polars.SQLContext) `ctx = pl.SQLContext()` Register Dataframes ------------------- There are several ways to register DataFrames during `SQLContext` initialization. * register all `LazyFrame` and `DataFrame` objects in the global namespace. * register explicitly via a dictionary mapping, or kwargs. Python [`SQLContext`](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html#polars.SQLContext) `df = pl.DataFrame({"a": [1, 2, 3]}) lf = pl.LazyFrame({"b": [4, 5, 6]}) # Register all dataframes in the global namespace: registers both "df" and "lf" ctx = pl.SQLContext(register_globals=True) # Register an explicit mapping of identifier name to frame ctx = pl.SQLContext(frames={"table_one": df, "table_two": lf}) # Register frames using kwargs; dataframe df as "df" and lazyframe lf as "lf" ctx = pl.SQLContext(df=df, lf=lf)` We can also register Pandas DataFrames by converting them to Polars first. Python [`SQLContext`](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html#polars.SQLContext) `import pandas as pd df_pandas = pd.DataFrame({"c": [7, 8, 9]}) ctx = pl.SQLContext(df_pandas=pl.from_pandas(df_pandas))` Note Converting a Pandas DataFrame backed by Numpy will trigger a potentially expensive conversion; however, if the Pandas DataFrame is already backed by Arrow then the conversion will be significantly cheaper (and in some cases close to free). Once the `SQLContext` is initialized, we can register additional Dataframes or unregister existing Dataframes with: * `register` * `register_globals` * `register_many` * `unregister` Execute queries and collect results ----------------------------------- SQL queries are always executed in lazy mode to take advantage of the full set of query planning optimizations, so we have two options to collect the result: * Set the parameter `eager_execution` to True in `SQLContext`; this ensures that Polars automatically collects the LazyFrame results from `execute` calls. * Set the parameter `eager` to True when executing a query with `execute`, or explicitly collect the result using `collect`. We execute SQL queries by calling `execute` on a `SQLContext`. Python [`register`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.register.html#polars.SQLContext.register) · [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `# For local files use scan_csv instead pokemon = pl.read_csv( "https://gist.githubusercontent.com/ritchie46/cac6b337ea52281aa23c049250a4ff03/raw/89a957ff3919d90e6ef2d34235e6bf22304f3366/pokemon.csv" ) with pl.SQLContext(register_globals=True, eager=True) as ctx: df_small = ctx.execute("SELECT * from pokemon LIMIT 5") print(df_small)` `shape: (5, 13) ┌─────┬───────────────────────┬────────┬────────┬───┬─────────┬───────┬────────────┬───────────┐ │ # ┆ Name ┆ Type 1 ┆ Type 2 ┆ … ┆ Sp. Def ┆ Speed ┆ Generation ┆ Legendary │ │ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str ┆ str ┆ ┆ i64 ┆ i64 ┆ i64 ┆ bool │ ╞═════╪═══════════════════════╪════════╪════════╪═══╪═════════╪═══════╪════════════╪═══════════╡ │ 1 ┆ Bulbasaur ┆ Grass ┆ Poison ┆ … ┆ 65 ┆ 45 ┆ 1 ┆ false │ │ 2 ┆ Ivysaur ┆ Grass ┆ Poison ┆ … ┆ 80 ┆ 60 ┆ 1 ┆ false │ │ 3 ┆ Venusaur ┆ Grass ┆ Poison ┆ … ┆ 100 ┆ 80 ┆ 1 ┆ false │ │ 3 ┆ VenusaurMega Venusaur ┆ Grass ┆ Poison ┆ … ┆ 120 ┆ 80 ┆ 1 ┆ false │ │ 4 ┆ Charmander ┆ Fire ┆ null ┆ … ┆ 50 ┆ 65 ┆ 1 ┆ false │ └─────┴───────────────────────┴────────┴────────┴───┴─────────┴───────┴────────────┴───────────┘` Execute queries from multiple sources ------------------------------------- SQL queries can be executed just as easily from multiple sources. In the example below, we register: * a CSV file (loaded lazily) * a NDJSON file (loaded lazily) * a Pandas DataFrame And join them together using SQL. Lazy reading allows to only load the necessary rows and columns from the files. In the same way, it's possible to register cloud datalakes (S3, Azure Data Lake). A PyArrow dataset can point to the datalake, then Polars can read it with `scan_pyarrow_dataset`. Python [`register`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.register.html#polars.SQLContext.register) · [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `# Input data: # products_masterdata.csv with schema {'product_id': Int64, 'product_name': String} # products_categories.json with schema {'product_id': Int64, 'category': String} # sales_data is a Pandas DataFrame with schema {'product_id': Int64, 'sales': Int64} with pl.SQLContext( products_masterdata=pl.scan_csv("docs/assets/data/products_masterdata.csv"), products_categories=pl.scan_ndjson("docs/assets/data/products_categories.json"), sales_data=pl.from_pandas(sales_data), eager=True, ) as ctx: query = """ SELECT product_id, product_name, category, sales FROM products_masterdata LEFT JOIN products_categories USING (product_id) LEFT JOIN sales_data USING (product_id) """ print(ctx.execute(query))` `shape: (5, 4) ┌────────────┬──────────────┬────────────┬───────┐ │ product_id ┆ product_name ┆ category ┆ sales │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str ┆ i64 │ ╞════════════╪══════════════╪════════════╪═══════╡ │ 1 ┆ Product A ┆ Category 1 ┆ 100 │ │ 2 ┆ Product B ┆ Category 1 ┆ 200 │ │ 3 ┆ Product C ┆ Category 2 ┆ 150 │ │ 4 ┆ Product D ┆ Category 2 ┆ 250 │ │ 5 ┆ Product E ┆ Category 3 ┆ 300 │ └────────────┴──────────────┴────────────┴───────┘` Compatibility ------------- Polars does not support the complete SQL specification, but it does support a subset of the most common statement types. Note Where possible, Polars aims to follow PostgreSQL syntax definitions and function behaviour. For example, here is a non-exhaustive list of some of the supported functionality: * Write a `CREATE` statements: `CREATE TABLE xxx AS ...` * Write a `SELECT` statements containing:`WHERE`,`ORDER`,`LIMIT`,`GROUP BY`,`UNION` and `JOIN` clauses ... * Write Common Table Expressions (CTE's) such as: `WITH tablename AS` * Explain a query: `EXPLAIN SELECT ...` * List registered tables: `SHOW TABLES` * Drop a table: `DROP TABLE tablename` * Truncate a table: `TRUNCATE TABLE tablename` The following are some features that are not yet supported: * `INSERT`, `UPDATE` or `DELETE` statements * Meta queries such as `ANALYZE` In the upcoming sections we will cover each of the statements in more detail. * * * 1. Additionally it also tracks the [common table expressions](https://docs.pola.rs/user-guide/sql/cte/) as well. [↩](https://docs.pola.rs/user-guide/sql/intro/#fnref:1 "Jump back to footnote 1 in the text") --- # SELECT - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/sql/select/#select) SELECT ====== In Polars SQL, the `SELECT` statement is used to retrieve data from a table into a `DataFrame`. The basic syntax of a `SELECT` statement in Polars SQL is as follows: `SELECT column1, column2, ... FROM table_name;` Here, `column1`, `column2`, etc. are the columns that you want to select from the table. You can also use the wildcard `*` to select all columns. `table_name` is the name of the table or that you want to retrieve data from. In the sections below we will cover some of the more common SELECT variants Python [`register`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.register.html#polars.SQLContext.register) · [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `df = pl.DataFrame( { "country": ["USA", "USA", "USA", "USA", "USA", "Netherlands"], "city": [ "New York", "Los Angeles", "Chicago", "Houston", "Phoenix", "Amsterdam", ], "population": [8399000, 3997000, 2705000, 2320000, 1680000, 900000], } ) ctx = pl.SQLContext(population=df, eager=True) print(ctx.execute("SELECT * FROM population"))` `shape: (6, 3) ┌─────────────┬─────────────┬────────────┐ │ country ┆ city ┆ population │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞═════════════╪═════════════╪════════════╡ │ USA ┆ New York ┆ 8399000 │ │ USA ┆ Los Angeles ┆ 3997000 │ │ USA ┆ Chicago ┆ 2705000 │ │ USA ┆ Houston ┆ 2320000 │ │ USA ┆ Phoenix ┆ 1680000 │ │ Netherlands ┆ Amsterdam ┆ 900000 │ └─────────────┴─────────────┴────────────┘` ### GROUP BY The `GROUP BY` statement is used to group rows in a table by one or more columns and compute aggregate functions on each group. Python [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `result = ctx.execute( """ SELECT country, AVG(population) as avg_population FROM population GROUP BY country """ ) print(result)` `shape: (2, 2) ┌─────────────┬────────────────┐ │ country ┆ avg_population │ │ --- ┆ --- │ │ str ┆ f64 │ ╞═════════════╪════════════════╡ │ USA ┆ 3.8202e6 │ │ Netherlands ┆ 900000.0 │ └─────────────┴────────────────┘` ### ORDER BY The `ORDER BY` statement is used to sort the result set of a query by one or more columns in ascending or descending order. Python [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `result = ctx.execute( """ SELECT city, population FROM population ORDER BY population """ ) print(result)` `shape: (6, 2) ┌─────────────┬────────────┐ │ city ┆ population │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════════════╪════════════╡ │ Amsterdam ┆ 900000 │ │ Phoenix ┆ 1680000 │ │ Houston ┆ 2320000 │ │ Chicago ┆ 2705000 │ │ Los Angeles ┆ 3997000 │ │ New York ┆ 8399000 │ └─────────────┴────────────┘` ### JOIN Python [`register_many`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.register_many.html) · [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `income = pl.DataFrame( { "country": [ "USA", "USA", "USA", "USA", "Netherlands", "Netherlands", "Netherlands", ], "city": [ "New York", "Los Angeles", "Chicago", "Houston", "Amsterdam", "Rotterdam", "Utrecht", ], "income": [55000, 62000, 48000, 52000, 42000, 38000, 41000], } ) ctx.register_many(income=income) result = ctx.execute( """ SELECT income.*, population.population FROM population LEFT JOIN income ON population.city = income.city """ ) print(result)` `shape: (6, 4) ┌─────────────┬─────────────┬────────┬────────────┐ │ country ┆ city ┆ income ┆ population │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 ┆ i64 │ ╞═════════════╪═════════════╪════════╪════════════╡ │ USA ┆ New York ┆ 55000 ┆ 8399000 │ │ USA ┆ Los Angeles ┆ 62000 ┆ 3997000 │ │ USA ┆ Chicago ┆ 48000 ┆ 2705000 │ │ USA ┆ Houston ┆ 52000 ┆ 2320000 │ │ null ┆ null ┆ null ┆ 1680000 │ │ Netherlands ┆ Amsterdam ┆ 42000 ┆ 900000 │ └─────────────┴─────────────┴────────┴────────────┘` ### Functions Polars provides a wide range of SQL functions, including: * Mathematical functions: `ABS`, `EXP`, `LOG`, `ASIN`, `ACOS`, `ATAN`, etc. * String functions: `LOWER`, `UPPER`, `LTRIM`, `RTRIM`, `STARTS_WITH`,`ENDS_WITH`. * Aggregation functions: `SUM`, `AVG`, `MIN`, `MAX`, `COUNT`, `STDDEV`, `FIRST` etc. * Array functions: `EXPLODE`, `UNNEST`,`ARRAY_SUM`,`ARRAY_REVERSE`, etc. For a full list of supported functions go the [API documentation](https://docs.rs/polars-sql/latest/src/polars_sql/keywords.rs.html) . The example below demonstrates how to use a function in a query Python [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `result = ctx.execute( """ SELECT city, population FROM population WHERE STARTS_WITH(country,'U') """ ) print(result)` `shape: (5, 2) ┌─────────────┬────────────┐ │ city ┆ population │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════════════╪════════════╡ │ New York ┆ 8399000 │ │ Los Angeles ┆ 3997000 │ │ Chicago ┆ 2705000 │ │ Houston ┆ 2320000 │ │ Phoenix ┆ 1680000 │ └─────────────┴────────────┘` ### Table Functions In the examples earlier we first generated a DataFrame which we registered in the `SQLContext`. Polars also support directly reading from CSV, Parquet, JSON and IPC in your SQL query using table functions `read_xxx`. Python [`execute`](https://docs.pola.rs/api/python/stable/reference/sql/api/polars.SQLContext.execute.html) `result = ctx.execute( """ SELECT * FROM read_csv('docs/assets/data/iris.csv') """ ) print(result)` `shape: (150, 5) ┌──────────────┬─────────────┬──────────────┬─────────────┬───────────┐ │ sepal_length ┆ sepal_width ┆ petal_length ┆ petal_width ┆ species │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 ┆ f64 ┆ str │ ╞══════════════╪═════════════╪══════════════╪═════════════╪═══════════╡ │ 5.1 ┆ 3.5 ┆ 1.4 ┆ 0.2 ┆ Setosa │ │ 4.9 ┆ 3.0 ┆ 1.4 ┆ 0.2 ┆ Setosa │ │ 4.7 ┆ 3.2 ┆ 1.3 ┆ 0.2 ┆ Setosa │ │ 4.6 ┆ 3.1 ┆ 1.5 ┆ 0.2 ┆ Setosa │ │ 5.0 ┆ 3.6 ┆ 1.4 ┆ 0.2 ┆ Setosa │ │ … ┆ … ┆ … ┆ … ┆ … │ │ 6.7 ┆ 3.0 ┆ 5.2 ┆ 2.3 ┆ Virginica │ │ 6.3 ┆ 2.5 ┆ 5.0 ┆ 1.9 ┆ Virginica │ │ 6.5 ┆ 3.0 ┆ 5.2 ┆ 2.0 ┆ Virginica │ │ 6.2 ┆ 3.4 ┆ 5.4 ┆ 2.3 ┆ Virginica │ │ 5.9 ┆ 3.0 ┆ 5.1 ┆ 1.8 ┆ Virginica │ └──────────────┴─────────────┴──────────────┴─────────────┴───────────┘` --- # Coming from Pandas - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/migration/pandas/#coming-from-pandas) Coming from Pandas ================== Here we set out the key points that anyone who has experience with pandas and wants to try Polars should know. We include both differences in the concepts the libraries are built on and differences in how you should write Polars code compared to pandas code. Differences in concepts between Polars and pandas ------------------------------------------------- ### Polars does not have a multi-index/index pandas gives a label to each row with an index. Polars does not use an index and each row is indexed by its integer position in the table. Polars aims to have predictable results and readable queries, as such we think an index does not help us reach that objective. We believe the semantics of a query should not change by the state of an index or a `reset_index` call. In Polars a DataFrame will always be a 2D table with heterogeneous data-types. The data-types may have nesting, but the table itself will not. Operations like resampling will be done by specialized functions or methods that act like 'verbs' on a table explicitly stating the columns that 'verb' operates on. As such, it is our conviction that not having indices make things simpler, more explicit, more readable and less error-prone. Note that an 'index' data structure as known in databases will be used by Polars as an optimization technique. ### Polars adheres to the Apache Arrow memory format to represent data in memory while pandas uses NumPy arrays Polars represents data in memory according to the Arrow memory spec while pandas by default represents data in memory with NumPy arrays. Apache Arrow is an emerging standard for in-memory columnar analytics that can accelerate data load times, reduce memory usage and accelerate calculations. Polars can convert data to NumPy format with the `to_numpy` method. ### Polars has more support for parallel operations than pandas Polars exploits the strong support for concurrency in Rust to run many operations in parallel. While some operations in pandas are multi-threaded the core of the library is single-threaded and an additional library such as `Dask` must be used to parallelize operations. Polars is faster than all open source solutions that parallelize pandas code. ### Polars has support for different engines Polars has native support for an engine optimized for in-memory processing and a streaming engine optimized for large scale data processing. Furthermore Polars has native integration with a CuDF supported engine. All these engines benefit from Polars' query optimizer and Polars ensures semantic correctness between all those engines. In pandas the implementation can dispatch between numpy and Pyarrow, but because of pandas' loose strictness guarantees, the data-type outputs and semantics between those backends can differ. This can lead to subtle bugs. ### Polars can lazily evaluate queries and apply query optimization Eager evaluation is when code is evaluated as soon as you run the code. Lazy evaluation is when running a line of code means that the underlying logic is added to a query plan rather than being evaluated. Polars supports eager evaluation and lazy evaluation whereas pandas only supports eager evaluation. The lazy evaluation mode is powerful because Polars carries out automatic query optimization when it examines the query plan and looks for ways to accelerate the query or reduce memory usage. `Dask` also supports lazy evaluation when it generates a query plan. ### Polars is strict Polars is strict about data types. Data type resolution in Polars is dependent on the operation graph, whereas pandas converts types loosely (e.g. new missing data can lead to integer columns being converted to floats). This strictness leads to fewer bugs and more predictable behavior. ### Polars has a more versatile API Polars is built on expressions and allows expression inputs in almost all operations. This means that when you understand how expressions work, your knowledge in Polars extrapolates. Pandas doesn't have an expression system and often requires Python `lambda`s to express the complexity you want. Polars sees the requirement of a Python `lambda` as a lack of expressiveness of its API, and tries to give you native support whenever possible. Key syntax differences ---------------------- Users coming from pandas generally need to know one thing... `polars != pandas` If your Polars code looks like it could be pandas code, it might run, but it likely runs slower than it should. Let's go through some typical pandas code and see how we might rewrite it in Polars. ### Selecting data As there is no index in Polars there is no `.loc` or `iloc` method in Polars - and there is also no `SettingWithCopyWarning` in Polars. However, the best way to select data in Polars is to use the expression API. For example, if you want to select a column in pandas, you can do one of the following: `df["a"] df.loc[:,"a"]` but in Polars you would use the `.select` method: `df.select("a")` If you want to select rows based on the values then in Polars you use the `.filter` method: `df.filter(pl.col("a") < 10)` As noted in the section on expressions below, Polars can run operations in `.select` and `filter` in parallel and Polars can carry out query optimization on the full set of data selection criteria. ### Be lazy Working in lazy evaluation mode is straightforward and should be your default in Polars as the lazy mode allows Polars to do query optimization. We can run in lazy mode by either using an implicitly lazy function (such as `scan_csv`) or explicitly using the `lazy` method. Take the following simple example where we read a CSV file from disk and do a group by. The CSV file has numerous columns but we just want to do a group by on one of the id columns (`id1`) and then sum by a value column (`v1`). In pandas this would be: `df = pd.read_csv(csv_file, usecols=["id1","v1"]) grouped_df = df.loc[:,["id1","v1"]].groupby("id1").sum()` In Polars you can build this query in lazy mode with query optimization and evaluate it by replacing the eager pandas function `read_csv` with the implicitly lazy Polars function `scan_csv`: `df = pl.scan_csv(csv_file) grouped_df = df.group_by("id1").agg(pl.col("v1").sum()).collect()` Polars optimizes this query by identifying that only the `id1` and `v1` columns are relevant and so will only read these columns from the CSV. By calling the `.collect` method at the end of the second line we instruct Polars to eagerly evaluate the query. If you do want to run this query in eager mode you can just replace `scan_csv` with `read_csv` in the Polars code. Read more about working with lazy evaluation in the [lazy API](https://docs.pola.rs/user-guide/lazy/using/) section. ### Express yourself A typical pandas script consists of multiple data transformations that are executed sequentially. However, in Polars these transformations can be executed in parallel using expressions. #### Column assignment We have a dataframe `df` with a column called `value`. We want to add two new columns, a column called `tenXValue` where the `value` column is multiplied by 10 and a column called `hundredXValue` where the `value` column is multiplied by 100. In pandas this would be: `df.assign( tenXValue=lambda df_: df_.value * 10, hundredXValue=lambda df_: df_.value * 100 )` These column assignments are executed sequentially. In Polars we add columns to `df` using the `.with_columns` method: `df.with_columns( tenXValue=pl.col("value") * 10, hundredXValue=pl.col("value") * 100, )` These column assignments are executed in parallel. #### Column assignment based on predicate In this case we have a dataframe `df` with columns `a`,`b` and `c`. We want to re-assign the values in column `a` based on a condition. When the value in column `c` is equal to 2 then we replace the value in `a` with the value in `b`. In pandas this would be: `df.assign(a=lambda df_: df_["a"].mask(df_["c"] == 2, df_["b"]))` while in Polars this would be: `df.with_columns( pl.when(pl.col("c") == 2) .then(pl.col("b")) .otherwise(pl.col("a")).alias("a") )` Polars can compute every branch of an `if -> then -> otherwise` in parallel. This is valuable, when the branches get more expensive to compute. #### Filtering We want to filter the dataframe `df` with housing data based on some criteria. In pandas you filter the dataframe by passing Boolean expressions to the `query` method: `df.query("m2_living > 2500 and price < 300000")` or by directly evaluating a mask: `df[(df["m2_living"] > 2500) & (df["price"] < 300000)]` while in Polars you call the `filter` method: `df.filter( (pl.col("m2_living") > 2500) & (pl.col("price") < 300000) )` The query optimizer in Polars can also detect if you write multiple filters separately and combine them into a single filter in the optimized plan. pandas transform ---------------- The pandas documentation demonstrates an operation on a group by called `transform`. In this case we have a dataframe `df` and we want a new column showing the number of rows in each group. In pandas we have: `df = pd.DataFrame({ "c": [1, 1, 1, 2, 2, 2, 2], "type": ["m", "n", "o", "m", "m", "n", "n"], }) df["size"] = df.groupby("c")["type"].transform(len)` Here pandas does a group by on `"c"`, takes column `"type"`, computes the group length and then joins the result back to the original `DataFrame` producing: `c type size 0 1 m 3 1 1 n 3 2 1 o 3 3 2 m 4 4 2 m 4 5 2 n 4 6 2 n 4` In Polars the same can be achieved with `window` functions: `df.with_columns( pl.col("type").count().over("c").alias("size") )` `shape: (7, 3) ┌─────┬──────┬──────┐ │ c ┆ type ┆ size │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ u32 │ ╞═════╪══════╪══════╡ │ 1 ┆ m ┆ 3 │ │ 1 ┆ n ┆ 3 │ │ 1 ┆ o ┆ 3 │ │ 2 ┆ m ┆ 4 │ │ 2 ┆ m ┆ 4 │ │ 2 ┆ n ┆ 4 │ │ 2 ┆ n ┆ 4 │ └─────┴──────┴──────┘` Because we can store the whole operation in a single expression, we can combine several `window` functions and even combine different groups! Polars will cache window expressions that are applied over the same group, so storing them in a single `with_columns` is both convenient **and** optimal. In the following example we look at a case where we are calculating group statistics over `"c"` twice: `df.with_columns( pl.col("c").count().over("c").alias("size"), pl.col("c").sum().over("type").alias("sum"), pl.col("type").reverse().over("c").alias("reverse_type") )` `shape: (7, 5) ┌─────┬──────┬──────┬─────┬──────────────┐ │ c ┆ type ┆ size ┆ sum ┆ reverse_type │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ u32 ┆ i64 ┆ str │ ╞═════╪══════╪══════╪═════╪══════════════╡ │ 1 ┆ m ┆ 3 ┆ 5 ┆ o │ │ 1 ┆ n ┆ 3 ┆ 5 ┆ n │ │ 1 ┆ o ┆ 3 ┆ 1 ┆ m │ │ 2 ┆ m ┆ 4 ┆ 5 ┆ n │ │ 2 ┆ m ┆ 4 ┆ 5 ┆ n │ │ 2 ┆ n ┆ 4 ┆ 5 ┆ m │ │ 2 ┆ n ┆ 4 ┆ 5 ┆ m │ └─────┴──────┴──────┴─────┴──────────────┘` Missing data ------------ pandas uses `NaN` and/or `None` values to indicate missing values depending on the dtype of the column. In addition the behaviour in pandas varies depending on whether the default dtypes or optional nullable arrays are used. In Polars missing data corresponds to a `null` value for all data types. For float columns Polars permits the use of `NaN` values. These `NaN` values are not considered to be missing data but instead a special floating point value. In pandas an integer column with missing values is cast to be a float column with `NaN` values for the missing values (unless using optional nullable integer dtypes). In Polars any missing values in an integer column are simply `null` values and the column remains an integer column. See the [missing data](https://docs.pola.rs/user-guide/expressions/missing-data/) section for more details. Pipe littering -------------- A common usage in pandas is utilizing `pipe` to apply some function to a `DataFrame`. Copying this coding style to Polars is unidiomatic and leads to suboptimal query plans. The snippet below shows a common pattern in pandas. `def add_foo(df: pd.DataFrame) -> pd.DataFrame: df["foo"] = ... return df def add_bar(df: pd.DataFrame) -> pd.DataFrame: df["bar"] = ... return df def add_ham(df: pd.DataFrame) -> pd.DataFrame: df["ham"] = ... return df (df .pipe(add_foo) .pipe(add_bar) .pipe(add_ham) )` If we do this in polars, we would create 3 `with_columns` contexts, that forces Polars to run the 3 pipes sequentially, utilizing zero parallelism. The way to get similar abstractions in polars is creating functions that create expressions. The snippet below creates 3 expressions that run on a single context and thus are allowed to run in parallel. `def get_foo(input_column: str) -> pl.Expr: return pl.col(input_column).some_computation().alias("foo") def get_bar(input_column: str) -> pl.Expr: return pl.col(input_column).some_computation().alias("bar") def get_ham(input_column: str) -> pl.Expr: return pl.col(input_column).some_computation().alias("ham") # This single context will run all 3 expressions in parallel df.with_columns( get_ham("col_a"), get_bar("col_b"), get_foo("col_c"), )` If you need the schema in the functions that generate the expressions, you can utilize a single `pipe`: `from collections import OrderedDict def get_foo(input_column: str, schema: OrderedDict) -> pl.Expr: if "some_col" in schema: # branch_a ... else: # branch b ... def get_bar(input_column: str, schema: OrderedDict) -> pl.Expr: if "some_col" in schema: # branch_a ... else: # branch b ... def get_ham(input_column: str) -> pl.Expr: return pl.col(input_column).some_computation().alias("ham") # Use pipe (just once) to get hold of the schema of the LazyFrame. lf.pipe(lambda lf: lf.with_columns( get_ham("col_a"), get_bar("col_b", lf.schema), get_foo("col_c", lf.schema), )` Another benefit of writing functions that return expressions, is that these functions are composable as expressions can be chained and partially applied, leading to much more flexibility in the design. --- # Expression Plugins - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/plugins/expr_plugins/#expression-plugins) Expression Plugins ================== Expression plugins are the preferred way to create user defined functions. They allow you to compile a Rust function and register that as an expression into the Polars library. The Polars engine will dynamically link your function at runtime and your expression will run almost as fast as native expressions. Note that this works without any interference of Python and thus no GIL contention. They will benefit from the same benefits default expressions have: * Optimization * Parallelism * Rust native performance To get started we will see what is needed to create a custom expression. Our first custom expression: Pig Latin -------------------------------------- For our first expression we are going to create a pig latin converter. Pig latin is a silly language where in every word the first letter is removed, added to the back and finally "ay" is added. So the word "pig" would convert to "igpay". We could of course already do that with expressions, e.g. `col("name").str.slice(1) + col("name").str.slice(0, 1) + "ay"`, but a specialized function for this would perform better and allows us to learn about the plugins. ### Setting up We start with a new library as the following `Cargo.toml` file `[package] name = "expression_lib" version = "0.1.0" edition = "2021" [lib] name = "expression_lib" crate-type = ["cdylib"] [dependencies] polars = { version = "*" } pyo3 = { version = "*", features = ["extension-module", "abi3-py310"] } pyo3-polars = { version = "*", features = ["derive"] } serde = { version = "*", features = ["derive"] }` ### Writing the expression In this library we create a helper function that converts a `&str` to pig-latin, and we create the function that we will expose as an expression. To expose a function we must add the `#[polars_expr(output_type=DataType)]` attribute and the function must always accept `inputs: &[Series]` as its first argument. `// src/expressions.rs use polars::prelude::*; use pyo3_polars::derive::polars_expr; use std::fmt::Write; fn pig_latin_str(value: &str, output: &mut String) { if let Some(first_char) = value.chars().next() { write!(output, "{}{}ay", &value[1..], first_char).unwrap() } } #[polars_expr(output_type=String)] fn pig_latinnify(inputs: &[Series]) -> PolarsResult { let ca = inputs[0].str()?; let out: StringChunked = ca.apply_into_string_amortized(pig_latin_str); Ok(out.into_series()) }` Note that we use `apply_into_string_amortized`, as opposed to `apply_values`, to avoid allocating a new string for each row. If your plugin takes in multiple inputs, operates elementwise, and produces a `String` output, then you may want to look at the `binary_elementwise_into_string_amortized` utility function in `polars::prelude::arity`. This is all that is needed on the Rust side. On the Python side we must setup a folder with the same name as defined in the `Cargo.toml`, in this case "expression\_lib". We will create a folder in the same directory as our Rust `src` folder named `expression_lib` and we create an `expression_lib/__init__.py`. The resulting file structure should look something like this: `├── 📁 expression_lib/ # name must match "lib.name" in Cargo.toml | └── __init__.py | ├── 📁src/ | ├── lib.rs | └── expressions.rs | ├── Cargo.toml └── pyproject.toml` Then we create new expressions. The function name of our expression can be registered. Note that it is important that this name is correct, otherwise the main Polars package cannot resolve the function name. Furthermore we can set additional keyword arguments that explain to Polars how this expression behaves. In this case we tell Polars that this function is elementwise. This allows Polars to run this expression in batches. Whereas for other operations this would not be allowed, think for instance of a sort, or a slice. `# expression_lib/__init__.py from pathlib import Path from typing import TYPE_CHECKING import polars as pl from polars.plugins import register_plugin_function from polars._typing import IntoExpr PLUGIN_PATH = Path(__file__).parent def pig_latinnify(expr: IntoExpr) -> pl.Expr: """Pig-latinnify expression.""" return register_plugin_function( plugin_path=PLUGIN_PATH, function_name="pig_latinnify", args=expr, is_elementwise=True, )` We can then compile this library in our environment by installing `maturin` and running `maturin develop --release`. And that's it. Our expression is ready to use! `import polars as pl from expression_lib import pig_latinnify df = pl.DataFrame( { "convert": ["pig", "latin", "is", "silly"], } ) out = df.with_columns(pig_latin=pig_latinnify("convert"))` Alternatively, you can [register a custom namespace](https://docs.pola.rs/api/python/stable/reference/api/polars.api.register_expr_namespace.html#polars.api.register_expr_namespace) , which enables you to create a `Expr.language` namespace, allowing users to write: `out = df.with_columns( pig_latin=pl.col("convert").language.pig_latinnify(), )` Accepting kwargs ---------------- If you want to accept `kwargs` (keyword arguments) in a polars expression, all you have to do is define a Rust `struct` and make sure that it derives `serde::Deserialize`. ``/// Provide your own kwargs struct with the proper schema and accept that type /// in your plugin expression. #[derive(Deserialize)] pub struct MyKwargs { float_arg: f64, integer_arg: i64, string_arg: String, boolean_arg: bool, } /// If you want to accept `kwargs`. You define a `kwargs` argument /// on the second position in you plugin. You can provide any custom struct that is deserializable /// with the pickle protocol (on the Rust side). #[polars_expr(output_type=String)] fn append_kwargs(input: &[Series], kwargs: MyKwargs) -> PolarsResult { let input = &input[0]; let input = input.cast(&DataType::String)?; let ca = input.str().unwrap(); Ok(ca .apply_into_string_amortized(|val, buf| { write!( buf, "{}-{}-{}-{}-{}", val, kwargs.float_arg, kwargs.integer_arg, kwargs.string_arg, kwargs.boolean_arg ) .unwrap() }) .into_series()) }`` On the Python side the kwargs can be passed when we register the plugin. ``def append_args( expr: IntoExpr, float_arg: float, integer_arg: int, string_arg: str, boolean_arg: bool, ) -> pl.Expr: """ This example shows how arguments other than `Series` can be used. """ return register_plugin_function( plugin_path=PLUGIN_PATH, function_name="append_kwargs", args=expr, kwargs={ "float_arg": float_arg, "integer_arg": integer_arg, "string_arg": string_arg, "boolean_arg": boolean_arg, }, is_elementwise=True, )`` Output data types ----------------- Output data types of course don't have to be fixed. They often depend on the input types of an expression. To accommodate this you can provide the `#[polars_expr()]` macro with an `output_type_func` argument that points to a function. This function can map input fields `&[Field]` to an output `Field` (name and data type). In the snippet below is an example where we use the utility `FieldsMapper` to help with this mapping. `use polars_plan::dsl::FieldsMapper; fn haversine_output(input_fields: &[Field]) -> PolarsResult { FieldsMapper::new(input_fields).map_to_float_dtype() } #[polars_expr(output_type_func=haversine_output)] fn haversine(inputs: &[Series]) -> PolarsResult { let out = match inputs[0].dtype() { DataType::Float32 => { let start_lat = inputs[0].f32().unwrap(); let start_long = inputs[1].f32().unwrap(); let end_lat = inputs[2].f32().unwrap(); let end_long = inputs[3].f32().unwrap(); crate::distances::naive_haversine(start_lat, start_long, end_lat, end_long)? .into_series() } DataType::Float64 => { let start_lat = inputs[0].f64().unwrap(); let start_long = inputs[1].f64().unwrap(); let end_lat = inputs[2].f64().unwrap(); let end_long = inputs[3].f64().unwrap(); crate::distances::naive_haversine(start_lat, start_long, end_lat, end_long)? .into_series() } _ => polars_bail!(InvalidOperation: "only supported for float types"), }; Ok(out) }` That's all you need to know to get started. Take a look at [this repo](https://github.com/pola-rs/pyo3-polars/tree/main/example/derive_expression) to see how this all fits together, and at [this tutorial](https://marcogorelli.github.io/polars-plugins-tutorial/) to gain a more thorough understanding. --- # Structs - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/structs/#structs) Structs ======= The data type `Struct` is a composite data type that can store multiple fields in a single column. Python analogy For Python users, the data type `Struct` is kind of like a Python dictionary. Even better, if you are familiar with Python typing, you can think of the data type `Struct` as `typing.TypedDict`. In this page of the user guide we will see situations in which the data type `Struct` arises, we will understand why it does arise, and we will see how to work with `Struct` values. Let's start with a dataframe that captures the average rating of a few movies across some states in the US: Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) `import polars as pl ratings = pl.DataFrame( { "Movie": ["Cars", "IT", "ET", "Cars", "Up", "IT", "Cars", "ET", "Up", "Cars"], "Theatre": ["NE", "ME", "IL", "ND", "NE", "SD", "NE", "IL", "IL", "NE"], "Avg_Rating": [4.5, 4.4, 4.6, 4.3, 4.8, 4.7, 4.5, 4.9, 4.7, 4.6], "Count": [30, 27, 26, 29, 31, 28, 28, 26, 33, 28], } ) print(ratings)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) `use polars::prelude::*; let ratings = df!( "Movie"=> ["Cars", "IT", "ET", "Cars", "Up", "IT", "Cars", "ET", "Up", "Cars"], "Theatre"=> ["NE", "ME", "IL", "ND", "NE", "SD", "NE", "IL", "IL", "NE"], "Avg_Rating"=> [4.5, 4.4, 4.6, 4.3, 4.8, 4.7, 4.5, 4.9, 4.7, 4.6], "Count"=> [30, 27, 26, 29, 31, 28, 28, 26, 33, 28], )?; println!("{}", &ratings);` `shape: (10, 4) ┌───────┬─────────┬────────────┬───────┐ │ Movie ┆ Theatre ┆ Avg_Rating ┆ Count │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 ┆ i64 │ ╞═══════╪═════════╪════════════╪═══════╡ │ Cars ┆ NE ┆ 4.5 ┆ 30 │ │ IT ┆ ME ┆ 4.4 ┆ 27 │ │ ET ┆ IL ┆ 4.6 ┆ 26 │ │ Cars ┆ ND ┆ 4.3 ┆ 29 │ │ Up ┆ NE ┆ 4.8 ┆ 31 │ │ IT ┆ SD ┆ 4.7 ┆ 28 │ │ Cars ┆ NE ┆ 4.5 ┆ 28 │ │ ET ┆ IL ┆ 4.9 ┆ 26 │ │ Up ┆ IL ┆ 4.7 ┆ 33 │ │ Cars ┆ NE ┆ 4.6 ┆ 28 │ └───────┴─────────┴────────────┴───────┘` Encountering the data type `Struct` ----------------------------------- A common operation that will lead to a `Struct` column is the ever so popular `value_counts` function that is commonly used in exploratory data analysis. Checking the number of times a state appears in the data is done as so: Python Rust [`value_counts`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.value_counts.html) `result = ratings.select(pl.col("Theatre").value_counts(sort=True)) print(result)` [`value_counts`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.value_counts) · [Available on feature dtype-struct](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-struct") `let result = ratings .clone() .lazy() .select([col("Theatre").value_counts(true, true, "count", false)]) .collect()?; println!("{result}");` `shape: (5, 1) ┌───────────┐ │ Theatre │ │ --- │ │ struct[2] │ ╞═══════════╡ │ {"NE",4} │ │ {"IL",3} │ │ {"ME",1} │ │ {"ND",1} │ │ {"SD",1} │ └───────────┘` Quite unexpected an output, especially if coming from tools that do not have such a data type. We're not in peril, though. To get back to a more familiar output, all we need to do is use the function `unnest` on the `Struct` column: Python Rust [`unnest`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.unnest.html) `result = ratings.select(pl.col("Theatre").value_counts(sort=True)).unnest("Theatre") print(result)` [`unnest`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html#method.unnest) `let result = ratings .clone() .lazy() .select([col("Theatre").value_counts(true, true, "count", false)]) .unnest(by_name(["Theatre"], true), None) .collect()?; println!("{result}");` `shape: (5, 2) ┌─────────┬───────┐ │ Theatre ┆ count │ │ --- ┆ --- │ │ str ┆ u32 │ ╞═════════╪═══════╡ │ NE ┆ 4 │ │ IL ┆ 3 │ │ ME ┆ 1 │ │ ND ┆ 1 │ │ SD ┆ 1 │ └─────────┴───────┘` The function `unnest` will turn each field of the `Struct` into its own column. Why `value_counts` returns a `Struct` Polars expressions always operate on a single series and return another series. `Struct` is the data type that allows us to provide multiple columns as input to an expression, or to output multiple columns from an expression. Thus, we can use the data type `Struct` to specify each value and its count when we use `value_counts`. Inferring the data type `Struct` from dictionaries -------------------------------------------------- When building series or dataframes, Polars will convert dictionaries to the data type `Struct`: Python Rust [`Series`](https://docs.pola.rs/api/python/stable/reference/series/index.html) `rating_series = pl.Series( "ratings", [ {"Movie": "Cars", "Theatre": "NE", "Avg_Rating": 4.5}, {"Movie": "Toy Story", "Theatre": "ME", "Avg_Rating": 4.9}, ], ) print(rating_series)` [`Series`](https://docs.pola.rs/api/rust/dev/polars/series/struct.Series.html) `// Don't think we can make it the same way in rust, but this works let rating_series = df!( "Movie" => &["Cars", "Toy Story"], "Theatre" => &["NE", "ME"], "Avg_Rating" => &[4.5, 4.9], )? .into_struct("ratings".into()) .into_series(); println!("{}", &rating_series);` `shape: (2,) Series: 'ratings' [struct[3]] [ {"Cars","NE",4.5} {"Toy Story","ME",4.9} ]` The number of fields, their names, and their types, are inferred from the first dictionary seen. Subsequent incongruences can result in `null` values or in errors: Python Rust [`Series`](https://docs.pola.rs/api/python/stable/reference/series/index.html) ``null_rating_series = pl.Series( "ratings", [ {"Movie": "Cars", "Theatre": "NE", "Avg_Rating": 4.5}, {"Mov": "Toy Story", "Theatre": "ME", "Avg_Rating": 4.9}, {"Movie": "Snow White", "Theatre": "IL", "Avg_Rating": "4.7"}, ], strict=False, # To show the final structs with `null` values. ) print(null_rating_series)`` [`Series`](https://docs.pola.rs/api/rust/dev/polars/series/struct.Series.html) `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (3,) Series: 'ratings' [struct[4]] [ {"Cars","NE","4.5",null} {null,"ME","4.9","Toy Story"} {"Snow White","IL","4.7",null} ]` Extracting individual values of a `Struct` ------------------------------------------ Let's say that we needed to obtain just the field `"Movie"` from the `Struct` in the series that we created above. We can use the function `field` to do so: Python Rust [`struct.field`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.struct.field.html) `result = rating_series.struct.field("Movie") print(result)` [`struct.field_by_name`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.StructNameSpace.html#method.field_by_name) `let result = rating_series.struct_()?.field_by_name("Movie")?; println!("{result}");` `shape: (2,) Series: 'Movie' [str] [ "Cars" "Toy Story" ]` Renaming individual fields of a `Struct` ---------------------------------------- What if we need to rename individual fields of a `Struct` column? We use the function `rename_fields`: Python Rust [`struct.rename_fields`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.struct.rename_fields.html) `result = rating_series.struct.rename_fields(["Film", "State", "Value"]) print(result)` [`struct.rename_fields`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.StructNameSpace.html#method.rename_fields) `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (2,) Series: 'ratings' [struct[3]] [ {"Cars","NE",4.5} {"Toy Story","ME",4.9} ]` To be able to actually see that the field names were changed, we will create a dataframe where the only column is the result and then we use the function `unnest` so that each field becomes its own column. The column names will reflect the renaming operation we just did: Python Rust [`struct.rename_fields`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.struct.rename_fields.html) `print( result.to_frame().unnest("ratings"), )` [`struct.rename_fields`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.StructNameSpace.html#method.rename_fields) `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (2, 3) ┌───────────┬───────┬───────┐ │ Film ┆ State ┆ Value │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 │ ╞═══════════╪═══════╪═══════╡ │ Cars ┆ NE ┆ 4.5 │ │ Toy Story ┆ ME ┆ 4.9 │ └───────────┴───────┴───────┘` Practical use-cases of `Struct` columns --------------------------------------- ### Identifying duplicate rows Let's get back to the `ratings` data. We want to identify cases where there are duplicates at a “Movie” and “Theatre” level. This is where the data type `Struct` shines: Python Rust [`is_duplicated`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_duplicated.html) · [`struct`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.struct.html) `result = ratings.filter(pl.struct("Movie", "Theatre").is_duplicated()) print(result)` [`is_duplicated`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.is_duplicated) · [`Struct`](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.DataType.html#variant.Struct) · [Available on feature dtype-struct](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-struct") `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (5, 4) ┌───────┬─────────┬────────────┬───────┐ │ Movie ┆ Theatre ┆ Avg_Rating ┆ Count │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 ┆ i64 │ ╞═══════╪═════════╪════════════╪═══════╡ │ Cars ┆ NE ┆ 4.5 ┆ 30 │ │ ET ┆ IL ┆ 4.6 ┆ 26 │ │ Cars ┆ NE ┆ 4.5 ┆ 28 │ │ ET ┆ IL ┆ 4.9 ┆ 26 │ │ Cars ┆ NE ┆ 4.6 ┆ 28 │ └───────┴─────────┴────────────┴───────┘` We can identify the unique cases at this level also with `is_unique`! ### Multi-column ranking Suppose, given that we know there are duplicates, we want to choose which rating gets a higher priority. We can say that the column “Count” is the most important, and if there is a tie in the column “Count” then we consider the column “Avg\_Rating”. We can then do: Python Rust [`is_duplicated`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_duplicated.html) · [`struct`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.struct.html) `result = ratings.with_columns( pl.struct("Count", "Avg_Rating") .rank("dense", descending=True) .over("Movie", "Theatre") .alias("Rank") ).filter(pl.struct("Movie", "Theatre").is_duplicated()) print(result)` [`is_duplicated`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.is_duplicated) · [`Struct`](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.DataType.html#variant.Struct) · [Available on feature dtype-struct](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-struct") `let result = ratings .lazy() .with_columns([as_struct(vec![col("Count"), col("Avg_Rating")]) .rank( RankOptions { method: RankMethod::Dense, descending: true, }, None, ) .over([col("Movie"), col("Theatre")]) .alias("Rank")]) // .filter(as_struct(&[col("Movie"), col("Theatre")]).is_duplicated()) // Error: .is_duplicated() not available if you try that // https://github.com/pola-rs/polars/issues/3803 .filter(len().over([col("Movie"), col("Theatre")]).gt(lit(1))) .collect()?; println!("{result}");` `shape: (5, 5) ┌───────┬─────────┬────────────┬───────┬──────┐ │ Movie ┆ Theatre ┆ Avg_Rating ┆ Count ┆ Rank │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 ┆ i64 ┆ u32 │ ╞═══════╪═════════╪════════════╪═══════╪══════╡ │ Cars ┆ NE ┆ 4.5 ┆ 30 ┆ 1 │ │ ET ┆ IL ┆ 4.6 ┆ 26 ┆ 2 │ │ Cars ┆ NE ┆ 4.5 ┆ 28 ┆ 3 │ │ ET ┆ IL ┆ 4.9 ┆ 26 ┆ 1 │ │ Cars ┆ NE ┆ 4.6 ┆ 28 ┆ 2 │ └───────┴─────────┴────────────┴───────┴──────┘` That's a pretty complex set of requirements done very elegantly in Polars! To learn more about the function `over`, used above, [see the user guide section on window functions](https://docs.pola.rs/user-guide/expressions/window-functions/) . ### Using multiple columns in a single expression As mentioned earlier, the data type `Struct` is also useful if you need to pass multiple columns as input to an expression. As an example, suppose we want to compute [the Ackermann function](https://en.wikipedia.org/wiki/Ackermann_function) on two columns of a dataframe. There is no way of composing Polars expressions to compute the Ackermann function[1](https://docs.pola.rs/user-guide/expressions/structs/#fn:1) , so we define a custom function: Python Rust `def ack(m, n): if not m: return n + 1 if not n: return ack(m - 1, 1) return ack(m - 1, ack(m, n - 1))` `// Contribute the Rust translation of the Python example by opening a PR.` Now, to compute the values of the Ackermann function on those arguments, we start by creating a `Struct` with fields `m` and `n` and then use the function `map_elements` to apply the function `ack` to each value: Python Rust [`map_elements`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.map_elements.html) `values = pl.DataFrame( { "m": [0, 0, 0, 1, 1, 1, 2], "n": [2, 3, 4, 1, 2, 3, 1], } ) result = values.with_columns( pl.struct(["m", "n"]) .map_elements(lambda s: ack(s["m"], s["n"]), return_dtype=pl.Int64) .alias("ack") ) print(result)` `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (7, 3) ┌─────┬─────┬─────┐ │ m ┆ n ┆ ack │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ 0 ┆ 2 ┆ 3 │ │ 0 ┆ 3 ┆ 4 │ │ 0 ┆ 4 ┆ 5 │ │ 1 ┆ 1 ┆ 3 │ │ 1 ┆ 2 ┆ 4 │ │ 1 ┆ 3 ┆ 5 │ │ 2 ┆ 1 ┆ 5 │ └─────┴─────┴─────┘` Refer to [this section of the user guide to learn more about applying user-defined Python functions to your data](https://docs.pola.rs/user-guide/expressions/user-defined-python-functions/) . * * * 1. To say that something cannot be done is quite a bold claim. If you prove us wrong, please let us know! [↩](https://docs.pola.rs/user-guide/expressions/structs/#fnref:1 "Jump back to footnote 1 in the text") --- # Pivots - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/transformations/pivot/#pivots) Pivots ====== Pivot a column in a `DataFrame` and perform one of the following aggregations: * first * last * sum * min * max * mean * median * len The pivot operation consists of a group by one, or multiple columns (these will be the new y-axis), the column that will be pivoted (this will be the new x-axis) and an aggregation. Dataset ------- Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) `df = pl.DataFrame( { "foo": ["A", "A", "B", "B", "C"], "N": [1, 2, 2, 4, 2], "bar": ["k", "l", "m", "n", "o"], } ) print(df)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) `let df = df!( "foo"=> ["A", "A", "B", "B", "C"], "bar"=> ["k", "l", "m", "n", "o"], "N"=> [1, 2, 2, 4, 2], )?; println!("{}", &df);` `shape: (5, 3) ┌─────┬─────┬─────┐ │ foo ┆ N ┆ bar │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ A ┆ 1 ┆ k │ │ A ┆ 2 ┆ l │ │ B ┆ 2 ┆ m │ │ B ┆ 4 ┆ n │ │ C ┆ 2 ┆ o │ └─────┴─────┴─────┘` Eager ----- Python Rust [`pivot`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.pivot.html) `out = df.pivot("bar", index="foo", values="N", aggregate_function="first") print(out)` [`pivot`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/pivot/fn.pivot.html) `let out = df .clone() .lazy() .pivot( Selector::ByName { names: [PlSmallStr::from("foo")].into(), strict: true, }, Arc::new(df!("" => ["A", "B", "C"])?), Selector::ByName { names: [PlSmallStr::from("bar")].into(), strict: true, }, Selector::ByName { names: [PlSmallStr::from("N")].into(), strict: true, }, Expr::Agg(AggExpr::Item { input: Arc::new(Expr::Element), allow_empty: true, }), false, "_".into(), ) .collect()?; println!("{}", &out);` `shape: (3, 6) ┌─────┬──────┬──────┬──────┬──────┬──────┐ │ foo ┆ k ┆ l ┆ m ┆ n ┆ o │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪══════╪══════╪══════╪══════╪══════╡ │ A ┆ 1 ┆ 2 ┆ null ┆ null ┆ null │ │ B ┆ null ┆ null ┆ 2 ┆ 4 ┆ null │ │ C ┆ null ┆ null ┆ null ┆ null ┆ 2 │ └─────┴──────┴──────┴──────┴──────┴──────┘` Lazy ---- A Polars `LazyFrame` always need to know the schema of a computation statically (before collecting the query). As a pivot's output schema depends on the data, and it is therefore impossible to determine the schema without running the query. Polars could have abstracted this fact for you just like Spark does, but we don't want you to shoot yourself in the foot with a shotgun. The cost should be clear upfront. Python Rust [`pivot`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.pivot.html) `q = ( df.lazy() .collect() .pivot(index="foo", on="bar", values="N", aggregate_function="first") .lazy() ) out = q.collect() print(out)` [`pivot`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/pivot/fn.pivot.html) `let q = df.clone().lazy(); let q2 = q.pivot( Selector::ByName { names: [PlSmallStr::from("foo")].into(), strict: true, }, Arc::new(df!("" => ["A", "B", "C"])?), Selector::ByName { names: [PlSmallStr::from("bar")].into(), strict: true, }, Selector::ByName { names: [PlSmallStr::from("N")].into(), strict: true, }, Expr::Agg(AggExpr::Item { input: Arc::new(Expr::Element), allow_empty: true, }), false, "_".into(), ); let out = q2.collect()?; println!("{}", &out);` `shape: (3, 6) ┌─────┬──────┬──────┬──────┬──────┬──────┐ │ foo ┆ k ┆ l ┆ m ┆ n ┆ o │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪══════╪══════╪══════╪══════╪══════╡ │ A ┆ 1 ┆ 2 ┆ null ┆ null ┆ null │ │ B ┆ null ┆ null ┆ 2 ┆ 4 ┆ null │ │ C ┆ null ┆ null ┆ null ┆ null ┆ 2 │ └─────┴──────┴──────┴──────┴──────┴──────┘` --- # Styling - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/misc/styling/#styling) Styling ======= Data in a Polars `DataFrame` can be styled for presentation use the `DataFrame.style` property. This returns a `GT` object from [Great Tables](https://posit-dev.github.io/great-tables/articles/intro.html) , which enables structuring, formatting, and styling for table display. Python `import polars as pl import polars.selectors as cs path = "docs/assets/data/iris.csv" df = ( pl.scan_csv(path) .group_by("species") .agg(cs.starts_with("petal").mean().round(3)) .collect() ) print(df)` `shape: (3, 3) ┌────────────┬──────────────┬─────────────┐ │ species ┆ petal_length ┆ petal_width │ │ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ f64 │ ╞════════════╪══════════════╪═════════════╡ │ Versicolor ┆ 4.26 ┆ 1.326 │ │ Virginica ┆ 5.552 ┆ 2.026 │ │ Setosa ┆ 1.462 ┆ 0.246 │ └────────────┴──────────────┴─────────────┘` Structure: add header title --------------------------- Python `df.style.tab_header(title="Iris Data", subtitle="Mean measurement values per species")` | Iris Data | | | | --- | --- | --- | | Mean measurement values per species | | | | --- | --- | --- | | species | petal\_length | petal\_width | | --- | --- | --- | | Versicolor | 4.26 | 1.326 | | Virginica | 5.552 | 2.026 | | Setosa | 1.462 | 0.246 | Structure: add row stub ----------------------- Python `df.style.tab_stub(rowname_col="species")` | | petal\_length | petal\_width | | --- | --- | --- | | Versicolor | 4.26 | 1.326 | | Virginica | 5.552 | 2.026 | | Setosa | 1.462 | 0.246 | Structure: add column spanner ----------------------------- Python `( df.style.tab_spanner("Petal", cs.starts_with("petal")).cols_label( petal_length="Length", petal_width="Width" ) )` | species | Petal | | | --- | --- | --- | | Length | Width | | --- | --- | --- | | Versicolor | 4.26 | 1.326 | | Virginica | 5.552 | 2.026 | | Setosa | 1.462 | 0.246 | Format: limit decimal places ---------------------------- Python `df.style.fmt_number("petal_width", decimals=1)` | species | petal\_length | petal\_width | | --- | --- | --- | | Versicolor | 4.26 | 1.3 | | Virginica | 5.552 | 2.0 | | Setosa | 1.462 | 0.2 | Style: highlight max row ------------------------ Python `from great_tables import loc, style df.style.tab_style( style.fill("yellow"), loc.body( rows=pl.col("petal_length") == pl.col("petal_length").max(), ), )` | species | petal\_length | petal\_width | | --- | --- | --- | | Versicolor | 4.26 | 1.326 | | Virginica | 5.552 | 2.026 | | Setosa | 1.462 | 0.246 | Style: bold species column -------------------------- Python `from great_tables import loc, style df.style.tab_style( style.text(weight="bold"), loc.body(columns="species"), )` | species | petal\_length | petal\_width | | --- | --- | --- | | Versicolor | 4.26 | 1.326 | | Virginica | 5.552 | 2.026 | | Setosa | 1.462 | 0.246 | Full example ------------ Python `from great_tables import loc, style ( df.style.tab_header( title="Iris Data", subtitle="Mean measurement values per species" ) .tab_stub(rowname_col="species") .cols_label(petal_length="Length", petal_width="Width") .tab_spanner("Petal", cs.starts_with("petal")) .fmt_number("petal_width", decimals=2) .tab_style( style.fill("yellow"), loc.body( rows=pl.col("petal_length") == pl.col("petal_length").max(), ), ) )` | Iris Data | | | | --- | --- | --- | | Mean measurement values per species | | | | --- | --- | --- | | | Petal | | | --- | --- | --- | | Length | Width | | --- | --- | --- | | Versicolor | 4.26 | 1.33 | | Virginica | 5.552 | 2.03 | | Setosa | 1.462 | 0.25 | --- # Time zones - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/transformations/time-series/timezones/#time-zones) Time zones ========== Tom Scott You really should never, ever deal with time zones if you can help it. The `Datetime` datatype can have a time zone associated with it. Examples of valid time zones are: * `None`: no time zone, also known as "time zone naive". * `UTC`: Coordinated Universal Time. * `Asia/Kathmandu`: time zone in "area/location" format. See the [list of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) to see what's available. Caution: Fixed offsets such as +02:00, should not be used for handling time zones. It's advised to use the "Area/Location" format mentioned above, as it can manage timezones more effectively. Note that, because a `Datetime` can only have a single time zone, it is impossible to have a column with multiple time zones. If you are parsing data with multiple offsets, you may want to pass `utc=True` to convert them all to a common time zone (`UTC`), see [parsing dates and times](https://docs.pola.rs/user-guide/transformations/time-series/parsing/) . The main methods for setting and converting between time zones are: * `dt.convert_time_zone`: convert from one time zone to another. * `dt.replace_time_zone`: set/unset/change time zone. Let's look at some examples of common operations: Python Rust [`str.to_datetime`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.to_datetime.html) · [`dt.replace_time_zone`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.dt.replace_time_zone.html) · [Available on feature timezone](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag timezone") `ts = ["2021-03-27 03:00", "2021-03-28 03:00"] tz_naive = pl.Series("tz_naive", ts).str.to_datetime() tz_aware = tz_naive.dt.replace_time_zone("UTC").rename("tz_aware") time_zones_df = pl.DataFrame([tz_naive, tz_aware]) print(time_zones_df)` [`str.replace_all`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.to_datetime) · [`dt.replace_time_zone`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/struct.DateLikeNameSpace.html#method.replace_time_zone) · [Available on feature dtype-datetime](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-datetime") · [Available on feature timezones](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag timezones") `let ts = ["2021-03-27 03:00", "2021-03-28 03:00"]; let tz_naive = Column::new("tz_naive".into(), &ts); let time_zones_df = DataFrame::new_infer_height(vec![tz_naive])? .lazy() .select([col("tz_naive").str().to_datetime( Some(TimeUnit::Milliseconds), None, StrptimeOptions::default(), lit("raise"), )]) .with_columns([col("tz_naive") .dt() .replace_time_zone(Some(TimeZone::UTC), lit("raise"), NonExistent::Raise) .alias("tz_aware")]) .collect()?; println!("{}", &time_zones_df);` `shape: (2, 2) ┌─────────────────────┬─────────────────────────┐ │ tz_naive ┆ tz_aware │ │ --- ┆ --- │ │ datetime[μs] ┆ datetime[μs, UTC] │ ╞═════════════════════╪═════════════════════════╡ │ 2021-03-27 03:00:00 ┆ 2021-03-27 03:00:00 UTC │ │ 2021-03-28 03:00:00 ┆ 2021-03-28 03:00:00 UTC │ └─────────────────────┴─────────────────────────┘` Python Rust [`dt.convert_time_zone`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.dt.convert_time_zone.html) · [`dt.replace_time_zone`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.dt.replace_time_zone.html) · [Available on feature timezone](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag timezone") `time_zones_operations = time_zones_df.select( [ pl.col("tz_aware") .dt.replace_time_zone("Europe/Brussels") .alias("replace time zone"), pl.col("tz_aware") .dt.convert_time_zone("Asia/Kathmandu") .alias("convert time zone"), pl.col("tz_aware").dt.replace_time_zone(None).alias("unset time zone"), ] ) print(time_zones_operations)` [`dt.convert_time_zone`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/struct.DateLikeNameSpace.html#method.convert_time_zone) · [`dt.replace_time_zone`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/struct.DateLikeNameSpace.html#method.replace_time_zone) · [Available on feature timezones](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag timezones") `let time_zones_operations = time_zones_df .lazy() .select([ col("tz_aware") .dt() .replace_time_zone( TimeZone::opt_try_new(Some("Europe/Brussels")).unwrap(), lit("raise"), NonExistent::Raise, ) .alias("replace time zone"), col("tz_aware") .dt() .convert_time_zone( TimeZone::opt_try_new(Some("Asia/Kathmandu")) .unwrap() .unwrap(), ) .alias("convert time zone"), col("tz_aware") .dt() .replace_time_zone(None, lit("raise"), NonExistent::Raise) .alias("unset time zone"), ]) .collect()?; println!("{}", &time_zones_operations);` `shape: (2, 3) ┌───────────────────────────────┬──────────────────────────────┬─────────────────────┐ │ replace time zone ┆ convert time zone ┆ unset time zone │ │ --- ┆ --- ┆ --- │ │ datetime[μs, Europe/Brussels] ┆ datetime[μs, Asia/Kathmandu] ┆ datetime[μs] │ ╞═══════════════════════════════╪══════════════════════════════╪═════════════════════╡ │ 2021-03-27 03:00:00 CET ┆ 2021-03-27 08:45:00 +0545 ┆ 2021-03-27 03:00:00 │ │ 2021-03-28 03:00:00 CEST ┆ 2021-03-28 08:45:00 +0545 ┆ 2021-03-28 03:00:00 │ └───────────────────────────────┴──────────────────────────────┴─────────────────────┘` --- # Parsing - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/transformations/time-series/parsing/#parsing) Parsing ======= Polars has native support for parsing time series data and doing more sophisticated operations such as temporal grouping and resampling. Datatypes --------- Polars has the following datetime datatypes: * `Date`: Date representation e.g. 2014-07-08. It is internally represented as days since UNIX epoch encoded by a 32-bit signed integer. * `Datetime`: Datetime representation e.g. 2014-07-08 07:00:00. It is internally represented as a 64 bit integer since the Unix epoch and can have different units such as ns, us, ms. * `Duration`: A time delta type that is created when subtracting `Date/Datetime`. Similar to `timedelta` in Python. * `Time`: Time representation, internally represented as nanoseconds since midnight. Parsing dates from a file ------------------------- When loading from a CSV file Polars attempts to parse dates and times if the `try_parse_dates` flag is set to `True`: Python Rust [`read_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html) `df = pl.read_csv("docs/assets/data/apple_stock.csv", try_parse_dates=True) print(df)` [`CsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReader.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") `let df = CsvReadOptions::default() .map_parse_options(|parse_options| parse_options.with_try_parse_dates(true)) .try_into_reader_with_file_path(Some("docs/assets/data/apple_stock.csv".into())) .unwrap() .finish() .unwrap(); println!("{}", &df);` `shape: (100, 2) ┌────────────┬────────┐ │ Date ┆ Close │ │ --- ┆ --- │ │ date ┆ f64 │ ╞════════════╪════════╡ │ 1981-02-23 ┆ 24.62 │ │ 1981-05-06 ┆ 27.38 │ │ 1981-05-18 ┆ 28.0 │ │ 1981-09-25 ┆ 14.25 │ │ 1982-07-08 ┆ 11.0 │ │ … ┆ … │ │ 2012-05-16 ┆ 546.08 │ │ 2012-12-04 ┆ 575.85 │ │ 2013-07-05 ┆ 417.42 │ │ 2013-11-07 ┆ 512.49 │ │ 2014-02-25 ┆ 522.06 │ └────────────┴────────┘` This flag will trigger schema inference on a number of rows, as configured by the `infer_schema_length` setting (100 rows by default). Schema inference is computationally expensive and can slow down file loading if a high number of rows is used. On the other hand binary formats such as parquet have a schema that is respected by Polars. Casting strings to dates ------------------------ You can also cast a column of datetimes encoded as strings to a datetime type. You do this by calling the string `str.to_date` method and passing the format of the date string: Python Rust [`read_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html) · [`str.to_date`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.to_date.html) `df = pl.read_csv("docs/assets/data/apple_stock.csv", try_parse_dates=False) df = df.with_columns(pl.col("Date").str.to_date("%Y-%m-%d")) print(df)` [`CsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReader.html) · [`str.replace_all`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.to_date) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") · [Available on feature dtype-date](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-date") `let df = CsvReadOptions::default() .map_parse_options(|parse_options| parse_options.with_try_parse_dates(false)) .try_into_reader_with_file_path(Some("docs/assets/data/apple_stock.csv".into())) .unwrap() .finish() .unwrap(); let df = df .lazy() .with_columns([col("Date").str().to_date(StrptimeOptions::default())]) .collect()?; println!("{}", &df);` `shape: (100, 2) ┌────────────┬────────┐ │ Date ┆ Close │ │ --- ┆ --- │ │ date ┆ f64 │ ╞════════════╪════════╡ │ 1981-02-23 ┆ 24.62 │ │ 1981-05-06 ┆ 27.38 │ │ 1981-05-18 ┆ 28.0 │ │ 1981-09-25 ┆ 14.25 │ │ 1982-07-08 ┆ 11.0 │ │ … ┆ … │ │ 2012-05-16 ┆ 546.08 │ │ 2012-12-04 ┆ 575.85 │ │ 2013-07-05 ┆ 417.42 │ │ 2013-11-07 ┆ 512.49 │ │ 2014-02-25 ┆ 522.06 │ └────────────┴────────┘` [The format string specification can be found here.](https://docs.rs/chrono/latest/chrono/format/strftime/index.html) . Extracting date features from a date column ------------------------------------------- You can extract data features such as the year or day from a date column using the `.dt` namespace: Python Rust [`dt.year`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.dt.year.html) `df_with_year = df.with_columns(pl.col("Date").dt.year().alias("year")) print(df_with_year)` [`dt.year`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/struct.DateLikeNameSpace.html#method.year) `let df_with_year = df .lazy() .with_columns([col("Date").dt().year().alias("year")]) .collect()?; println!("{}", &df_with_year);` `shape: (100, 3) ┌────────────┬────────┬──────┐ │ Date ┆ Close ┆ year │ │ --- ┆ --- ┆ --- │ │ date ┆ f64 ┆ i32 │ ╞════════════╪════════╪══════╡ │ 1981-02-23 ┆ 24.62 ┆ 1981 │ │ 1981-05-06 ┆ 27.38 ┆ 1981 │ │ 1981-05-18 ┆ 28.0 ┆ 1981 │ │ 1981-09-25 ┆ 14.25 ┆ 1981 │ │ 1982-07-08 ┆ 11.0 ┆ 1982 │ │ … ┆ … ┆ … │ │ 2012-05-16 ┆ 546.08 ┆ 2012 │ │ 2012-12-04 ┆ 575.85 ┆ 2012 │ │ 2013-07-05 ┆ 417.42 ┆ 2013 │ │ 2013-11-07 ┆ 512.49 ┆ 2013 │ │ 2014-02-25 ┆ 522.06 ┆ 2014 │ └────────────┴────────┴──────┘` Mixed offsets ------------- If your data contains datetimes with mixed UTC offsets (for example due to daylight-saving transitions), Polars parses them in UTC. You can either pass a target `time_zone` to `str.to_datetime`, or call `str.convert_time_zone` after parsing: Python Rust [`str.to_datetime`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.to_datetime.html) · [`dt.convert_time_zone`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.dt.convert_time_zone.html) · [Available on feature timezone](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag timezone") `data = [ "2021-03-27T00:00:00+0100", "2021-03-28T00:00:00+0100", "2021-03-29T00:00:00+0200", "2021-03-30T00:00:00+0200", ] mixed_parsed = ( pl.Series(data) .str.to_datetime("%Y-%m-%dT%H:%M:%S%z") .dt.convert_time_zone("Europe/Brussels") ) print(mixed_parsed)` [`str.replace_all`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.to_datetime) · [`dt.convert_time_zone`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/struct.DateLikeNameSpace.html#method.convert_time_zone) · [Available on feature dtype-datetime](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-datetime") · [Available on feature timezones](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag timezones") `let data = [ "2021-03-27T00:00:00+0100", "2021-03-28T00:00:00+0100", "2021-03-29T00:00:00+0200", "2021-03-30T00:00:00+0200", ]; let q = col("date") .str() .to_datetime( Some(TimeUnit::Microseconds), None, StrptimeOptions { format: Some("%Y-%m-%dT%H:%M:%S%z".into()), ..Default::default() }, lit("raise"), ) .dt() .convert_time_zone( TimeZone::opt_try_new(Some("Europe/Brussels")) .unwrap() .unwrap(), ); let mixed_parsed = df!("date" => &data)?.lazy().select([q]).collect()?; println!("{}", &mixed_parsed);` `shape: (4,) Series: '' [datetime[μs, Europe/Brussels]] [ 2021-03-27 00:00:00 CET 2021-03-28 00:00:00 CET 2021-03-29 00:00:00 CEST 2021-03-30 00:00:00 CEST ]` --- # Filtering - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/transformations/time-series/filter/#filtering) Filtering ========= Filtering date columns works in the same way as with other types of columns using the `.filter` method. Polars uses Python's native `datetime`, `date` and `timedelta` for equality comparisons between the datatypes `pl.Datetime`, `pl.Date` and `pl.Duration`. In the following example we use a time series of Apple stock prices. Python Rust [`read_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html) `import polars as pl from datetime import datetime df = pl.read_csv("docs/assets/data/apple_stock.csv", try_parse_dates=True) print(df)` [`CsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReader.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") `let df = CsvReadOptions::default() .map_parse_options(|parse_options| parse_options.with_try_parse_dates(true)) .try_into_reader_with_file_path(Some("docs/assets/data/apple_stock.csv".into())) .unwrap() .finish() .unwrap(); println!("{}", &df);` `shape: (100, 2) ┌────────────┬────────┐ │ Date ┆ Close │ │ --- ┆ --- │ │ date ┆ f64 │ ╞════════════╪════════╡ │ 1981-02-23 ┆ 24.62 │ │ 1981-05-06 ┆ 27.38 │ │ 1981-05-18 ┆ 28.0 │ │ 1981-09-25 ┆ 14.25 │ │ 1982-07-08 ┆ 11.0 │ │ … ┆ … │ │ 2012-05-16 ┆ 546.08 │ │ 2012-12-04 ┆ 575.85 │ │ 2013-07-05 ┆ 417.42 │ │ 2013-11-07 ┆ 512.49 │ │ 2014-02-25 ┆ 522.06 │ └────────────┴────────┘` Filtering by single dates ------------------------- We can filter by a single date using an equality comparison in a filter expression: Python Rust [`filter`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.filter.html) `filtered_df = df.filter( pl.col("Date") == datetime(1995, 10, 16), ) print(filtered_df)` [`filter`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.filter) `let filtered_df = df .clone() .lazy() .filter(col("Date").eq(lit(NaiveDate::from_ymd_opt(1995, 10, 16).unwrap()))) .collect()?; println!("{}", &filtered_df);` `shape: (1, 2) ┌────────────┬───────┐ │ Date ┆ Close │ │ --- ┆ --- │ │ date ┆ f64 │ ╞════════════╪═══════╡ │ 1995-10-16 ┆ 36.13 │ └────────────┴───────┘` Note we are using the lowercase `datetime` method rather than the uppercase `Datetime` data type. Filtering by a date range ------------------------- We can filter by a range of dates using the `is_between` method in a filter expression with the start and end dates: Python Rust [`filter`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.filter.html) · [`is_between`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_between.html) `filtered_range_df = df.filter( pl.col("Date").is_between(datetime(1995, 7, 1), datetime(1995, 11, 1)), ) print(filtered_range_df)` [`filter`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.filter) · [`is_between`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html#method.is_between) · [Available on feature is\_between](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag is_between") `let filtered_range_df = df .lazy() .filter( col("Date") .gt(lit(NaiveDate::from_ymd_opt(1995, 7, 1).unwrap())) .and(col("Date").lt(lit(NaiveDate::from_ymd_opt(1995, 11, 1).unwrap()))), ) .collect()?; println!("{}", &filtered_range_df);` `shape: (2, 2) ┌────────────┬───────┐ │ Date ┆ Close │ │ --- ┆ --- │ │ date ┆ f64 │ ╞════════════╪═══════╡ │ 1995-07-06 ┆ 47.0 │ │ 1995-10-16 ┆ 36.13 │ └────────────┴───────┘` Filtering with negative dates ----------------------------- Say you are working with an archeologist and are dealing in negative dates. Polars can parse and store them just fine, but the Python `datetime` library does not. So for filtering, you should use attributes in the `.dt` namespace: Python Rust [`str.to_date`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.to_date.html) `ts = pl.Series(["-1300-05-23", "-1400-03-02"]).str.to_date() negative_dates_df = pl.DataFrame({"ts": ts, "values": [3, 4]}) negative_dates_filtered_df = negative_dates_df.filter(pl.col("ts").dt.year() < -1300) print(negative_dates_filtered_df)` [`str.replace_all`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html#method.to_date) · [Available on feature dtype-date](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-date") `let negative_dates_df = df!( "ts"=> &["-1300-05-23", "-1400-03-02"], "values"=> &[3, 4])? .lazy() .with_column(col("ts").str().to_date(StrptimeOptions::default())) .collect()?; let negative_dates_filtered_df = negative_dates_df .lazy() .filter(col("ts").dt().year().lt(-1300)) .collect()?; println!("{}", &negative_dates_filtered_df);` `shape: (1, 2) ┌─────────────┬────────┐ │ ts ┆ values │ │ --- ┆ --- │ │ date ┆ i64 │ ╞═════════════╪════════╡ │ -1400-03-02 ┆ 4 │ └─────────────┴────────┘` --- # Concatenation - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/transformations/concatenation/#concatenation) Concatenation ============= There are a number of ways to concatenate data from separate DataFrames: * two dataframes with **the same columns** can be **vertically** concatenated to make a **longer** dataframe * two dataframes with **non-overlapping columns** can be **horizontally** concatenated to make a **wider** dataframe * two dataframes with **different numbers of rows and columns** can be **diagonally** concatenated to make a dataframe which might be longer and/ or wider. Where column names overlap values will be vertically concatenated. Where column names do not overlap new rows and columns will be added. Missing values will be set as `null` Vertical concatenation - getting longer --------------------------------------- In a vertical concatenation you combine all of the rows from a list of `DataFrames` into a single longer `DataFrame`. Python Rust [`concat`](https://docs.pola.rs/api/python/stable/reference/api/polars.concat.html) `df_v1 = pl.DataFrame( { "a": [1], "b": [3], } ) df_v2 = pl.DataFrame( { "a": [2], "b": [4], } ) df_vertical_concat = pl.concat( [ df_v1, df_v2, ], how="vertical", ) print(df_vertical_concat)` [`concat`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat.html) `let df_v1 = df!( "a"=> &[1], "b"=> &[3], )?; let df_v2 = df!( "a"=> &[2], "b"=> &[4], )?; let df_vertical_concat = concat([df_v1.lazy(), df_v2.lazy()], UnionArgs::default())?.collect()?; println!("{}", &df_vertical_concat);` `shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 3 │ │ 2 ┆ 4 │ └─────┴─────┘` Vertical concatenation fails when the dataframes do not have the same column names. Horizontal concatenation - getting wider ---------------------------------------- In a horizontal concatenation you combine all of the columns from a list of `DataFrames` into a single wider `DataFrame`. Python Rust [`concat`](https://docs.pola.rs/api/python/stable/reference/api/polars.concat.html) `df_h1 = pl.DataFrame( { "l1": [1, 2], "l2": [3, 4], } ) df_h2 = pl.DataFrame( { "r1": [5, 6], "r2": [7, 8], "r3": [9, 10], } ) df_horizontal_concat = pl.concat( [ df_h1, df_h2, ], how="horizontal", ) print(df_horizontal_concat)` [`concat`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat.html) `let df_h1 = df!( "l1"=> &[1, 2], "l2"=> &[3, 4], )?; let df_h2 = df!( "r1"=> &[5, 6], "r2"=> &[7, 8], "r3"=> &[9, 10], )?; let df_horizontal_concat = polars::functions::concat_df_horizontal(&[df_h1, df_h2], true, false)?; println!("{}", &df_horizontal_concat);` `shape: (2, 5) ┌─────┬─────┬─────┬─────┬─────┐ │ l1 ┆ l2 ┆ r1 ┆ r2 ┆ r3 │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╪═════╪═════╡ │ 1 ┆ 3 ┆ 5 ┆ 7 ┆ 9 │ │ 2 ┆ 4 ┆ 6 ┆ 8 ┆ 10 │ └─────┴─────┴─────┴─────┴─────┘` Horizontal concatenation fails when dataframes have overlapping columns. When dataframes have different numbers of rows, columns will be padded with `null` values at the end up to the maximum length. Python Rust [`concat`](https://docs.pola.rs/api/python/stable/reference/api/polars.concat.html) `df_h1 = pl.DataFrame( { "l1": [1, 2], "l2": [3, 4], } ) df_h2 = pl.DataFrame( { "r1": [5, 6, 7], "r2": [8, 9, 10], } ) df_horizontal_concat = pl.concat( [ df_h1, df_h2, ], how="horizontal", ) print(df_horizontal_concat)` [`concat`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat.html) `let df_h1 = df!( "l1"=> &[1, 2], "l2"=> &[3, 4], )?; let df_h2 = df!( "r1"=> &[5, 6, 7], "r2"=> &[8, 9, 10], )?; let df_horizontal_concat = polars::functions::concat_df_horizontal(&[df_h1, df_h2], true, false)?; println!("{}", &df_horizontal_concat);` `shape: (3, 4) ┌──────┬──────┬─────┬─────┐ │ l1 ┆ l2 ┆ r1 ┆ r2 │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞══════╪══════╪═════╪═════╡ │ 1 ┆ 3 ┆ 5 ┆ 8 │ │ 2 ┆ 4 ┆ 6 ┆ 9 │ │ null ┆ null ┆ 7 ┆ 10 │ └──────┴──────┴─────┴─────┘` Diagonal concatenation - getting longer, wider and `null`ier ------------------------------------------------------------ In a diagonal concatenation you combine all of the row and columns from a list of `DataFrames` into a single longer and/or wider `DataFrame`. Python Rust [`concat`](https://docs.pola.rs/api/python/stable/reference/api/polars.concat.html) `df_d1 = pl.DataFrame( { "a": [1], "b": [3], } ) df_d2 = pl.DataFrame( { "a": [2], "d": [4], } ) df_diagonal_concat = pl.concat( [ df_d1, df_d2, ], how="diagonal", ) print(df_diagonal_concat)` [`concat`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat.html) `let df_d1 = df!( "a"=> &[1], "b"=> &[3], )?; let df_d2 = df!( "a"=> &[2], "d"=> &[4],)?; let df_diagonal_concat = polars::functions::concat_df_diagonal(&[df_d1, df_d2])?; println!("{}", &df_diagonal_concat);` `shape: (2, 3) ┌─────┬──────┬──────┐ │ a ┆ b ┆ d │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪══════╪══════╡ │ 1 ┆ 3 ┆ null │ │ 2 ┆ null ┆ 4 │ └─────┴──────┴──────┘` Diagonal concatenation generates nulls when the column names do not overlap. When the dataframe shapes do not match and we have an overlapping semantic key then [we can join the dataframes](https://docs.pola.rs/user-guide/transformations/joins/) instead of concatenating them. Rechunking ---------- Before a concatenation we have two dataframes `df1` and `df2`. Each column in `df1` and `df2` is in one or more chunks in memory. By default, during concatenation the chunks in each column are not made contiguous. This makes the concat operation faster and consume less memory but it may slow down future operations that would benefit from having the data be in contiguous memory. The process of copying the fragmented chunks into a single new chunk is known as **rechunking**. Rechunking is an expensive operation. Prior to version 0.20.26, the default was to perform a rechunk but in new versions, the default is not to. If you do want Polars to rechunk the concatenated `DataFrame` you specify `rechunk = True` when doing the concatenation. --- # Data types and structures - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/concepts/data-types-and-structures/#data-types-and-structures) Data types and structures ========================= Data types ---------- Polars supports a variety of data types that fall broadly under the following categories: * Numeric data types: signed integers, unsigned integers, floating point numbers, and decimals. * Nested data types: lists, structs, and arrays. * Temporal: dates, datetimes, times, and time deltas. * Miscellaneous: strings, binary data, Booleans, categoricals, enums, and objects. All types support missing values represented by the special value `null`. This is not to be conflated with the special value `NaN` in floating number data types; see the [section about floating point numbers](https://docs.pola.rs/user-guide/concepts/data-types-and-structures/#floating-point-numbers) for more information. You can also find a [full table with all data types supported in the appendix](https://docs.pola.rs/user-guide/concepts/data-types-and-structures/#appendix-full-data-types-table) with notes on when to use each data type and with links to relevant parts of the documentation. Series ------ The core base data structures provided by Polars are series and dataframes. A series is a 1-dimensional homogeneous data structure. By “homogeneous” we mean that all elements inside a series have the same data type. The snippet below shows how to create a named series: Python Rust [`Series`](https://docs.pola.rs/api/python/stable/reference/series/index.html) `import polars as pl s = pl.Series("ints", [1, 2, 3, 4, 5]) print(s)` [`Series`](https://docs.pola.rs/api/rust/dev/polars/series/struct.Series.html) `use polars::prelude::*; let s = Series::new("ints".into(), &[1, 2, 3, 4, 5]); println!("{s}");` `shape: (5,) Series: 'ints' [i64] [ 1 2 3 4 5 ]` When creating a series, Polars will infer the data type from the values you provide. You can specify a concrete data type to override the inference mechanism: Python Rust [`Series`](https://docs.pola.rs/api/python/stable/reference/series/index.html) `s1 = pl.Series("ints", [1, 2, 3, 4, 5]) s2 = pl.Series("uints", [1, 2, 3, 4, 5], dtype=pl.UInt64) print(s1.dtype, s2.dtype)` [`Series`](https://docs.pola.rs/api/rust/dev/polars/series/struct.Series.html) `let s1 = Series::new("ints".into(), &[1, 2, 3, 4, 5]); let s2 = Series::new("uints".into(), &[1, 2, 3, 4, 5]) .cast(&DataType::UInt64) // Here, we actually cast after inference. .unwrap(); println!("{} {}", s1.dtype(), s2.dtype()); // i32 u64` `Int64 UInt64` Dataframe --------- A dataframe is a 2-dimensional heterogeneous data structure that contains uniquely named series. By holding your data in a dataframe you will be able to use the Polars API to write queries that manipulate your data. You will be able to do this by using the [contexts and expressions provided by Polars](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/) that we will talk about next. The snippet below shows how to create a dataframe from a dictionary of lists: Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) `from datetime import date df = pl.DataFrame( { "name": ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"], "birthdate": [ date(1997, 1, 10), date(1985, 2, 15), date(1983, 3, 22), date(1981, 4, 30), ], "weight": [57.9, 72.5, 53.6, 83.1], # (kg) "height": [1.56, 1.77, 1.65, 1.75], # (m) } ) print(df)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) `use chrono::prelude::*; let df: DataFrame = df!( "name" => ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"], "birthdate" => [ NaiveDate::from_ymd_opt(1997, 1, 10).unwrap(), NaiveDate::from_ymd_opt(1985, 2, 15).unwrap(), NaiveDate::from_ymd_opt(1983, 3, 22).unwrap(), NaiveDate::from_ymd_opt(1981, 4, 30).unwrap(), ], "weight" => [57.9, 72.5, 53.6, 83.1], // (kg) "height" => [1.56, 1.77, 1.65, 1.75], // (m) ) .unwrap(); println!("{df}");` `shape: (4, 4) ┌────────────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞════════════════╪════════════╪════════╪════════╡ │ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 │ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │ │ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 │ └────────────────┴────────────┴────────┴────────┘` ### Inspecting a dataframe In this subsection we will show some useful methods to quickly inspect a dataframe. We will use the dataframe we created earlier as a starting point. #### Head The function `head` shows the first rows of a dataframe. By default, you get the first 5 rows but you can also specify the number of rows you want: Python Rust [`head`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.head.html) `print(df.head(3))` [`head`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html#method.head) `let df_head = df.head(Some(3)); println!("{df_head}");` `shape: (3, 4) ┌──────────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞══════════════╪════════════╪════════╪════════╡ │ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 │ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │ └──────────────┴────────────┴────────┴────────┘` #### Glimpse The function `glimpse` is another function that shows the values of the first few rows of a dataframe, but formats the output differently from `head`. Here, each line of the output corresponds to a single column, making it easier to inspect wider dataframes: Python [`glimpse`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.glimpse.html) `print(df.glimpse(return_as_string=True))` `Rows: 4 Columns: 4 $ name 'Alice Archer', 'Ben Brown', 'Chloe Cooper', 'Daniel Donovan' $ birthdate 1997-01-10, 1985-02-15, 1983-03-22, 1981-04-30 $ weight 57.9, 72.5, 53.6, 83.1 $ height 1.56, 1.77, 1.65, 1.75` Info `glimpse` is only available for Python users. #### Tail The function `tail` shows the last rows of a dataframe. By default, you get the last 5 rows but you can also specify the number of rows you want, similar to how `head` works: Python Rust [`tail`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.tail.html) `print(df.tail(3))` [`tail`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html#method.tail) `let df_tail = df.tail(Some(3)); println!("{df_tail}");` `shape: (3, 4) ┌────────────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞════════════════╪════════════╪════════╪════════╡ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ │ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │ │ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 │ └────────────────┴────────────┴────────┴────────┘` #### Sample If you think the first or last rows of your dataframe are not representative of your data, you can use `sample` to get an arbitrary number of randomly selected rows from the DataFrame. Note that the rows are not necessarily returned in the same order as they appear in the dataframe: Python Rust [`sample`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.sample.html) `import random random.seed(42) # For reproducibility. print(df.sample(2))` [`sample_n`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html#method.sample_n) `let n = Series::new("".into(), &[2]); let sampled_df = df.sample_n(&n, false, false, None).unwrap(); println!("{sampled_df}");` `shape: (2, 4) ┌──────────────┬────────────┬────────┬────────┐ │ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ f64 │ ╞══════════════╪════════════╪════════╪════════╡ │ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 │ │ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │ └──────────────┴────────────┴────────┴────────┘` #### Describe You can also use `describe` to compute summary statistics for all columns of your dataframe: Python Rust [`describe`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.describe.html) `print(df.describe())` [`describe`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html#method.describe) · [Available on feature describe](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag describe") `// Not available in Rust` `shape: (9, 5) ┌────────────┬────────────────┬─────────────────────┬───────────┬──────────┐ │ statistic ┆ name ┆ birthdate ┆ weight ┆ height │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ f64 ┆ f64 │ ╞════════════╪════════════════╪═════════════════════╪═══════════╪══════════╡ │ count ┆ 4 ┆ 4 ┆ 4.0 ┆ 4.0 │ │ null_count ┆ 0 ┆ 0 ┆ 0.0 ┆ 0.0 │ │ mean ┆ null ┆ 1986-09-04 00:00:00 ┆ 66.775 ┆ 1.6825 │ │ std ┆ null ┆ null ┆ 13.560082 ┆ 0.097082 │ │ min ┆ Alice Archer ┆ 1981-04-30 ┆ 53.6 ┆ 1.56 │ │ 25% ┆ null ┆ 1983-03-22 ┆ 57.9 ┆ 1.65 │ │ 50% ┆ null ┆ 1985-02-15 ┆ 72.5 ┆ 1.75 │ │ 75% ┆ null ┆ 1985-02-15 ┆ 72.5 ┆ 1.75 │ │ max ┆ Daniel Donovan ┆ 1997-01-10 ┆ 83.1 ┆ 1.77 │ └────────────┴────────────────┴─────────────────────┴───────────┴──────────┘` Schema ------ When talking about data (in a dataframe or otherwise) we can refer to its schema. The schema is a mapping of column or series names to the data types of those same columns or series. You can check the schema of a dataframe with `schema`: Python Rust `print(df.schema)` `println!("{:?}", df.schema());` `Schema({'name': String, 'birthdate': Date, 'weight': Float64, 'height': Float64})` Much like with series, Polars will infer the schema of a dataframe when you create it but you can override the inference system if needed. In Python, you can specify an explicit schema by using a dictionary to map column names to data types. You can use the value `None` if you do not wish to override inference for a given column: `df = pl.DataFrame( { "name": ["Alice", "Ben", "Chloe", "Daniel"], "age": [27, 39, 41, 43], }, schema={"name": None, "age": pl.UInt8}, ) print(df)` `shape: (4, 2) ┌────────┬─────┐ │ name ┆ age │ │ --- ┆ --- │ │ str ┆ u8 │ ╞════════╪═════╡ │ Alice ┆ 27 │ │ Ben ┆ 39 │ │ Chloe ┆ 41 │ │ Daniel ┆ 43 │ └────────┴─────┘` If you only need to override the inference of some columns, the parameter `schema_overrides` tends to be more convenient because it lets you omit columns for which you do not want to override the inference: `df = pl.DataFrame( { "name": ["Alice", "Ben", "Chloe", "Daniel"], "age": [27, 39, 41, 43], }, schema_overrides={"age": pl.UInt8}, ) print(df)` `shape: (4, 2) ┌────────┬─────┐ │ name ┆ age │ │ --- ┆ --- │ │ str ┆ u8 │ ╞════════╪═════╡ │ Alice ┆ 27 │ │ Ben ┆ 39 │ │ Chloe ┆ 41 │ │ Daniel ┆ 43 │ └────────┴─────┘` Data types internals -------------------- Polars utilizes the [Arrow Columnar Format](https://arrow.apache.org/docs/format/Columnar.html) for its data orientation. Following this specification allows Polars to transfer data to/from other tools that also use the Arrow specification with little to no overhead. Polars gets most of its performance from its query engine, the optimizations it performs on your query plans, and from the parallelization that it employs when running [your expressions](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/#expressions) . Floating point numbers ---------------------- Polars generally follows the IEEE 754 floating point standard for `Float32` and `Float64`, with some exceptions: * Any `NaN` compares equal to any other `NaN`, and greater than any non-`NaN` value. * Operations do not guarantee any particular behavior on the sign of zero or `NaN`, nor on the payload of `NaN` values. This is not just limited to arithmetic operations, e.g. a sort or group by operation may canonicalize all zeroes to +0 and all `NaN`s to a positive `NaN` without payload for efficient equality checks. Polars always attempts to provide reasonably accurate results for floating point computations but does not provide guarantees on the error unless mentioned otherwise. Generally speaking 100% accurate results are infeasibly expensive to achieve (requiring much larger internal representations than 64-bit floats), and thus some error is always to be expected. Appendix: full data types table ------------------------------- | Type(s) | Details | | --- | --- | | `Boolean` | Boolean type that is bit packed efficiently. | | `Int8`, `Int16`, `Int32`, `Int64`, `Int128` | Varying-precision signed integer types. | | `UInt8`, `UInt16`, `UInt32`, `UInt64`, `UInt128` | Varying-precision unsigned integer types. | | `Float16`, `Float32`, `Float64` | Varying-precision signed floating point numbers. | | `Decimal` | Decimal 128-bit type with optional precision and non-negative scale. Use this if you need fine-grained control over the precision of your floats and the operations you make on them. See [Python's `decimal.Decimal`](https://docs.python.org/3/library/decimal.html)
for documentation on what a decimal data type is. | | `String` | Variable length UTF-8 encoded string data, typically Human-readable. | | `Binary` | Stores arbitrary, varying length raw binary data. | | `Date` | Represents a calendar date. | | `Time` | Represents a time of day. | | `Datetime` | Represents a calendar date and time of day. | | `Duration` | Represents a time duration. | | `Array` | Arrays with a known, fixed shape per series; akin to numpy arrays. [Learn more about how arrays and lists differ and how to work with both](https://docs.pola.rs/user-guide/expressions/lists-and-arrays/)
. | | `List` | Homogeneous 1D container with variable length. [Learn more about how arrays and lists differ and how to work with both](https://docs.pola.rs/user-guide/expressions/lists-and-arrays/)
. | | `Object` | Wraps arbitrary Python objects. | | `Categorical` | Efficient encoding of string data where the categories are inferred at runtime. [Learn more about how categoricals and enums differ and how to work with both](https://docs.pola.rs/user-guide/expressions/categorical-data-and-enums/)
. | | `Enum` | Efficient ordered encoding of a set of predetermined string categories. [Learn more about how categoricals and enums differ and how to work with both](https://docs.pola.rs/user-guide/expressions/categorical-data-and-enums/)
. | | `Struct` | Composite product type that can store multiple fields. [Learn more about the data type `Struct` in its dedicated documentation section.](https://docs.pola.rs/user-guide/expressions/structs/)
. | | `Null` | Represents null values. | --- # Unpivots - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/transformations/unpivot/#unpivots) Unpivots ======== Unpivot unpivots a DataFrame from wide format to long format Dataset ------- Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) `import polars as pl df = pl.DataFrame( { "A": ["a", "b", "a"], "B": [1, 3, 5], "C": [10, 11, 12], "D": [2, 4, 6], } ) print(df)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) `let df = df!( "A"=> &["a", "b", "a"], "B"=> &[1, 3, 5], "C"=> &[10, 11, 12], "D"=> &[2, 4, 6], )?; println!("{}", &df);` `shape: (3, 4) ┌─────┬─────┬─────┬─────┐ │ A ┆ B ┆ C ┆ D │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╪═════╡ │ a ┆ 1 ┆ 10 ┆ 2 │ │ b ┆ 3 ┆ 11 ┆ 4 │ │ a ┆ 5 ┆ 12 ┆ 6 │ └─────┴─────┴─────┴─────┘` Eager + lazy ------------ `Eager` and `lazy` have the same API. Python Rust [`unpivot`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.unpivot.html) `out = df.unpivot(["C", "D"], index=["A", "B"]) print(out)` [`unpivot`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html#method.unpivot) `let out = df.unpivot(Some(["A", "B"]), ["C", "D"])?; println!("{}", &out);` `shape: (6, 4) ┌─────┬─────┬──────────┬───────┐ │ A ┆ B ┆ variable ┆ value │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str ┆ i64 │ ╞═════╪═════╪══════════╪═══════╡ │ a ┆ 1 ┆ C ┆ 10 │ │ b ┆ 3 ┆ C ┆ 11 │ │ a ┆ 5 ┆ C ┆ 12 │ │ a ┆ 1 ┆ D ┆ 2 │ │ b ┆ 3 ┆ D ┆ 4 │ │ a ┆ 5 ┆ D ┆ 6 │ └─────┴─────┴──────────┴───────┘` --- # Resampling - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/transformations/time-series/resampling/#resampling) Resampling ========== We can resample by either: * upsampling (moving data to a higher frequency) * downsampling (moving data to a lower frequency) * combinations of these e.g. first upsample and then downsample Downsampling to a lower frequency --------------------------------- Polars views downsampling as a special case of the **group\_by** operation and you can do this with `group_by_dynamic` and `group_by_rolling` - [see the temporal group by page for examples](https://docs.pola.rs/user-guide/transformations/time-series/rolling/) . Upsampling to a higher frequency -------------------------------- Let's go through an example where we generate data at 30 minute intervals: Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) · [`datetime_range`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.datetime_range.html) `df = pl.DataFrame( { "time": pl.datetime_range( start=datetime(2021, 12, 16), end=datetime(2021, 12, 16, 3), interval="30m", eager=True, ), "groups": ["a", "a", "a", "b", "b", "a", "a"], "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0], } ) print(df)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) · [`datetime_range`](https://docs.rs/polars/latest/polars/prelude/fn.datetime_range.html) · [Available on feature dtype-datetime](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-datetime") · [Available on feature lazy](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag lazy") `let time = polars::time::date_range( "time".into(), NaiveDate::from_ymd_opt(2021, 12, 16) .unwrap() .and_hms_opt(0, 0, 0) .unwrap(), NaiveDate::from_ymd_opt(2021, 12, 16) .unwrap() .and_hms_opt(3, 0, 0) .unwrap(), Duration::parse("30m"), ClosedWindow::Both, TimeUnit::Milliseconds, None, )?; let df = df!( "time" => time, "groups" => &["a", "a", "a", "b", "b", "a", "a"], "values" => &[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0], )?; println!("{}", &df);` `shape: (7, 3) ┌─────────────────────┬────────┬────────┐ │ time ┆ groups ┆ values │ │ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ str ┆ f64 │ ╞═════════════════════╪════════╪════════╡ │ 2021-12-16 00:00:00 ┆ a ┆ 1.0 │ │ 2021-12-16 00:30:00 ┆ a ┆ 2.0 │ │ 2021-12-16 01:00:00 ┆ a ┆ 3.0 │ │ 2021-12-16 01:30:00 ┆ b ┆ 4.0 │ │ 2021-12-16 02:00:00 ┆ b ┆ 5.0 │ │ 2021-12-16 02:30:00 ┆ a ┆ 6.0 │ │ 2021-12-16 03:00:00 ┆ a ┆ 7.0 │ └─────────────────────┴────────┴────────┘` Upsampling can be done by defining the new sampling interval. By upsampling we are adding in extra rows where we do not have data. As such upsampling by itself gives a DataFrame with nulls. These nulls can then be filled with a fill strategy or interpolation. ### Upsampling strategies In this example we upsample from the original 30 minutes to 15 minutes and then use a `forward` strategy to replace the nulls with the previous non-null value: Python Rust [`upsample`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.upsample.html) `out1 = df.upsample(time_column="time", every="15m").fill_null(strategy="forward") print(out1)` [`upsample`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html#method.upsample) `let out1 = df .upsample::<[String; 0]>([], "time", Duration::parse("15m"))? .fill_null(FillNullStrategy::Forward(None))?; println!("{}", &out1);` `shape: (13, 3) ┌─────────────────────┬────────┬────────┐ │ time ┆ groups ┆ values │ │ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ str ┆ f64 │ ╞═════════════════════╪════════╪════════╡ │ 2021-12-16 00:00:00 ┆ a ┆ 1.0 │ │ 2021-12-16 00:15:00 ┆ a ┆ 1.0 │ │ 2021-12-16 00:30:00 ┆ a ┆ 2.0 │ │ 2021-12-16 00:45:00 ┆ a ┆ 2.0 │ │ 2021-12-16 01:00:00 ┆ a ┆ 3.0 │ │ … ┆ … ┆ … │ │ 2021-12-16 02:00:00 ┆ b ┆ 5.0 │ │ 2021-12-16 02:15:00 ┆ b ┆ 5.0 │ │ 2021-12-16 02:30:00 ┆ a ┆ 6.0 │ │ 2021-12-16 02:45:00 ┆ a ┆ 6.0 │ │ 2021-12-16 03:00:00 ┆ a ┆ 7.0 │ └─────────────────────┴────────┴────────┘` In this example we instead fill the nulls by linear interpolation: Python Rust [`upsample`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.upsample.html) · [`interpolate`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.interpolate.html) · [`fill_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_null.html) `out2 = ( df.upsample(time_column="time", every="15m") .interpolate() .fill_null(strategy="forward") ) print(out2)` [`upsample`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html#method.upsample) · [`interpolate`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.interpolate) · [`fill_null`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.fill_null) `let out2 = df .upsample::<[String; 0]>([], "time", Duration::parse("15m"))? .lazy() .with_columns([col("values").interpolate(InterpolationMethod::Linear)]) .collect()? .fill_null(FillNullStrategy::Forward(None))?; println!("{}", &out2);` `shape: (13, 3) ┌─────────────────────┬────────┬────────┐ │ time ┆ groups ┆ values │ │ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ str ┆ f64 │ ╞═════════════════════╪════════╪════════╡ │ 2021-12-16 00:00:00 ┆ a ┆ 1.0 │ │ 2021-12-16 00:15:00 ┆ a ┆ 1.5 │ │ 2021-12-16 00:30:00 ┆ a ┆ 2.0 │ │ 2021-12-16 00:45:00 ┆ a ┆ 2.5 │ │ 2021-12-16 01:00:00 ┆ a ┆ 3.0 │ │ … ┆ … ┆ … │ │ 2021-12-16 02:00:00 ┆ b ┆ 5.0 │ │ 2021-12-16 02:15:00 ┆ b ┆ 5.5 │ │ 2021-12-16 02:30:00 ┆ a ┆ 6.0 │ │ 2021-12-16 02:45:00 ┆ a ┆ 6.5 │ │ 2021-12-16 03:00:00 ┆ a ┆ 7.0 │ └─────────────────────┴────────┴────────┘` --- # Schema - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/lazy/schemas/#schema) Schema ====== The schema of a Polars `DataFrame` or `LazyFrame` sets out the names of the columns and their datatypes. You can see the schema with the `.collect_schema` method on a `DataFrame` or `LazyFrame` Python [`LazyFrame`](https://docs.pola.rs/api/python/stable/reference/lazyframe/index.html) `lf = pl.LazyFrame({"foo": ["a", "b", "c"], "bar": [0, 1, 2]}) print(lf.collect_schema())` `Schema({'foo': String, 'bar': Int64})` The schema plays an important role in the lazy API. Type checking in the lazy API ----------------------------- One advantage of the lazy API is that Polars will check the schema before any data is processed. This check happens when you execute your lazy query. We see how this works in the following simple example where we call the `.round` expression on the string column `foo`. Python [`with_columns`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.with_columns.html) `lf = pl.LazyFrame({"foo": ["a", "b", "c"]}).with_columns(pl.col("foo").round(2))` The `.round` expression is only valid for columns with a numeric data type. Calling `.round` on a string column means the operation will raise an `InvalidOperationError` when we evaluate the query with `collect`. This schema check happens before the data is processed when we call `collect`. Python `try: print(lf.collect()) except Exception as e: print(f"{type(e).__name__}: {e}")` `InvalidOperationError: round can only be used on numeric types` If we executed this query in eager mode the error would only be found once the data had been processed in all earlier steps. When we execute a lazy query Polars checks for any potential `InvalidOperationError` before the time-consuming step of actually processing the data in the pipeline. The lazy API must know the schema --------------------------------- In the lazy API the Polars query optimizer must be able to infer the schema at every step of a query plan. This means that operations where the schema is not knowable in advance cannot be used with the lazy API. The classic example of an operation where the schema is not knowable in advance is a `.pivot` operation. In a `.pivot` the new column names come from data in one of the columns. As these column names cannot be known in advance a `.pivot` is not available in the lazy API. Dealing with operations not available in the lazy API ----------------------------------------------------- If your pipeline includes an operation that is not available in the lazy API it is normally best to: * run the pipeline in lazy mode up until that point * execute the pipeline with `.collect` to materialize a `DataFrame` * do the non-lazy operation on the `DataFrame` * convert the output back to a `LazyFrame` with `.lazy` and continue in lazy mode We show how to deal with a non-lazy operation in this example where we: * create a simple `DataFrame` * convert it to a `LazyFrame` with `.lazy` * do a transformation using `.with_columns` * execute the query before the pivot with `.collect` to get a `DataFrame` * do the `.pivot` on the `DataFrame` * convert back in lazy mode * do a `.filter` * finish by executing the query with `.collect` to get a `DataFrame` Python [`collect`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.collect.html) · [`lazy`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.lazy.html) · [`pivot`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.pivot.html) · [`filter`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.filter.html) `lazy_eager_query = ( pl.LazyFrame( { "id": ["a", "b", "c"], "month": ["jan", "feb", "mar"], "values": [0, 1, 2], } ) .with_columns((2 * pl.col("values")).alias("double_values")) .collect() .pivot(index="id", on="month", values="double_values", aggregate_function="first") .lazy() .filter(pl.col("mar").is_null()) .collect() ) print(lazy_eager_query)` `shape: (2, 4) ┌─────┬──────┬──────┬──────┐ │ id ┆ jan ┆ feb ┆ mar │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪══════╪══════╪══════╡ │ a ┆ 0 ┆ null ┆ null │ │ b ┆ null ┆ 2 ┆ null │ └─────┴──────┴──────┴──────┘` --- # Grouping - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/transformations/time-series/rolling/#grouping) Grouping ======== Grouping by fixed windows ------------------------- We can calculate temporal statistics using `group_by_dynamic` to group rows into days/months/years etc. ### Annual average example In following simple example we calculate the annual average closing price of Apple stock prices. We first load the data from CSV: Python Rust [`upsample`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.upsample.html) `df = pl.read_csv("docs/assets/data/apple_stock.csv", try_parse_dates=True) df = df.sort("Date") print(df)` [`upsample`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html#method.upsample) `let df = CsvReadOptions::default() .map_parse_options(|parse_options| parse_options.with_try_parse_dates(true)) .try_into_reader_with_file_path(Some("docs/assets/data/apple_stock.csv".into())) .unwrap() .finish() .unwrap() .sort( ["Date"], SortMultipleOptions::default().with_maintain_order(true), )?; println!("{}", &df);` `shape: (100, 2) ┌────────────┬────────┐ │ Date ┆ Close │ │ --- ┆ --- │ │ date ┆ f64 │ ╞════════════╪════════╡ │ 1981-02-23 ┆ 24.62 │ │ 1981-05-06 ┆ 27.38 │ │ 1981-05-18 ┆ 28.0 │ │ 1981-09-25 ┆ 14.25 │ │ 1982-07-08 ┆ 11.0 │ │ … ┆ … │ │ 2012-05-16 ┆ 546.08 │ │ 2012-12-04 ┆ 575.85 │ │ 2013-07-05 ┆ 417.42 │ │ 2013-11-07 ┆ 512.49 │ │ 2014-02-25 ┆ 522.06 │ └────────────┴────────┘` Info The dates are sorted in ascending order - if they are not sorted in this way the `group_by_dynamic` output will not be correct! To get the annual average closing price we tell `group_by_dynamic` that we want to: * group by the `Date` column on an annual (`1y`) basis * take the mean values of the `Close` column for each year: Python Rust [`group_by_dynamic`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by_dynamic.html) `annual_average_df = df.group_by_dynamic("Date", every="1y").agg(pl.col("Close").mean()) df_with_year = annual_average_df.with_columns(pl.col("Date").dt.year().alias("year")) print(df_with_year)` [`group_by_dynamic`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by_dynamic) · [Available on feature dynamic\_group\_by](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dynamic_group_by") `let annual_average_df = df .lazy() .group_by_dynamic( col("Date"), [], DynamicGroupOptions { every: Duration::parse("1y"), period: Duration::parse("1y"), offset: Duration::parse("0"), ..Default::default() }, ) .agg([col("Close").mean()]) .collect()?; let df_with_year = annual_average_df .lazy() .with_columns([col("Date").dt().year().alias("year")]) .collect()?; println!("{}", &df_with_year);` The annual average closing price is then: `shape: (34, 3) ┌────────────┬───────────┬──────┐ │ Date ┆ Close ┆ year │ │ --- ┆ --- ┆ --- │ │ date ┆ f64 ┆ i32 │ ╞════════════╪═══════════╪══════╡ │ 1981-01-01 ┆ 23.5625 ┆ 1981 │ │ 1982-01-01 ┆ 11.0 ┆ 1982 │ │ 1983-01-01 ┆ 30.543333 ┆ 1983 │ │ 1984-01-01 ┆ 27.583333 ┆ 1984 │ │ 1985-01-01 ┆ 18.166667 ┆ 1985 │ │ … ┆ … ┆ … │ │ 2010-01-01 ┆ 278.265 ┆ 2010 │ │ 2011-01-01 ┆ 368.225 ┆ 2011 │ │ 2012-01-01 ┆ 560.965 ┆ 2012 │ │ 2013-01-01 ┆ 464.955 ┆ 2013 │ │ 2014-01-01 ┆ 522.06 ┆ 2014 │ └────────────┴───────────┴──────┘` ### Parameters for `group_by_dynamic` A dynamic window is defined by a: * **every**: indicates the interval of the window * **period**: indicates the duration of the window * **offset**: can be used to offset the start of the windows The value for `every` sets how often the groups start. The time period values are flexible - for example we could take: * the average over 2 year intervals by replacing `1y` with `2y` * the average over 18 month periods by replacing `1y` with `1y6mo` We can also use the `period` parameter to set how long the time period for each group is. For example, if we set the `every` parameter to be `1y` and the `period` parameter to be `2y` then we would get groups at one year intervals where each groups spanned two years. If the `period` parameter is not specified then it is set equal to the `every` parameter so that if the `every` parameter is set to be `1y` then each group spans `1y` as well. Because _**every**_ does not have to be equal to _**period**_, we can create many groups in a very flexible way. They may overlap or leave boundaries between them. Let's see how the windows for some parameter combinations would look. Let's start out boring. 🥱 * every: 1 day -> `"1d"` * period: 1 day -> `"1d"` `this creates adjacent windows of the same size |--| |--| |--|` * every: 1 day -> `"1d"` * period: 2 days -> `"2d"` `these windows have an overlap of 1 day |----| |----| |----|` * every: 2 days -> `"2d"` * period: 1 day -> `"1d"` `this would leave gaps between the windows data points that in these gaps will not be a member of any group |--| |--| |--|` #### `truncate` The `truncate` parameter is a Boolean variable that determines what datetime value is associated with each group in the output. In the example above the first data point is on 23rd February 1981. If `truncate = True` (the default) then the date for the first year in the annual average is 1st January 1981. However, if `truncate = False` then the date for the first year in the annual average is the date of the first data point on 23rd February 1981. Note that `truncate` only affects what's shown in the `Date` column and does not affect the window boundaries. ### Using expressions in `group_by_dynamic` We aren't restricted to using simple aggregations like `mean` in a group by operation - we can use the full range of expressions available in Polars. In the snippet below we create a `date range` with every **day** (`"1d"`) in 2021 and turn this into a `DataFrame`. Then in the `group_by_dynamic` we create dynamic windows that start every **month** (`"1mo"`) and have a window length of `1` month. The values that match these dynamic windows are then assigned to that group and can be aggregated with the powerful expression API. Below we show an example where we use **group\_by\_dynamic** to compute: * the number of days until the end of the month * the number of days in a month Python Rust [`group_by_dynamic`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by_dynamic.html) · [`DataFrame.explode`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.explode.html) · [`date_range`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.date_range.html) `df = ( pl.date_range( start=date(2021, 1, 1), end=date(2021, 12, 31), interval="1d", eager=True, ) .alias("time") .to_frame() ) out = df.group_by_dynamic("time", every="1mo", period="1mo", closed="left").agg( pl.col("time").cum_count().reverse().head(3).alias("day/eom"), ((pl.col("time") - pl.col("time").first()).last().dt.total_days() + 1).alias( "days_in_month" ), ) print(out)` [`group_by_dynamic`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by_dynamic) · [`DataFrame.explode`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html#method.explode) · [`date_range`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.date_range.html) · [Available on feature range](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag range") · [Available on feature dtype-date](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dtype-date") · [Available on feature dynamic\_group\_by](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dynamic_group_by") `let time = polars::time::date_range( "time".into(), NaiveDate::from_ymd_opt(2021, 1, 1) .unwrap() .and_hms_opt(0, 0, 0) .unwrap(), NaiveDate::from_ymd_opt(2021, 12, 31) .unwrap() .and_hms_opt(0, 0, 0) .unwrap(), Duration::parse("1d"), ClosedWindow::Both, TimeUnit::Milliseconds, None, )? .cast(&DataType::Date)?; let df = df!( "time" => time, )?; let out = df .lazy() .group_by_dynamic( col("time"), [], DynamicGroupOptions { every: Duration::parse("1mo"), period: Duration::parse("1mo"), offset: Duration::parse("0"), closed_window: ClosedWindow::Left, ..Default::default() }, ) .agg([ col("time") .cum_count(true) // python example has false .reverse() .head(Some(3)) .alias("day/eom"), ((col("time").last() - col("time").first()).map( // had to use map as .duration().days() is not available |s| { Ok(s.duration()? .physical() .into_iter() .map(|d| d.map(|v| v / 1000 / 24 / 60 / 60)) .collect::() .into_column()) }, |_, f| Ok(Field::new(f.name().clone(), DataType::Int64)), ) + lit(1)) .alias("days_in_month"), ]) .collect()?; println!("{}", &out);` `shape: (12, 3) ┌────────────┬──────────────┬───────────────┐ │ time ┆ day/eom ┆ days_in_month │ │ --- ┆ --- ┆ --- │ │ date ┆ list[u32] ┆ i64 │ ╞════════════╪══════════════╪═══════════════╡ │ 2021-01-01 ┆ [31, 30, 29] ┆ 31 │ │ 2021-02-01 ┆ [28, 27, 26] ┆ 28 │ │ 2021-03-01 ┆ [31, 30, 29] ┆ 31 │ │ 2021-04-01 ┆ [30, 29, 28] ┆ 30 │ │ 2021-05-01 ┆ [31, 30, 29] ┆ 31 │ │ … ┆ … ┆ … │ │ 2021-08-01 ┆ [31, 30, 29] ┆ 31 │ │ 2021-09-01 ┆ [30, 29, 28] ┆ 30 │ │ 2021-10-01 ┆ [31, 30, 29] ┆ 31 │ │ 2021-11-01 ┆ [30, 29, 28] ┆ 30 │ │ 2021-12-01 ┆ [31, 30, 29] ┆ 31 │ └────────────┴──────────────┴───────────────┘` Grouping by rolling windows --------------------------- The rolling operation, `rolling`, is another entrance to the `group_by`/`agg` context. But different from the `group_by_dynamic` where the windows are fixed by a parameter `every` and `period`. In a `rolling`, the windows are not fixed at all! They are determined by the values in the `index_column`. So imagine having a time column with the values `{2021-01-06, 2021-01-10}` and a `period="5d"` this would create the following windows: `2021-01-01 2021-01-06 |----------| 2021-01-05 2021-01-10 |----------|` Because the windows of a rolling group by are always determined by the values in the `DataFrame` column, the number of groups is always equal to the original `DataFrame`. Combining group by operations ----------------------------- Rolling and dynamic group by operations can be combined with normal group by operations. Below is an example with a dynamic group by. Python Rust [`DataFrame`](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) `df = pl.DataFrame( { "time": pl.datetime_range( start=datetime(2021, 12, 16), end=datetime(2021, 12, 16, 3), interval="30m", eager=True, ), "groups": ["a", "a", "a", "b", "b", "a", "a"], } ) print(df)` [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) `let time = polars::time::date_range( "time".into(), NaiveDate::from_ymd_opt(2021, 12, 16) .unwrap() .and_hms_opt(0, 0, 0) .unwrap(), NaiveDate::from_ymd_opt(2021, 12, 16) .unwrap() .and_hms_opt(3, 0, 0) .unwrap(), Duration::parse("30m"), ClosedWindow::Both, TimeUnit::Milliseconds, None, )?; let df = df!( "time" => time, "groups"=> ["a", "a", "a", "b", "b", "a", "a"], )?; println!("{}", &df);` `shape: (7, 2) ┌─────────────────────┬────────┐ │ time ┆ groups │ │ --- ┆ --- │ │ datetime[μs] ┆ str │ ╞═════════════════════╪════════╡ │ 2021-12-16 00:00:00 ┆ a │ │ 2021-12-16 00:30:00 ┆ a │ │ 2021-12-16 01:00:00 ┆ a │ │ 2021-12-16 01:30:00 ┆ b │ │ 2021-12-16 02:00:00 ┆ b │ │ 2021-12-16 02:30:00 ┆ a │ │ 2021-12-16 03:00:00 ┆ a │ └─────────────────────┴────────┘` Python Rust [`group_by_dynamic`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.group_by_dynamic.html) `out = df.group_by_dynamic( "time", every="1h", closed="both", group_by="groups", include_boundaries=True, ).agg(pl.len()) print(out)` [`group_by_dynamic`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.group_by_dynamic) · [Available on feature dynamic\_group\_by](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag dynamic_group_by") `let out = df .lazy() .group_by_dynamic( col("time"), [col("groups")], DynamicGroupOptions { every: Duration::parse("1h"), period: Duration::parse("1h"), offset: Duration::parse("0"), include_boundaries: true, closed_window: ClosedWindow::Both, ..Default::default() }, ) .agg([len()]) .collect()?; println!("{}", &out);` `shape: (6, 5) ┌────────┬─────────────────────┬─────────────────────┬─────────────────────┬─────┐ │ groups ┆ _lower_boundary ┆ _upper_boundary ┆ time ┆ len │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ datetime[μs] ┆ datetime[μs] ┆ datetime[μs] ┆ u32 │ ╞════════╪═════════════════════╪═════════════════════╪═════════════════════╪═════╡ │ a ┆ 2021-12-16 00:00:00 ┆ 2021-12-16 01:00:00 ┆ 2021-12-16 00:00:00 ┆ 3 │ │ a ┆ 2021-12-16 01:00:00 ┆ 2021-12-16 02:00:00 ┆ 2021-12-16 01:00:00 ┆ 1 │ │ a ┆ 2021-12-16 02:00:00 ┆ 2021-12-16 03:00:00 ┆ 2021-12-16 02:00:00 ┆ 2 │ │ a ┆ 2021-12-16 03:00:00 ┆ 2021-12-16 04:00:00 ┆ 2021-12-16 03:00:00 ┆ 1 │ │ b ┆ 2021-12-16 01:00:00 ┆ 2021-12-16 02:00:00 ┆ 2021-12-16 01:00:00 ┆ 2 │ │ b ┆ 2021-12-16 02:00:00 ┆ 2021-12-16 03:00:00 ┆ 2021-12-16 02:00:00 ┆ 1 │ └────────┴─────────────────────┴─────────────────────┴─────────────────────┴─────┘` --- # Multiplexing queries - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/lazy/multiplexing/#multiplexing-queries) Multiplexing queries ==================== In the [Sources and Sinks](https://docs.pola.rs/user-guide/lazy/sources_sinks/) page, we already discussed multiplexing as a way to split a query into multiple sinks. This page will go a bit deeper in this concept, as it is important to understand when combining `LazyFrame`s with procedural programming constructs. When dealing with eager dataframes, it is very common to keep state in a temporary variable. Let's look at the following example. Below we create a `DataFrame` with 10 unique elements in a random order (so that Polars doesn't hit any fast paths for sorted keys). Python `np.random.seed(0) a = np.arange(0, 10) np.random.shuffle(a) df = pl.DataFrame({"n": a}) print(df)` `shape: (10, 1) ┌─────┐ │ n │ │ --- │ │ i64 │ ╞═════╡ │ 2 │ │ 8 │ │ 4 │ │ 9 │ │ 1 │ │ 6 │ │ 7 │ │ 3 │ │ 0 │ │ 5 │ └─────┘` Eager ----- If you deal with the Polars eager API, making a variable and iterating over that temporary `DataFrame` gives the result you expect, as the result of the group-by is stored in `df1`. Even though the output order is unstable, it doesn't matter as it is eagerly evaluated. The follow snippet therefore doesn't raise and the assert passes. Python `# A group-by doesn't guarantee order df1 = df.group_by("n").len() # Take the lower half and the upper half in a list out = [df1.slice(offset=i * 5, length=5) for i in range(2)] # Assert df1 is equal to the sum of both halves pl.testing.assert_frame_equal(df1, pl.concat(out))` Lazy ---- Now if we tried this naively with `LazyFrame`s, this would fail. Python `lf1 = df.lazy().group_by("n").len() out = [lf1.slice(offset=i * 5, length=5).collect() for i in range(2)] pl.testing.assert_frame_equal(lf1.collect(), pl.concat(out))` `AssertionError: DataFrames are different (value mismatch for column 'n') [left]: [9, 2, 0, 5, 3, 1, 7, 8, 6, 4] [right]: [0, 9, 6, 8, 2, 5, 4, 3, 1, 7]` The reason this fails is that `lf1` doesn't contain the materialized result of `df.lazy().group_by("n").len()`, it instead holds the query plan in that variable. ![](data:image/png;base64, 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) This means that every time we branch of this `LazyFrame` and call `collect` we re-evaluate the group-by. Besides being expensive, this also leads to unexpected results if you assume that the output is stable (which isn't the case here). In the example above you are actually evaluating 2 query plans: **Plan 1** ![](data:image/png;base64, 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) **Plan 2** ![](data:image/png;base64, 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) Combine the query plans ----------------------- To circumvent this, we must give Polars the opportunity to look at all the query plans in a single optimization and execution pass. This can be done by passing the diverging `LazyFrame`'s to the `collect_all` function. Python `lf1 = df.lazy().group_by("n").len() out = [lf1.slice(offset=i * 5, length=5) for i in range(2)] results = pl.collect_all([lf1] + out) pl.testing.assert_frame_equal(results[0], pl.concat(results[1:]))` If we explain the combined queries with `pl.explain_all`, we can also observe that they are shared under a single "SINK\_MULTIPLE" evaluation and that the optimizer has recognized that parts of the query come from the same subplan, indicated by the inserted "CACHE" nodes. `SINK_MULTIPLE PLAN 0: CACHE[id: e0571717-8fb3-4ec9-b790-75dc43b72df7] AGGREGATE[maintain_order: false] [len()] BY [col("n")] FROM DF ["n"]; PROJECT["n"] 1/1 COLUMNS PLAN 1: SLICE[offset: 0, len: 5] CACHE[id: e0571717-8fb3-4ec9-b790-75dc43b72df7] AGGREGATE[maintain_order: false] [len()] BY [col("n")] FROM DF ["n"]; PROJECT["n"] 1/1 COLUMNS PLAN 2: SLICE[offset: 5, len: 5] CACHE[id: e0571717-8fb3-4ec9-b790-75dc43b72df7] AGGREGATE[maintain_order: false] [len()] BY [col("n")] FROM DF ["n"]; PROJECT["n"] 1/1 COLUMNS END SINK_MULTIPLE` Combining related subplans in a single execution unit with `pl.collect_all` can thus lead to large performance increases and allows diverging query plans, storing temporary tables, and a more procedural programming style. --- # Visualization - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/misc/visualization/#visualization) Visualization ============= Data in a Polars `DataFrame` can be visualized using common visualization libraries. We illustrate plotting capabilities using the Iris dataset. We read a CSV and then plot one column against another, colored by a yet another column. Python `import polars as pl path = "docs/assets/data/iris.csv" df = pl.read_csv(path) print(df)` `shape: (150, 5) ┌──────────────┬─────────────┬──────────────┬─────────────┬───────────┐ │ sepal_length ┆ sepal_width ┆ petal_length ┆ petal_width ┆ species │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 ┆ f64 ┆ str │ ╞══════════════╪═════════════╪══════════════╪═════════════╪═══════════╡ │ 5.1 ┆ 3.5 ┆ 1.4 ┆ 0.2 ┆ Setosa │ │ 4.9 ┆ 3.0 ┆ 1.4 ┆ 0.2 ┆ Setosa │ │ 4.7 ┆ 3.2 ┆ 1.3 ┆ 0.2 ┆ Setosa │ │ 4.6 ┆ 3.1 ┆ 1.5 ┆ 0.2 ┆ Setosa │ │ 5.0 ┆ 3.6 ┆ 1.4 ┆ 0.2 ┆ Setosa │ │ … ┆ … ┆ … ┆ … ┆ … │ │ 6.7 ┆ 3.0 ┆ 5.2 ┆ 2.3 ┆ Virginica │ │ 6.3 ┆ 2.5 ┆ 5.0 ┆ 1.9 ┆ Virginica │ │ 6.5 ┆ 3.0 ┆ 5.2 ┆ 2.0 ┆ Virginica │ │ 6.2 ┆ 3.4 ┆ 5.4 ┆ 2.3 ┆ Virginica │ │ 5.9 ┆ 3.0 ┆ 5.1 ┆ 1.8 ┆ Virginica │ └──────────────┴─────────────┴──────────────┴─────────────┴───────────┘` Built-in plotting with Altair ----------------------------- Polars has a `plot` method to create plots using [Altair](https://altair-viz.github.io/) : Python `chart = ( df.plot.point( x="sepal_width", y="sepal_length", color="species", ) .properties(width=500, title="Irises") .configure_scale(zero=False) .configure_axisX(tickMinStep=1) ) chart.encoding.x.title = "Sepal Width" chart.encoding.y.title = "Sepal Length" chart` This is shorthand for: `import altair as alt ( alt.Chart(df).mark_point(tooltip=True).encode( x="sepal_length", y="sepal_width", color="species", ) .properties(width=500) .configure_scale(zero=False) )` and is only provided for convenience, and to signal that Altair is known to work well with Polars. For configuration, we suggest reading [Chart Configuration](https://altair-viz.github.io/altair-tutorial/notebooks/08-Configuration.html) . For example, you can: * Change the width/height/title with `.properties(width=500, height=350, title="My amazing plot")`. * Change the x-axis label rotation with `.configure_axisX(labelAngle=30)`. * Change the opacity of the points in your scatter plot with `.configure_point(opacity=.5)`. hvPlot ------ If you import `hvplot.polars`, then it registers a `hvplot` method which you can use to create interactive plots using [hvPlot](https://hvplot.holoviz.org/) . Python `import hvplot.polars df.hvplot.scatter( x="sepal_width", y="sepal_length", by="species", width=650, title="Irises", xlabel='Sepal Width', ylabel='Sepal Length', )` hvplot\_scatter Matplotlib ---------- To create a scatter plot we can pass columns of a `DataFrame` directly to Matplotlib as a `Series` for each column. Matplotlib does not have explicit support for Polars objects but can accept a Polars `Series` by converting it to a NumPy array (which is zero-copy for numeric data without null values). Note that because the column `'species'` isn't numeric, we need to first convert it to numeric values so that it can be passed as an argument to `c`. Python `import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.scatter( x=df["sepal_width"], y=df["sepal_length"], c=df["species"].cast(pl.Categorical).to_physical(), ) ax.set_title('Irises') ax.set_xlabel('Sepal Width') ax.set_ylabel('Sepal Length')` ![](data:image/png;base64, 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) Plotnine -------- [Plotnine](https://plotnine.org/) is a reimplementation of ggplot2 in Python, bringing the Grammar of Graphics to Python users with an interface similar to its R counterpart. It supports Polars `DataFrame` by internally converting it to a pandas `DataFrame`. Python `from plotnine import ggplot, aes, geom_point, labs ( ggplot(df, mapping=aes(x="sepal_width", y="sepal_length", color="species")) + geom_point() + labs(title="Irises", x="Sepal Width", y="Sepal Length") )` ![](data:image/png;base64, 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c5xXAAYmle7LHMX0SzKl8yc/+clYtWpV5npRUVFcdNFFcf7558fMmTMz00KvWLEifve738Vdd921a7/TTz89/uZv/qbfo71gwYI+b7tkyZJ+tw8AAAAAAACMDALgQbJ9+/a4+uqrY/HixX3a/sILL4y//uu/jpKS/hdlC4ABAAAAAACAhDWAB0ldXV28+tWvjsmTJ+932wkTJsRpp502oPAXAAAAAAAAYCcVwIOgs7Mzvvvd78aNN97Y4/aysrIYO3Zs5v5k3d6urq4e91988cVx5ZVXRnFxcb8eTwUwAAAAAAAAkBAAD4Ik/E3W991pzpw5cfnll8cxxxwTpaWlmduampri3nvvjZ/85CexefPmXdteeuml8Y53vKNfj5eEyX21e+g82qRSqRg/fnyP25LxtxQ2+6rQT9TX1xsknFfICecV9sf7FZxXyDXnFQbCexacW8g15xUG67yy87UFwF+YczjHVqxYEb///e93XT/qqKPis5/9bKb6t7uqqqp42cteFieeeGL83d/9XaxduzZz+29+85vMesBTp07t82OOGzeuz9tu2rSpz9uOFskbCAEwfXmdgPMKuf79A84rOK+QL/4Ooj+vFXBuIde/g8B5BWBwWQM4x2655ZZdb2KSqZw//OEP7xH+djdmzJh4//vfv+t6Mj30nXfemetuAQAAAAAAAKOAADjHnn322V3/nzdvXkyZMmW/+xx55JGZIHin5cuX57pbAAAAAAAAwCggAM6xHTt27Pr/5MmT+7y2QfegOFkfGAAAAAAAAKC/BMA5lqztu1NLS0uf90umft6ptrY2190CAAAAAAAARgEBcI51r/p95plnoqOjY7/7tLe3x5o1a3ZdnzVrVq67BQAAAAAAAIwCAuAcO+GEE3b9f/v27XHDDTfsd5+bb745Wltbd10/6aSTct0tAAAAAAAAYBQQAOfYGWecEePHj991/dprr4077rij1+1vu+22uOaaa3qEv3Pnzs11twAAAAAAAIBRoCTfHSg0lZWV8aEPfSj++Z//OTP9c3K56qqr4re//W2mOjiZIjqVSsWGDRvigQceiOXLl+/ad9y4cfG+970vr/0HAAAAAAAARi4B8CBIgt5Pf/rT8ZWvfCUzDXRi6dKlmUtvkmD4H/7hH2LChAmD0SUAAAAAAABgFDAF9CBZsGBBfOMb34jXvva1UVtbu8+K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Ktq2bYusrGPVRVIiXl2vc8/z8528OpjJtYnqoxPSM3DCKGBb4S5M2XIER3JSAEcs3AY3jOYStMgowJWdm6NZbJtwbyoRRQip2nq0xdW4r9lETM+di5/yFuCQPRd2twPJpgT0j++MyzNOQ7toziWuN/K58ZL0UzAxbTTmF63F1Ozfsd26H0WuEiQY49AuupkKc4Yn9NJ91W9l4ixunNOzGKd1LcbKvTHYmp2A/FLA6QLio4GWSSUY2KZMhcVEpJ2BCV3xTcensLVsDyYf/RUrSrYg31mEaIMFTaPS1Hxm56YOR4wx+DmDiYiIiIiIiOp9AOwJRj2qmkw5Li5O9dSWeX7F8uXLKw2AxYUXXqhCU5lEu7CwEM8++yxeeeUVhMuYMWPw3nvvqetLlizB+vXr0b179yqX//rrr70toGUSbum1TkT/6JCYjEf7VZygXlqlN+ZuIqKgxBljcGn6GHWhyCLh7vDEXupSH0WbgSGZVpzVv/yUINnZpTXOe0VEwesY0wpPtPwXdyERERERERHVC3XeAloCWl/VVer69tfetGlTteN6Konli7GPP/5YzREcLqNHj1ZtqYVMbP3MM89Uuf2zZ8/GjBkzvLcvvvhiWCw8u5yIiIiIiIiIiIiIiIiIIqACuOJcviaTqdoAWCpoxc6dO6sdV+YS9igoKFBzA48cGZ55+6R6+e6778ZDDz2kgmjZnvvvv19VO/fq1QuJiYnIy8vDsmXLvPMhC6liDtfk30REREREREREREREREQU+eo8AE5JSSl3W1o8V7yvsgrgHTt2VDtu69at1b+eOd+kHXS4AmDRrVs3PProo6oddXFxsaoEljDbE2hXNufxAw88EJFz1hERERERERERERERERFRA20B3aFDh3K3Fy5cWOWyngBY2jpv3rwZdru9ymUTEsrPk3b48GGEm1T0vv7666o62WyuPGtPTU3FtddeiyeffBKxsbF1vo1EREREREREREREREREVH/UeQWwtEGWts9SESvB7ptvvumdv7eizp07e69brVbMmzevXKtnXxs2bPC7tXRdysjIwF133YXrrrsOa9asURXPEmQnJSWhbdu26NixI6t+iYiIiIiIiIiIiIiIiChyW0CPHj0av/76q7ot8+DedNNNePXVVxEdHV1u2T59+sBoNKqgWPzf//1flQHwO++8o/6VZaWNcpMmTaAn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b7MJiDMGF+CmmRJxa+PQT4QlIiIiIiIiIqpMaH3LgtC0adNyt6OjozUZ1+Vyea8nJiZqMiYRERERUW26q0d7/Kd4KdyHBwS0XollFx4elgCj8dgUKFT3OsW0wvtt/40rdz4Nu9v/Suw4YzQmt3sYzS0Ztbp9RERERERUvx09ejTcm6ALGRn824pIFxXA/fv3L3d769atmoyblZWl/pV5gH2rgYmIiIiI9EoC3GcGtUV8i0Vw458TGqtTEr8RD48yoElsXK1vH1VvTHJ/fNn+caSa/DsBtWlUGr7r+AwGJnTlriUiIiIiIiKi+hMAd+/eHV27/vOFxzfffBPymNnZ2Zg/f74Kf8XYsWNDHpOIiIiIqK5C4Ef7d8AFQzcBjZbCbig+bhkJh0sT16FPz2V49eR0hr86MjyxFxZ3exePN78GbS3NKl2mS0xrPNfyRizs+jb6xHWs820kIiIiIiIiooalzltAi0ceeQQTJ05U19966y3861//Cqlq97nnnkNpaakKgOPj43HDDTdouLVERERERLVvcKPGGNwIyLXl4a/sLBwutsPhciM5xowTkmPQLbn8VCqkH6nmRNzcZBxubHwulhRvRJb1IIpdZUg0xaJDdEv0jevoPVmViIiIiIiIiKheBsAXX3wxfvzxR0yZMkUFt6eeeiqmT5+Ofv36BTzWG2+8gRdffFFdd7vd6nrjxo1rYauJiIiIiGpfWnQMruvZ/biON/JZl/TNaDBicEJ3dSEiIiIiIiIiajAtoD3ee+89nHXWWer63r17MXjwYFUJvHjx4hrXlS+/5s2bh1NOOQV33HGHuk/OqH/mmWdw/fXX1/q2ExERERERERERERERERHpUdhaQIsePXqoIDc/Px9OpxMff/yxuqSlpaFv375o166dquaNjY2F1WrFkSNHcODAAcyZMwe5ubneMFjC31atWmHz5s245ppr/NoGWeeDDz6o1edJRERERERERERERERERFTvA+CnnnrquDmw5LanrZ20uPvjjz/UpTK+7e886+3ZsweffPKJX4/vCY0ZABMRERERERERERERERFRfRKWALhiEOtRMRSuSmXhMRERERERERERERERERFRQxe2ANhTxetbzUtERERERERERERERERERBEWAH/00UfheFgiIiIiIiIiIiIiIiIionotLAHwlVdeGY6HJSIiIiIiIiIi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OHCg+T/n1saNG81FDPnxfxQAAAAAgEgRAAMAAABxcO2115p2u1aHDx821YhavasVsJ9++qmtrXO06PymGnzqvz46T65WAmsFrYaMu3fvluXLl8trr70mjRs3tq2/dOlSUzGp1ZNuvP766/L555+b+yVKlDDz0mrlre5j69atplXxoEGDpGTJkrb1/vvf/wZt9+szYsSIHNWlerxvv/22rFmzRvbt22f2o4G3PmatkPUFyNoKOl60alcDdbcBcLDq30gC4FjO/6vvqXP7Ouev/j611bj+TjIzM+Xjjz82/xd8xo8fb1o5B6NzJg8ZMsTc9KICK22b7fuZ3qzbDUQrrfWz6aOBtVa663Hp5+aXX34xLcWd1fSLFy+WsWPHun4vAAAAAADIb0XOBOvzBgAAACCmtCJW2yKHCggbNWokrVu3lhYtWpgALDU1NU/71ba81srMCy64wITNWo0aiAa9Tz/9tJkj1eq9994z86KGmgPYJy0tzQTMdevWDbgfDd40gNy8ebMtmNb5kevXrx9wnWrVqpnA2ueuu+4yFZ25tTEeOXKkaQFtpZWwWk0bSHp6ui2U1OPTx6LFeTwaZGrL4bPOynm9roaeH3zwgX952rRp8pe//MX2HH0d+l4qfR806A/0mdF96r59NOjcvn170ON0Owfw/PnzzefUSoP3qVOnmhA42DzBetFDoIrvYH+yzpkzxxbo62fB97rdPN+nfPny5rN89dVXB1xv79695qIC62dA26Hr6wQAAAAAIBFRAQwAAADEyW233SZDhw7N9Tk6J+r//vc/E9Rp0FehQgXT8rdXr17y1ltv5VotGchnn31mC3+1/fC3334bNPxVGkQ+/vjjJqCz0lDYbRWwbkPDymDhr9JQdebMmZKcnOx/TAPBUaNGBXz+unXrbOGvBpijR48OOYftAw88YOZytcptXuJYc1bdZmdnm4plJ32v9f2xXhwQqGLXWgWs4an+fgNxVugGCkcj8dBDD9mWNbzXCvBg4a/q27dv0N9zLGlF+hdffBE0/FV63M8++6ztMa1i1jbXAAAAAAAkIgJgAAAAII60Je4nn3xim8fVzTykEydONNWuGprqfMI6N++JEydCrusM2bSqt06dOq72q+2WS5cu7V/WFsvaDtoNrXR2znsciFavZmRk2B57//33A7bCtoa/qmvXrrbwODctW7bMUeUZ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) Seaborn ------- [Seaborn](https://seaborn.pydata.org/) can accept a Polars `DataFrame` by leveraging the [dataframe interchange protocol](https://data-apis.org/dataframe-api/) , which offers zero-copy conversion where possible. Note that the protocol does not support all Polars data types (e.g. `List`) so your mileage may vary here. Python `import seaborn as sns import matplotlib.pyplot as plt fig, ax = plt.subplots() sns.scatterplot( df, x="sepal_width", y="sepal_length", hue="species", ax=ax, ) ax.set_title('Irises') ax.set_xlabel('Sepal Width') ax.set_ylabel('Sepal Length')` ![](data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAk2BJREFUeJzt3Qd4k2XXB/B/Z7r3pGWXvRHZggrKUkERFVFwgAv3eBVFQf0UUV7H6wKV4QTBgQtUBEFZAiJ7z5bunc50fte5Y0vTJiXpSNrk//PKZfvc6dOnT0N7et/3OcepvLy8HERERETkMJxtfQFEREREZF0MAImIiIgcDANAIiIiIgfDAJCIiIjIwTAAJCIiInIwDACJiIiIHAwDQCIiIiIHwwCQiIiIyMEwACQiIiJyMAwAiYiIiBwMA0AiIiIiB8MAkIiIiMjBMAAkIiIicjAMAImIiIgcDANAIiIiIgfDAJCIiIjIwTAAJCIiInIwDACJiIiIHAwDQCIiIiIHwwCQiIiIyMEwACQiIiJyMAwAiYiIiBwMA0AiIiIiB8MAkIiIiMjBMAAkIiIicjAMAImIiIgcDANAIiIiIgfDAJCIiIjIwTAAJCIiInIwDACJiIiIHAwDQCIiIiIHwwCQiIiIyMEwACQiIiJyMAwAiYiIiBwMA0Aicki33XYb2rRpY+vLICKyCQaARGQ3li1bBicnJ+zatcvWl0JE1KS52voCiIhs4cMPP0RZWRlvPhE5JM4AEpFDycvLU/93c3ODRqOx9eUQEdkEA0Aisut9fj4+Pjh58iTGjh0LX19fTJkyxeQewBUrVuCiiy5Sz/Pz80OPHj3w1ltvGTwnKysLDz/8MFq2bKkCyJiYGMyfP7/GbKI55yIishUuARORXSspKcGoUaMwdOhQLFiwAF5eXkaft27dOkyePBkjRoxQAZ04fPgwtmzZgoceeki9n5+fj+HDhyM+Ph533303WrVqha1bt2LWrFlITEzEm2++afa5iIhsiQEgEdk1nU6HSZMmYd68ebU+76efflIzdb/88gtcXFyMPuf1119Xs4n//PMPOnTooI5JINiiRQu89tpreOyxx9TMoDnnIiKyJS4BE5Hdu/feey/4nICAALU/UGbvTFm1ahUuueQSBAYGIi0trfIxcuRIlJaW4o8//jD7XEREtsQAkIjsmqurK6Kjoy/4vPvuuw8dO3bEmDFj1PPvuOMO/PzzzwbPOX78uDoWGhpq8JAAUKSkpJh9LiIiW+ISMBHZNUnUcHa+8N+6YWFh2LNnj1q2Xbt2rXosXboUU6dOxccff6yeI4keV1xxBf7zn/8YPYcEfeaei4jIlhgAEhH9y93dHVdffbV6SLAnM3mLFi3Cs88+q7J927dvj9zc3MoZv/qci4jIlrgETEQEID093fCHo7MzevbsWZlIIm644QZs27ZNzexVJ+VhJOPY3HMREdkSZwCJiABMnz4dGRkZuPzyy9W+vbNnz+Ltt99G79690aVLF3WPnnjiCXz//fe46qqrVB1BqfMnyR779+/HV199hTNnziAkJMSscxER2RIDQCIiALfccgs++OADvPfee2o2LyIiAjfeeCPmzp1buYdQaghu2rQJL7/8ssoI/uSTT1S5F9n79/zzz8Pf39/scxER2ZJTeXl5uU2vgIiIiIisin+KEhERETkYBoBEREREDoYBIBEREZGDYQBIRERE5GAYABIRERE5GAaARERERA6GASARERGRg2Eh6HqQ/p4JCQnw9fWFk5NTw31XiIiIqNGUl5cjJycHLVq0cNji7AwA60GCv5YtWzbcd4OIiIisJi4uTrVrdEQMAOtBZv4qXkDSDoqIiIiaPq1WqyZwKn6POyIGgPVQsewrwR8DQCIioubFyYG3b9nFwndpaSmeffZZtG3bFp6enmjfvj1efPFFtcZfm40bN6Jv377QaDSIiYnBsmXLrHbNRERERLZiFzOA8+fPx/vvv4+PP/4Y3bp1w65du3D77bfD398fDz74oNGPOX36NMaNG4d77rkHn3/+OdavX4/p06cjMjISo0aNsvrXQERERGQtTuUXmiZrBq666iqEh4dj8eLFlccmTpyoZgM/++wzox/z5JNP4qeffsKBAwcqj910003IysrCzz//bPYeAgkys7OzuQRMRETUTPD3t53MAA4ePBgffPABjh07ho4dO2Lv3r3YvHkzXn/9dZMfs23bNowcOdLgmMz8PfzwwyY/RqfTqUfVFxAREdkHmQ8pKSlR24qoeXNxcYGrq6tD7/FziADwqaeeUsFY586d1Tdd/vG+9NJLmDJlismPSUpKUrOGVcn7cp6CggI1e1jdvHnz8PzzzzfK10BERLZTVFSExMRE5Ofn89tgJ7y8vNS2Lnd3d1tfSpNkFwHg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) Plotly ------ [Plotly](https://plotly.com/) can accept a Polars `DataFrame` by leveraging: * [Narwhals](https://narwhals-dev.github.io/narwhals/) , since plotly v6.0.0, and therefore running execution natively without any conversion overhead. * The [dataframe interchange protocol](https://data-apis.org/dataframe-api/) , before plotly v6.0.0, which offers zero-copy conversion where possible. Note that the protocol does not support all Polars data types (e.g. `List`) so your mileage may vary here. Python `import plotly.express as px px.scatter( df, x="sepal_width", y="sepal_length", color="species", width=650, title="Irises", labels={'sepal_width': 'Sepal Width', 'sepal_length': 'Sepal Length'} )` --- # Query plan - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/lazy/query-plan/#query-plan) Query plan ========== For any lazy query Polars has both: * a non-optimized plan with the set of steps code as we provided it and * an optimized plan with changes made by the query optimizer We can understand both the non-optimized and optimized query plans with visualization and by printing them as text. Below we consider the following query: Python `q1 = ( pl.scan_csv("docs/assets/data/reddit.csv") .with_columns(pl.col("name").str.to_uppercase()) .filter(pl.col("comment_karma") > 0) )` Non-optimized query plan ------------------------ ### Graphviz visualization To create visualizations of the query plan, [Graphviz should be installed](https://graphviz.org/download/) and added to your PATH. First we visualize the non-optimized plan by setting `optimized=False`. Python [`show_graph`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.show_graph.html) `q1.show_graph(optimized=False)` ![](data:image/png;base64, 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) The query plan visualization should be read from bottom to top. In the visualization: * each box corresponds to a stage in the query plan * the `sigma` stands for `SELECTION` and indicates any filter conditions * the `pi` stands for `PROJECTION` and indicates choosing a subset of columns ### Printed query plan We can also print the non-optimized plan with `explain(optimized=False)` Python [`explain`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.explain.html) `q1.explain(optimized=False)` `FILTER [(col("comment_karma")) > (0)] FROM WITH_COLUMNS: [col("name").str.uppercase()] CSV SCAN data/reddit.csv PROJECT */6 COLUMNS` The printed plan should also be read from bottom to top. This non-optimized plan is roughly equal to: * read from the `data/reddit.csv` file * read all 6 columns (where the \* wildcard in PROJECT \*/6 COLUMNS means take all columns) * transform the `name` column to uppercase * apply a filter on the `comment_karma` column Optimized query plan -------------------- Now we visualize the optimized plan with `show_graph`. Python [`show_graph`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.show_graph.html) `q1.show_graph()` ![](data:image/png;base64, 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) We can also print the optimized plan with `explain` Python [`explain`](https://docs.pola.rs/api/python/stable/reference/lazyframe/api/polars.LazyFrame.explain.html) `q1.explain()` `WITH_COLUMNS: [col("name").str.uppercase()] CSV SCAN data/reddit.csv PROJECT */6 COLUMNS SELECTION: [(col("comment_karma")) > (0)]` The optimized plan is to: * read the data from the Reddit CSV * apply the filter on the `comment_karma` column while the CSV is being read line-by-line * transform the `name` column to uppercase In this case the query optimizer has identified that the `filter` can be applied while the CSV is read from disk rather than reading the whole file into memory and then applying the filter. This optimization is called _Predicate Pushdown_. --- # Expression expansion - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/expression-expansion/#expression-expansion) Expression expansion ==================== As you've seen in [the section about expressions and contexts](https://docs.pola.rs/user-guide/concepts/expressions-and-contexts/) , expression expansion is a feature that enables you to write a single expression that can expand to multiple different expressions, possibly depending on the schema of the context in which the expression is used. This feature isn't just decorative or syntactic sugar. It allows for a very powerful application of [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) principles in your code: a single expression that specifies multiple columns expands into a list of expressions, which means you can write one single expression and reuse the computation that it represents. In this section we will show several forms of expression expansion and we will be using the dataframe that you can see below for that effect: Python Rust `import polars as pl df = pl.DataFrame( { # As of 14th October 2024, ~3pm UTC "ticker": ["AAPL", "NVDA", "MSFT", "GOOG", "AMZN"], "company_name": ["Apple", "NVIDIA", "Microsoft", "Alphabet (Google)", "Amazon"], "price": [229.9, 138.93, 420.56, 166.41, 188.4], "day_high": [231.31, 139.6, 424.04, 167.62, 189.83], "day_low": [228.6, 136.3, 417.52, 164.78, 188.44], "year_high": [237.23, 140.76, 468.35, 193.31, 201.2], "year_low": [164.08, 39.23, 324.39, 121.46, 118.35], } ) print(df)` `use polars::prelude::*; // Data as of 14th October 2024, ~3pm UTC let df = df!( "ticker" => ["AAPL", "NVDA", "MSFT", "GOOG", "AMZN"], "company_name" => ["Apple", "NVIDIA", "Microsoft", "Alphabet (Google)", "Amazon"], "price" => [229.9, 138.93, 420.56, 166.41, 188.4], "day_high" => [231.31, 139.6, 424.04, 167.62, 189.83], "day_low" => [228.6, 136.3, 417.52, 164.78, 188.44], "year_high" => [237.23, 140.76, 468.35, 193.31, 201.2], "year_low" => [164.08, 39.23, 324.39, 121.46, 118.35], )?; println!("{df}");` `shape: (5, 7) ┌────────┬───────────────────┬────────┬──────────┬─────────┬───────────┬──────────┐ │ ticker ┆ company_name ┆ price ┆ day_high ┆ day_low ┆ year_high ┆ year_low │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │ ╞════════╪═══════════════════╪════════╪══════════╪═════════╪═══════════╪══════════╡ │ AAPL ┆ Apple ┆ 229.9 ┆ 231.31 ┆ 228.6 ┆ 237.23 ┆ 164.08 │ │ NVDA ┆ NVIDIA ┆ 138.93 ┆ 139.6 ┆ 136.3 ┆ 140.76 ┆ 39.23 │ │ MSFT ┆ Microsoft ┆ 420.56 ┆ 424.04 ┆ 417.52 ┆ 468.35 ┆ 324.39 │ │ GOOG ┆ Alphabet (Google) ┆ 166.41 ┆ 167.62 ┆ 164.78 ┆ 193.31 ┆ 121.46 │ │ AMZN ┆ Amazon ┆ 188.4 ┆ 189.83 ┆ 188.44 ┆ 201.2 ┆ 118.35 │ └────────┴───────────────────┴────────┴──────────┴─────────┴───────────┴──────────┘` Function `col` -------------- The function `col` is the most common way of making use of expression expansion features in Polars. Typically used to refer to one column of a dataframe, in this section we explore other ways in which you can use `col` (or its variants, when in Rust). ### Explicit expansion by column name The simplest form of expression expansion happens when you provide multiple column names to the function `col`. The example below uses a single function `col` with multiple column names to convert the values in USD to EUR: Python Rust [`col`](https://docs.pola.rs/api/python/stable/reference/expressions/col.html) `eur_usd_rate = 1.09 # As of 14th October 2024 result = df.with_columns( ( pl.col( "price", "day_high", "day_low", "year_high", "year_low", ) / eur_usd_rate ).round(2) ) print(result)` [`col`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.col.html) `let eur_usd_rate = 1.09; // As of 14th October 2024 let result = df .clone() .lazy() .with_column( (cols(["price", "day_high", "day_low", "year_high", "year_low"]).as_expr() / lit(eur_usd_rate)) .round(2, RoundMode::default()), ) .collect()?; println!("{result}");` `shape: (5, 7) ┌────────┬───────────────────┬────────┬──────────┬─────────┬───────────┬──────────┐ │ ticker ┆ company_name ┆ price ┆ day_high ┆ day_low ┆ year_high ┆ year_low │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │ ╞════════╪═══════════════════╪════════╪══════════╪═════════╪═══════════╪══════════╡ │ AAPL ┆ Apple ┆ 210.92 ┆ 212.21 ┆ 209.72 ┆ 217.64 ┆ 150.53 │ │ NVDA ┆ NVIDIA ┆ 127.46 ┆ 128.07 ┆ 125.05 ┆ 129.14 ┆ 35.99 │ │ MSFT ┆ Microsoft ┆ 385.83 ┆ 389.03 ┆ 383.05 ┆ 429.68 ┆ 297.61 │ │ GOOG ┆ Alphabet (Google) ┆ 152.67 ┆ 153.78 ┆ 151.17 ┆ 177.35 ┆ 111.43 │ │ AMZN ┆ Amazon ┆ 172.84 ┆ 174.16 ┆ 172.88 ┆ 184.59 ┆ 108.58 │ └────────┴───────────────────┴────────┴──────────┴─────────┴───────────┴──────────┘` When you list the column names you want the expression to expand to, you can predict what the expression will expand to. In this case, the expression that does the currency conversion is expanded to a list of five expressions: Python Rust [`col`](https://docs.pola.rs/api/python/stable/reference/expressions/col.html) `exprs = [ (pl.col("price") / eur_usd_rate).round(2), (pl.col("day_high") / eur_usd_rate).round(2), (pl.col("day_low") / eur_usd_rate).round(2), (pl.col("year_high") / eur_usd_rate).round(2), (pl.col("year_low") / eur_usd_rate).round(2), ] result2 = df.with_columns(exprs) print(result.equals(result2))` [`col`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.col.html) `let exprs = [ (col("price") / lit(eur_usd_rate)).round(2, RoundMode::default()), (col("day_high") / lit(eur_usd_rate)).round(2, RoundMode::default()), (col("day_low") / lit(eur_usd_rate)).round(2, RoundMode::default()), (col("year_high") / lit(eur_usd_rate)).round(2, RoundMode::default()), (col("year_low") / lit(eur_usd_rate)).round(2, RoundMode::default()), ]; let result2 = df.clone().lazy().with_columns(exprs).collect()?; println!("{}", result.equals(&result2));` `True` ### Expansion by data type We had to type five column names in the previous example but the function `col` can also conveniently accept one or more data types. If you provide data types instead of column names, the expression is expanded to all columns that match one of the data types provided. The example below performs the exact same computation as before: Python Rust [`col`](https://docs.pola.rs/api/python/stable/reference/expressions/col.html) `result = df.with_columns((pl.col(pl.Float64) / eur_usd_rate).round(2)) print(result)` [`dtype_col`](https://docs.rs/polars/latest/polars/prelude/fn.dtype_col.html) `let result = df .clone() .lazy() .with_column( (dtype_col(&DataType::Float64).as_selector().as_expr() / lit(eur_usd_rate)) .round(2, RoundMode::default()), ) .collect()?; println!("{result}");` `shape: (5, 7) ┌────────┬───────────────────┬────────┬──────────┬─────────┬───────────┬──────────┐ │ ticker ┆ company_name ┆ price ┆ day_high ┆ day_low ┆ year_high ┆ year_low │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │ ╞════════╪═══════════════════╪════════╪══════════╪═════════╪═══════════╪══════════╡ │ AAPL ┆ Apple ┆ 210.92 ┆ 212.21 ┆ 209.72 ┆ 217.64 ┆ 150.53 │ │ NVDA ┆ NVIDIA ┆ 127.46 ┆ 128.07 ┆ 125.05 ┆ 129.14 ┆ 35.99 │ │ MSFT ┆ Microsoft ┆ 385.83 ┆ 389.03 ┆ 383.05 ┆ 429.68 ┆ 297.61 │ │ GOOG ┆ Alphabet (Google) ┆ 152.67 ┆ 153.78 ┆ 151.17 ┆ 177.35 ┆ 111.43 │ │ AMZN ┆ Amazon ┆ 172.84 ┆ 174.16 ┆ 172.88 ┆ 184.59 ┆ 108.58 │ └────────┴───────────────────┴────────┴──────────┴─────────┴───────────┴──────────┘` When we use a data type with expression expansion we cannot know, beforehand, how many columns a single expression will expand to. We need the schema of the input dataframe if we want to determine what is the final list of expressions that is to be applied. If we weren't sure about whether the price columns where of the type `Float64` or `Float32`, we could specify both data types: Python Rust [`col`](https://docs.pola.rs/api/python/stable/reference/expressions/col.html) `result2 = df.with_columns( ( pl.col( pl.Float32, pl.Float64, ) / eur_usd_rate ).round(2) ) print(result.equals(result2))` [`dtype_cols`](https://docs.rs/polars/latest/polars/prelude/fn.dtype_cols.html) `let result2 = df .clone() .lazy() .with_column( (dtype_cols([DataType::Float32, DataType::Float64]) .as_selector() .as_expr() / lit(eur_usd_rate)) .round(2, RoundMode::default()), ) .collect()?; println!("{}", result.equals(&result2));` `True` ### Expansion by pattern matching You can also use regular expressions to specify patterns that are used to match the column names. To distinguish between a regular column name and expansion by pattern matching, regular expressions start and end with `^` and `$`, respectively. This also means that the pattern must match against the whole column name string. Regular expressions can be mixed with regular column names: Python Rust [`col`](https://docs.pola.rs/api/python/stable/reference/expressions/col.html) `result = df.select(pl.col("ticker", "^.*_high$", "^.*_low$")) print(result)` [`col`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.col.html) ``// NOTE: Using regex inside `col`/`cols` requires the feature flag `regex`. let result = df .clone() .lazy() .select([cols(["ticker", "^.*_high$", "^.*_low$"]).as_expr()]) .collect()?; println!("{result}");`` `shape: (5, 5) ┌────────┬──────────┬─────────┬───────────┬──────────┐ │ ticker ┆ day_high ┆ day_low ┆ year_high ┆ year_low │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ f64 ┆ f64 ┆ f64 │ ╞════════╪══════════╪═════════╪═══════════╪══════════╡ │ AAPL ┆ 231.31 ┆ 228.6 ┆ 237.23 ┆ 164.08 │ │ NVDA ┆ 139.6 ┆ 136.3 ┆ 140.76 ┆ 39.23 │ │ MSFT ┆ 424.04 ┆ 417.52 ┆ 468.35 ┆ 324.39 │ │ GOOG ┆ 167.62 ┆ 164.78 ┆ 193.31 ┆ 121.46 │ │ AMZN ┆ 189.83 ┆ 188.44 ┆ 201.2 ┆ 118.35 │ └────────┴──────────┴─────────┴───────────┴──────────┘` ### Arguments cannot be of mixed types In Python, the function `col` accepts an arbitrary number of strings (as [column names](https://docs.pola.rs/user-guide/expressions/expression-expansion/#explicit-expansion-by-column-name) or as [regular expressions](https://docs.pola.rs/user-guide/expressions/expression-expansion/#expansion-by-pattern-matching) ) or an arbitrary number of data types, but you cannot mix both in the same function call: `try: df.select(pl.col("ticker", pl.Float64)) except TypeError as err: print("TypeError:", err)` `TypeError: argument 'names': 'DataTypeClass' object cannot be cast as 'str'` Selecting all columns --------------------- Polars provides the function `all` as shorthand notation to refer to all columns of a dataframe: Python Rust [`all`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.all.html) `result = df.select(pl.all()) print(result.equals(df))` [`all`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.all.html) `let result = df.clone().lazy().select([all().as_expr()]).collect()?; println!("{}", result.equals(&df));` `True` Note The function `all` is syntactic sugar for `col("*")`, but since the argument `"*"` is a special case and `all` reads more like English, the usage of `all` is preferred. Excluding columns ----------------- Polars also provides a mechanism to exclude certain columns from expression expansion. For that, you use the function `exclude`, which accepts exactly the same types of arguments as `col`: Python Rust [`exclude`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.exclude.html) `result = df.select(pl.all().exclude("^day_.*$")) print(result)` [`exclude`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.exclude) `let result = df .clone() .lazy() .select([all().exclude_cols(["^day_.*$"]).as_expr()]) .collect()?; println!("{result}");` `shape: (5, 5) ┌────────┬───────────────────┬────────┬───────────┬──────────┐ │ ticker ┆ company_name ┆ price ┆ year_high ┆ year_low │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 ┆ f64 ┆ f64 │ ╞════════╪═══════════════════╪════════╪═══════════╪══════════╡ │ AAPL ┆ Apple ┆ 229.9 ┆ 237.23 ┆ 164.08 │ │ NVDA ┆ NVIDIA ┆ 138.93 ┆ 140.76 ┆ 39.23 │ │ MSFT ┆ Microsoft ┆ 420.56 ┆ 468.35 ┆ 324.39 │ │ GOOG ┆ Alphabet (Google) ┆ 166.41 ┆ 193.31 ┆ 121.46 │ │ AMZN ┆ Amazon ┆ 188.4 ┆ 201.2 ┆ 118.35 │ └────────┴───────────────────┴────────┴───────────┴──────────┘` Naturally, the function `exclude` can also be used after the function `col`: Python Rust [`exclude`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.exclude.html) `result = df.select(pl.col(pl.Float64).exclude("^day_.*$")) print(result)` [`exclude`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.exclude) `let result = df .clone() .lazy() .select([dtype_col(&DataType::Float64) .as_selector() .exclude_cols(["^day_.*$"]) .as_expr()]) .collect()?; println!("{result}");` `shape: (5, 3) ┌────────┬───────────┬──────────┐ │ price ┆ year_high ┆ year_low │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 │ ╞════════╪═══════════╪══════════╡ │ 229.9 ┆ 237.23 ┆ 164.08 │ │ 138.93 ┆ 140.76 ┆ 39.23 │ │ 420.56 ┆ 468.35 ┆ 324.39 │ │ 166.41 ┆ 193.31 ┆ 121.46 │ │ 188.4 ┆ 201.2 ┆ 118.35 │ └────────┴───────────┴──────────┘` Column renaming --------------- By default, when you apply an expression to a column, the result keeps the same name as the original column. Preserving the column name can be semantically wrong and in certain cases Polars may even raise an error if duplicate names occur: Python Rust `from polars.exceptions import DuplicateError gbp_usd_rate = 1.31 # As of 14th October 2024 try: df.select( pl.col("price") / gbp_usd_rate, # This would be named "price"... pl.col("price") / eur_usd_rate, # And so would this. ) except DuplicateError as err: print("DuplicateError:", err)` `let gbp_usd_rate = 1.31; // As of 14th October 2024 let result = df .clone() .lazy() .select([ col("price") / lit(gbp_usd_rate), col("price") / lit(eur_usd_rate), ]) .collect(); match result { Ok(df) => println!("{df}"), Err(e) => println!("{e}"), };` ``DuplicateError: projections contained duplicate output name 'price'. It's possible that multiple expressions are returning the same default column name. If this is the case, try renaming the columns with `.alias("new_name")` to avoid duplicate column names.`` To prevent errors like this, and to allow users to rename their columns when appropriate, Polars provides a series of functions that let you change the name of a column or a group of columns. ### Renaming a single column with `alias` The function `alias` has been used thoroughly in the documentation already and it lets you rename a single column: Python Rust [`alias`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.alias.html) `result = df.select( (pl.col("price") / gbp_usd_rate).alias("price (GBP)"), (pl.col("price") / eur_usd_rate).alias("price (EUR)"), )` [`alias`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.alias) `let _result = df .clone() .lazy() .select([ (col("price") / lit(gbp_usd_rate)).alias("price (GBP)"), (col("price") / lit(eur_usd_rate)).alias("price (EUR)"), ]) .collect()?;` ### Prefixing and suffixing column names When using expression expansion you cannot use the function `alias` because the function `alias` is designed specifically to rename a single column. When it suffices to add a static prefix or a static suffix to the existing names, we can use the functions `prefix` and `suffix` from the namespace `name`: Python Rust [`name namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/name.html) · [`prefix`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.name.prefix.html) · [`suffix`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.name.suffix.html) `result = df.select( (pl.col("^year_.*$") / eur_usd_rate).name.prefix("in_eur_"), (pl.col("day_high", "day_low") / gbp_usd_rate).name.suffix("_gbp"), ) print(result)` [`name namespace`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ExprNameNameSpace.html) · [`prefix`](https://docs.rs/polars/latest/polars/prelude/struct.ExprNameNameSpace.html#method.prefix) · [`suffix`](https://docs.rs/polars/latest/polars/prelude/struct.ExprNameNameSpace.html#method.suffix) · [Available on feature lazy](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag lazy") `let result = df .clone() .lazy() .select([ (col("^year_.*$") / lit(eur_usd_rate)) .name() .prefix("in_eur_"), (cols(["day_high", "day_low"]).as_expr() / lit(gbp_usd_rate)) .name() .suffix("_gbp"), ]) .collect()?; println!("{result}");` `shape: (5, 4) ┌──────────────────┬─────────────────┬──────────────┬─────────────┐ │ in_eur_year_high ┆ in_eur_year_low ┆ day_high_gbp ┆ day_low_gbp │ │ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 ┆ f64 │ ╞══════════════════╪═════════════════╪══════════════╪═════════════╡ │ 217.642202 ┆ 150.53211 ┆ 176.572519 ┆ 174.503817 │ │ 129.137615 ┆ 35.990826 ┆ 106.564885 ┆ 104.045802 │ │ 429.678899 ┆ 297.605505 ┆ 323.694656 ┆ 318.717557 │ │ 177.348624 ┆ 111.431193 ┆ 127.954198 ┆ 125.78626 │ │ 184.587156 ┆ 108.577982 ┆ 144.908397 ┆ 143.847328 │ └──────────────────┴─────────────────┴──────────────┴─────────────┘` ### Dynamic name replacement If a static prefix/suffix is not enough, the namespace `name` also provides the function `map` that accepts a callable that accepts the old column names and produces the new ones: Python Rust [`name namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/name.html) · [`map`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.name.map.html) ``# There is also `.name.to_uppercase`, so this usage of `.map` is moot. result = df.select(pl.all().name.map(str.upper)) print(result)`` [`name namespace`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ExprNameNameSpace.html) · [`map`](https://docs.rs/polars/latest/polars/prelude/struct.ExprNameNameSpace.html#method.map) · [Available on feature lazy](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag lazy") ``// There is also `name().to_uppercase()`, so this usage of `map` is moot. let result = df .clone() .lazy() .select([all() .as_expr() .name() .map(PlanCallback::new(|name: PlSmallStr| { Ok(PlSmallStr::from_string(name.to_ascii_uppercase())) }))]) .collect()?; println!("{result}");`` `shape: (5, 7) ┌────────┬───────────────────┬────────┬──────────┬─────────┬───────────┬──────────┐ │ TICKER ┆ COMPANY_NAME ┆ PRICE ┆ DAY_HIGH ┆ DAY_LOW ┆ YEAR_HIGH ┆ YEAR_LOW │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │ ╞════════╪═══════════════════╪════════╪══════════╪═════════╪═══════════╪══════════╡ │ AAPL ┆ Apple ┆ 229.9 ┆ 231.31 ┆ 228.6 ┆ 237.23 ┆ 164.08 │ │ NVDA ┆ NVIDIA ┆ 138.93 ┆ 139.6 ┆ 136.3 ┆ 140.76 ┆ 39.23 │ │ MSFT ┆ Microsoft ┆ 420.56 ┆ 424.04 ┆ 417.52 ┆ 468.35 ┆ 324.39 │ │ GOOG ┆ Alphabet (Google) ┆ 166.41 ┆ 167.62 ┆ 164.78 ┆ 193.31 ┆ 121.46 │ │ AMZN ┆ Amazon ┆ 188.4 ┆ 189.83 ┆ 188.44 ┆ 201.2 ┆ 118.35 │ └────────┴───────────────────┴────────┴──────────┴─────────┴───────────┴──────────┘` See the API reference for the full contents of the namespace `name`. Programmatically generating expressions --------------------------------------- Expression expansion is a very useful feature but it does not solve all of your problems. For example, if we want to compute the day and year amplitude of the prices of the stocks in our dataframe, expression expansion won't help us. At first, you may think about using a `for` loop: Python Rust `result = df for tp in ["day", "year"]: result = result.with_columns( (pl.col(f"{tp}_high") - pl.col(f"{tp}_low")).alias(f"{tp}_amplitude") ) print(result)` `let mut result = df.clone().lazy(); for tp in ["day", "year"] { let high = format!("{tp}_high"); let low = format!("{tp}_low"); let aliased = format!("{tp}_amplitude"); result = result.with_column((col(high) - col(low)).alias(aliased)) } let result = result.collect()?; println!("{result}");` `shape: (5, 9) ┌────────┬──────────────┬────────┬──────────┬───┬───────────┬──────────┬─────────────┬─────────────┐ │ ticker ┆ company_name ┆ price ┆ day_high ┆ … ┆ year_high ┆ year_low ┆ day_amplitu ┆ year_amplit │ │ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ de ┆ ude │ │ str ┆ str ┆ f64 ┆ f64 ┆ ┆ f64 ┆ f64 ┆ --- ┆ --- │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 │ ╞════════╪══════════════╪════════╪══════════╪═══╪═══════════╪══════════╪═════════════╪═════════════╡ │ AAPL ┆ Apple ┆ 229.9 ┆ 231.31 ┆ … ┆ 237.23 ┆ 164.08 ┆ 2.71 ┆ 73.15 │ │ NVDA ┆ NVIDIA ┆ 138.93 ┆ 139.6 ┆ … ┆ 140.76 ┆ 39.23 ┆ 3.3 ┆ 101.53 │ │ MSFT ┆ Microsoft ┆ 420.56 ┆ 424.04 ┆ … ┆ 468.35 ┆ 324.39 ┆ 6.52 ┆ 143.96 │ │ GOOG ┆ Alphabet ┆ 166.41 ┆ 167.62 ┆ … ┆ 193.31 ┆ 121.46 ┆ 2.84 ┆ 71.85 │ │ ┆ (Google) ┆ ┆ ┆ ┆ ┆ ┆ ┆ │ │ AMZN ┆ Amazon ┆ 188.4 ┆ 189.83 ┆ … ┆ 201.2 ┆ 118.35 ┆ 1.39 ┆ 82.85 │ └────────┴──────────────┴────────┴──────────┴───┴───────────┴──────────┴─────────────┴─────────────┘` Do not do this. Instead, generate all of the expressions you want to compute programmatically and use them only once in a context. Loosely speaking, you want to swap the `for` loop with the context `with_columns`. In practice, you could do something like the following: Python Rust `def amplitude_expressions(time_periods): for tp in time_periods: yield (pl.col(f"{tp}_high") - pl.col(f"{tp}_low")).alias(f"{tp}_amplitude") result = df.with_columns(amplitude_expressions(["day", "year"])) print(result)` `let mut exprs: Vec = vec![]; for tp in ["day", "year"] { let high = format!("{tp}_high"); let low = format!("{tp}_low"); let aliased = format!("{tp}_amplitude"); exprs.push((col(high) - col(low)).alias(aliased)) } let result = df.lazy().with_columns(exprs).collect()?; println!("{result}");` `shape: (5, 9) ┌────────┬──────────────┬────────┬──────────┬───┬───────────┬──────────┬─────────────┬─────────────┐ │ ticker ┆ company_name ┆ price ┆ day_high ┆ … ┆ year_high ┆ year_low ┆ day_amplitu ┆ year_amplit │ │ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ de ┆ ude │ │ str ┆ str ┆ f64 ┆ f64 ┆ ┆ f64 ┆ f64 ┆ --- ┆ --- │ │ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 │ ╞════════╪══════════════╪════════╪══════════╪═══╪═══════════╪══════════╪═════════════╪═════════════╡ │ AAPL ┆ Apple ┆ 229.9 ┆ 231.31 ┆ … ┆ 237.23 ┆ 164.08 ┆ 2.71 ┆ 73.15 │ │ NVDA ┆ NVIDIA ┆ 138.93 ┆ 139.6 ┆ … ┆ 140.76 ┆ 39.23 ┆ 3.3 ┆ 101.53 │ │ MSFT ┆ Microsoft ┆ 420.56 ┆ 424.04 ┆ … ┆ 468.35 ┆ 324.39 ┆ 6.52 ┆ 143.96 │ │ GOOG ┆ Alphabet ┆ 166.41 ┆ 167.62 ┆ … ┆ 193.31 ┆ 121.46 ┆ 2.84 ┆ 71.85 │ │ ┆ (Google) ┆ ┆ ┆ ┆ ┆ ┆ ┆ │ │ AMZN ┆ Amazon ┆ 188.4 ┆ 189.83 ┆ … ┆ 201.2 ┆ 118.35 ┆ 1.39 ┆ 82.85 │ └────────┴──────────────┴────────┴──────────┴───┴───────────┴──────────┴─────────────┴─────────────┘` This produces the same final result and by specifying all of the expressions in one go we give Polars the opportunity to: 1. do a better job at optimising the query; and 2. parallelise the execution of the actual computations. More flexible column selections ------------------------------- Polars comes with the submodule `selectors` that provides a number of functions that allow you to write more flexible column selections for expression expansion. Warning This functionality is not available in Rust yet. Refer to [Polars issue #10594](https://github.com/pola-rs/polars/issues/10594) . As a first example, here is how we can use the functions `string` and `ends_with`, and the set operations that the functions from `selectors` support, to select all string columns and the columns whose names end with `"_high"`: Python Rust [`selectors`](https://docs.pola.rs/api/python/stable/reference/selectors.html) `import polars.selectors as cs result = df.select(cs.string() | cs.ends_with("_high")) print(result)` `// Selectors are not available in Rust yet. // Refer to https://github.com/pola-rs/polars/issues/10594` `shape: (5, 4) ┌────────┬───────────────────┬──────────┬───────────┐ │ ticker ┆ company_name ┆ day_high ┆ year_high │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 ┆ f64 │ ╞════════╪═══════════════════╪══════════╪═══════════╡ │ AAPL ┆ Apple ┆ 231.31 ┆ 237.23 │ │ NVDA ┆ NVIDIA ┆ 139.6 ┆ 140.76 │ │ MSFT ┆ Microsoft ┆ 424.04 ┆ 468.35 │ │ GOOG ┆ Alphabet (Google) ┆ 167.62 ┆ 193.31 │ │ AMZN ┆ Amazon ┆ 189.83 ┆ 201.2 │ └────────┴───────────────────┴──────────┴───────────┘` The submodule `selectors` provides [a number of selectors that match based on the data type of the columns](https://docs.pola.rs/user-guide/expressions/expression-expansion/#selectors-for-data-types) , of which the most useful are the functions that match a whole category of types, like `cs.numeric` for all numeric data types or `cs.temporal` for all temporal data types. The submodule `selectors` also provides [a number of selectors that match based on patterns in the column names](https://docs.pola.rs/user-guide/expressions/expression-expansion/#selectors-for-column-name-patterns) which make it more convenient to specify common patterns you may want to check for, like the function `cs.ends_with` that was shown above. ### Combining selectors with set operations We can combine multiple selectors using set operations and the usual Python operators: | Operator | Operation | | --- | --- | | `A \| B` | Union | | `A & B` | Intersection | | `A - B` | Difference | | `A ^ B` | Symmetric difference | | `~A` | Complement | The next example matches all non-string columns that contain an underscore in the name: Python Rust [`selectors`](https://docs.pola.rs/api/python/stable/reference/selectors.html) `result = df.select(cs.contains("_") - cs.string()) print(result)` `// Selectors are not available in Rust yet. // Refer to https://github.com/pola-rs/polars/issues/10594` `shape: (5, 4) ┌──────────┬─────────┬───────────┬──────────┐ │ day_high ┆ day_low ┆ year_high ┆ year_low │ │ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 ┆ f64 │ ╞══════════╪═════════╪═══════════╪══════════╡ │ 231.31 ┆ 228.6 ┆ 237.23 ┆ 164.08 │ │ 139.6 ┆ 136.3 ┆ 140.76 ┆ 39.23 │ │ 424.04 ┆ 417.52 ┆ 468.35 ┆ 324.39 │ │ 167.62 ┆ 164.78 ┆ 193.31 ┆ 121.46 │ │ 189.83 ┆ 188.44 ┆ 201.2 ┆ 118.35 │ └──────────┴─────────┴───────────┴──────────┘` ### Resolving operator ambiguity Expression functions can be chained on top of selectors: Python Rust [`selectors`](https://docs.pola.rs/api/python/stable/reference/selectors.html) `result = df.select((cs.contains("_") - cs.string()) / eur_usd_rate) print(result)` `// Selectors are not available in Rust yet. // Refer to https://github.com/pola-rs/polars/issues/10594` `shape: (5, 4) ┌────────────┬────────────┬────────────┬────────────┐ │ day_high ┆ day_low ┆ year_high ┆ year_low │ │ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 ┆ f64 │ ╞════════════╪════════════╪════════════╪════════════╡ │ 212.211009 ┆ 209.724771 ┆ 217.642202 ┆ 150.53211 │ │ 128.073394 ┆ 125.045872 ┆ 129.137615 ┆ 35.990826 │ │ 389.027523 ┆ 383.045872 ┆ 429.678899 ┆ 297.605505 │ │ 153.779817 ┆ 151.174312 ┆ 177.348624 ┆ 111.431193 │ │ 174.155963 ┆ 172.880734 ┆ 184.587156 ┆ 108.577982 │ └────────────┴────────────┴────────────┴────────────┘` However, some operators have been overloaded to operate both on Polars selectors and on expressions. For example, the operator `~` on a selector represents [the set operation “complement”](https://docs.pola.rs/user-guide/expressions/expression-expansion/#combining-selectors-with-set-operations) and on an expression represents the Boolean operation of negation. When you use a selector and then want to use, in the context of an expression, one of the [operators that act as set operators for selectors](https://docs.pola.rs/user-guide/expressions/expression-expansion/#combining-selectors-with-set-operations) , you can use the function `as_expr`. Below, we want to negate the Boolean values in the columns “has\_partner”, “has\_kids”, and “has\_tattoos”. If we are not careful, the combination of the operator `~` and the selector `cs.starts_with("has_")` will actually select the columns that we do not care about: Python Rust `people = pl.DataFrame( { "name": ["Anna", "Bob"], "has_partner": [True, False], "has_kids": [False, False], "has_tattoos": [True, False], "is_alive": [True, True], } ) wrong_result = people.select((~cs.starts_with("has_")).name.prefix("not_")) print(wrong_result)` `// Selectors are not available in Rust yet. // Refer to https://github.com/pola-rs/polars/issues/10594` `shape: (2, 2) ┌──────────┬──────────────┐ │ not_name ┆ not_is_alive │ │ --- ┆ --- │ │ str ┆ bool │ ╞══════════╪══════════════╡ │ Anna ┆ true │ │ Bob ┆ true │ └──────────┴──────────────┘` The correct solution uses `as_expr`: Python Rust `result = people.select((~cs.starts_with("has_").as_expr()).name.prefix("not_")) print(result)` `// Selectors are not available in Rust yet. // Refer to https://github.com/pola-rs/polars/issues/10594` `shape: (2, 3) ┌─────────────────┬──────────────┬─────────────────┐ │ not_has_partner ┆ not_has_kids ┆ not_has_tattoos │ │ --- ┆ --- ┆ --- │ │ bool ┆ bool ┆ bool │ ╞═════════════════╪══════════════╪═════════════════╡ │ false ┆ true ┆ false │ │ true ┆ true ┆ true │ └─────────────────┴──────────────┴─────────────────┘` ### Debugging selectors When you are not sure whether you have a Polars selector at hand or not, you can use the function `cs.is_selector` to check: Python Rust [`is_selector`](https://docs.pola.rs/api/python/stable/reference/selectors.html#polars.selectors.is_selector) `print(cs.is_selector(~cs.starts_with("has_").as_expr()))` `// Selectors are not available in Rust yet. // Refer to https://github.com/pola-rs/polars/issues/10594` `False` This should help you avoid any ambiguous situations where you think you are operating with expressions but are in fact operating with selectors. Another helpful debugging utility is the function `expand_selector`. Given a target frame or schema, you can check what columns a given selector will expand to: Python Rust [`expand_selector`](https://docs.pola.rs/api/python/stable/reference/selectors.html#polars.selectors.expand_selector) `print( cs.expand_selector( people, cs.starts_with("has_"), ) )` `// Selectors are not available in Rust yet. // Refer to https://github.com/pola-rs/polars/issues/10594` `('has_partner', 'has_kids', 'has_tattoos')` ### Complete reference The tables below group the functions available in the submodule `selectors` by their type of behaviour. #### Selectors for data types Selectors that match based on the data type of the column: | Selector function | Data type(s) matched | | --- | --- | | `binary` | `Binary` | | `boolean` | `Boolean` | | `by_dtype` | Data types specified as arguments | | `categorical` | `Categorical` | | `date` | `Date` | | `datetime` | `Datetime`, optionally filtering by time unit/zone | | `decimal` | `Decimal` | | `duration` | `Duration`, optionally filtering by time unit | | `float` | All float types, regardless of precision | | `integer` | All integer types, signed and unsigned, regardless of precision | | `numeric` | All numeric types, namely integers, floats, and `Decimal` | | `signed_integer` | All signed integer types, regardless of precision | | `string` | `String` | | `temporal` | All temporal data types, namely `Date`, `Datetime`, and `Duration` | | `time` | `Time` | | `unsigned_integer` | All unsigned integer types, regardless of precision | #### Selectors for column name patterns Selectors that match based on column name patterns: | Selector function | Columns selected | | --- | --- | | `alpha` | Columns with alphabetical names | | `alphanumeric` | Columns with alphanumeric names (letters and the digits 0-9) | | `by_name` | Columns with the names specified as arguments | | `contains` | Columns whose names contain the substring specified | | `digit` | Columns with numeric names (only the digits 0-9) | | `ends_with` | Columns whose names end with the given substring | | `matches` | Columns whose names match the given regex pattern | | `starts_with` | Columns whose names start with the given substring | #### Positional selectors Selectors that match based on the position of the columns: | Selector function | Columns selected | | --- | --- | | `all` | All columns | | `by_index` | The columns at the specified indices | | `first` | The first column in the context | | `last` | The last column in the context | #### Miscellaneous functions The submodule `selectors` also provides the following functions: | Function | Behaviour | | --- | --- | | `as_expr`\* | Convert a selector to an expression | | `exclude` | Selects all columns except those matching the given names, data types, or selectors | | `expand_selector` | Expand selector to matching columns with respect to a specific frame or target schema | | `is_selector` | Check whether the given object/expression is a selector | \*`as_expr` isn't a function defined on the submodule `selectors`, but rather a method defined on selectors. --- # Joins - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/transformations/joins/#joins) Joins ===== A join operation combines columns from one or more dataframes into a new dataframe. The different “joining strategies” and matching criteria used by the different types of joins influence how columns are combined and also what rows are included in the result of the join operation. The most common type of join is an “equi join”, in which rows are matched by a key expression. Polars supports several joining strategies for equi joins, which determine exactly how we handle the matching of rows. Polars also supports “non-equi joins”, a type of join where the matching criterion is not an equality, and a type of join where rows are matched by key proximity, called “asof join”. Quick reference table --------------------- The table below acts as a quick reference for people who know what they are looking for. If you want to learn about joins in general and how to work with them in Polars, feel free to skip the table and keep reading below. Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) [`join_where`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join_where.html) [`join_asof`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join_asof.html) [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) ( [semi\_anti\_join](https://docs.pola.rs/user-guide/installation/#feature-flags "Enable the feature flag semi_anti_join for semi and for anti joins") needed for some options.) [`join_asof_by`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsofJoinBy.html#method.join_asof_by) [Available on feature asof\_join](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag asof_join") [`join_where`](https://docs.rs/polars/latest/polars/prelude/struct.JoinBuilder.html#method.join_where) [Available on feature iejoin](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag iejoin") | Type | Function | Brief description | | --- | --- | --- | | Equi inner join | `join(..., how="inner")` | Keeps rows that matched both on the left and right. | | Equi left outer join | `join(..., how="left")` | Keeps all rows from the left plus matching rows from the right. Non-matching rows from the left have their right columns filled with `null`. | | Equi right outer join | `join(..., how="right")` | Keeps all rows from the right plus matching rows from the left. Non-matching rows from the right have their left columns filled with `null`. | | Equi full join | `join(..., how="full")` | Keeps all rows from either dataframe, regardless of whether they match or not. Non-matching rows from one side have the columns from the other side filled with `null`. | | Equi semi join | `join(..., how="semi")` | Keeps rows from the left that have a match on the right. | | Equi anti join | `join(..., how="anti")` | Keeps rows from the left that do not have a match on the right. | | Non-equi inner join | `join_where` | Finds all possible pairings of rows from the left and right that satisfy the given predicate(s). | | Asof join | `join_asof`/`join_asof_by` | Like a left outer join, but matches on the nearest key instead of on exact key matches. | | Cartesian product | `join(..., how="cross")` | Computes the [Cartesian product](https://en.wikipedia.org/wiki/Cartesian_product)
of the two dataframes. | Equi joins ---------- In an equi join, rows are matched by checking equality of a key expression. You can do an equi join with the function `join` by specifying the name of the column to be used as key. For the examples, we will be loading some (modified) Monopoly property data. First, we load a dataframe that contains property names and their colour group in the game: Python Rust `import polars as pl props_groups = pl.read_csv("docs/assets/data/monopoly_props_groups.csv").head(5) print(props_groups)` `let props_groups = CsvReadOptions::default() .with_has_header(true) .try_into_reader_with_file_path(Some("docs/assets/data/monopoly_props_groups.csv".into()))? .finish()? .head(Some(5)); println!("{props_groups}");` `shape: (5, 2) ┌──────────────────────┬────────────┐ │ property_name ┆ group │ │ --- ┆ --- │ │ str ┆ str │ ╞══════════════════════╪════════════╡ │ Old Ken Road ┆ brown │ │ Whitechapel Road ┆ brown │ │ The Shire ┆ fantasy │ │ Kings Cross Station ┆ stations │ │ The Angel, Islington ┆ light_blue │ └──────────────────────┴────────────┘` Next, we load a dataframe that contains property names and their price in the game: Python Rust `props_prices = pl.read_csv("docs/assets/data/monopoly_props_prices.csv").head(5) print(props_prices)` `let props_prices = CsvReadOptions::default() .with_has_header(true) .try_into_reader_with_file_path(Some("docs/assets/data/monopoly_props_prices.csv".into()))? .finish()? .head(Some(5)); println!("{props_prices}");` `shape: (5, 2) ┌──────────────────────┬──────┐ │ property_name ┆ cost │ │ --- ┆ --- │ │ str ┆ i64 │ ╞══════════════════════╪══════╡ │ Old Ken Road ┆ 60 │ │ Whitechapel Road ┆ 60 │ │ Sesame Street ┆ 100 │ │ Kings Cross Station ┆ 200 │ │ The Angel, Islington ┆ 100 │ └──────────────────────┴──────┘` Now, we join both dataframes to create a dataframe that contains property names, colour groups, and prices: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `result = props_groups.join(props_prices, on="property_name") print(result)` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) `// In Rust, we cannot use the shorthand of specifying a common // column name just once. let result = props_groups .clone() .lazy() .join( props_prices.clone().lazy(), [col("property_name")], [col("property_name")], JoinArgs::default(), ) .collect()?; println!("{result}");` `shape: (4, 3) ┌──────────────────────┬────────────┬──────┐ │ property_name ┆ group ┆ cost │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞══════════════════════╪════════════╪══════╡ │ Old Ken Road ┆ brown ┆ 60 │ │ Whitechapel Road ┆ brown ┆ 60 │ │ Kings Cross Station ┆ stations ┆ 200 │ │ The Angel, Islington ┆ light_blue ┆ 100 │ └──────────────────────┴────────────┴──────┘` The result has four rows but both dataframes used in the operation had five rows. Polars uses a joining strategy to determine what happens with rows that have multiple matches or with rows that have no match at all. By default, Polars computes an “inner join” but there are [other join strategies that we show next](https://docs.pola.rs/user-guide/transformations/joins/#join-strategies) . In the example above, the two dataframes conveniently had the column we wish to use as key with the same name and with the values in the exact same format. Suppose, for the sake of argument, that one of the dataframes had a differently named column and the other had the property names in lower case: Python Rust [`str namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/string.html) `props_groups2 = props_groups.with_columns( pl.col("property_name").str.to_lowercase(), ) print(props_groups2)` [`str namespace`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.StringNameSpaceImpl.html) · [Available on feature strings](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag strings") `let props_groups2 = props_groups .clone() .lazy() .with_column(col("property_name").str().to_lowercase()) .collect()?; println!("{props_groups2}");` `shape: (5, 2) ┌──────────────────────┬────────────┐ │ property_name ┆ group │ │ --- ┆ --- │ │ str ┆ str │ ╞══════════════════════╪════════════╡ │ old ken road ┆ brown │ │ whitechapel road ┆ brown │ │ the shire ┆ fantasy │ │ kings cross station ┆ stations │ │ the angel, islington ┆ light_blue │ └──────────────────────┴────────────┘` Python Rust `props_prices2 = props_prices.select( pl.col("property_name").alias("name"), pl.col("cost") ) print(props_prices2)` `let props_prices2 = props_prices .clone() .lazy() .select([col("property_name").alias("name"), col("cost")]) .collect()?; println!("{props_prices2}");` `shape: (5, 2) ┌──────────────────────┬──────┐ │ name ┆ cost │ │ --- ┆ --- │ │ str ┆ i64 │ ╞══════════════════════╪══════╡ │ Old Ken Road ┆ 60 │ │ Whitechapel Road ┆ 60 │ │ Sesame Street ┆ 100 │ │ Kings Cross Station ┆ 200 │ │ The Angel, Islington ┆ 100 │ └──────────────────────┴──────┘` In a situation like this, where we may want to perform the same join as before, we can leverage `join`'s flexibility and specify arbitrary expressions to compute the joining key on the left and on the right, allowing one to compute row keys dynamically: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) · [`str namespace`](https://docs.pola.rs/api/python/stable/reference/expressions/string.html) `result = props_groups2.join( props_prices2, left_on="property_name", right_on=pl.col("name").str.to_lowercase(), ) print(result)` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) · [`str namespace`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.StringNameSpaceImpl.html) · [Available on feature strings](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag strings") `let result = props_groups2 .lazy() .join( props_prices2.lazy(), [col("property_name")], [col("name").str().to_lowercase()], JoinArgs::default(), ) .collect()?; println!("{result}");` `shape: (4, 4) ┌──────────────────────┬────────────┬──────────────────────┬──────┐ │ property_name ┆ group ┆ name ┆ cost │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ i64 │ ╞══════════════════════╪════════════╪══════════════════════╪══════╡ │ old ken road ┆ brown ┆ Old Ken Road ┆ 60 │ │ whitechapel road ┆ brown ┆ Whitechapel Road ┆ 60 │ │ kings cross station ┆ stations ┆ Kings Cross Station ┆ 200 │ │ the angel, islington ┆ light_blue ┆ The Angel, Islington ┆ 100 │ └──────────────────────┴────────────┴──────────────────────┴──────┘` Because we are joining on the right with an expression, Polars preserves the column “property\_name” from the left and the column “name” from the right so we can have access to the original values that the key expressions were applied to. Join strategies --------------- When computing a join with `df1.join(df2, ...)`, we can specify one of many different join strategies. A join strategy specifies what rows to keep from each dataframe based on whether they match rows from the other dataframe. ### Inner join In an inner join the resulting dataframe only contains the rows from the left and right dataframes that matched. That is the default strategy used by `join` and above we can see an example of that. We repeat the example here and explicitly specify the join strategy: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `result = props_groups.join(props_prices, on="property_name", how="inner") print(result)` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) `let result = props_groups .clone() .lazy() .join( props_prices.clone().lazy(), [col("property_name")], [col("property_name")], JoinArgs::new(JoinType::Inner), ) .collect()?; println!("{result}");` `shape: (4, 3) ┌──────────────────────┬────────────┬──────┐ │ property_name ┆ group ┆ cost │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞══════════════════════╪════════════╪══════╡ │ Old Ken Road ┆ brown ┆ 60 │ │ Whitechapel Road ┆ brown ┆ 60 │ │ Kings Cross Station ┆ stations ┆ 200 │ │ The Angel, Islington ┆ light_blue ┆ 100 │ └──────────────────────┴────────────┴──────┘` The result does not include the row from `props_groups` that contains “The Shire” and the result also does not include the row from `props_prices` that contains “Sesame Street”. ### Left join A left outer join is a join where the result contains all the rows from the left dataframe and the rows of the right dataframe that matched any rows from the left dataframe. Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `result = props_groups.join(props_prices, on="property_name", how="left") print(result)` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) `let result = props_groups .clone() .lazy() .join( props_prices.clone().lazy(), [col("property_name")], [col("property_name")], JoinArgs::new(JoinType::Left), ) .collect()?; println!("{result}");` `shape: (5, 3) ┌──────────────────────┬────────────┬──────┐ │ property_name ┆ group ┆ cost │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞══════════════════════╪════════════╪══════╡ │ Old Ken Road ┆ brown ┆ 60 │ │ Whitechapel Road ┆ brown ┆ 60 │ │ The Shire ┆ fantasy ┆ null │ │ Kings Cross Station ┆ stations ┆ 200 │ │ The Angel, Islington ┆ light_blue ┆ 100 │ └──────────────────────┴────────────┴──────┘` If there are any rows from the left dataframe that have no matching rows on the right dataframe, they get the value `null` on the new columns. ### Right join Computationally speaking, a right outer join is exactly the same as a left outer join, but with the arguments swapped. Here is an example: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `result = props_groups.join(props_prices, on="property_name", how="right") print(result)` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) `let result = props_groups .clone() .lazy() .join( props_prices.clone().lazy(), [col("property_name")], [col("property_name")], JoinArgs::new(JoinType::Right), ) .collect()?; println!("{result}");` `shape: (5, 3) ┌────────────┬──────────────────────┬──────┐ │ group ┆ property_name ┆ cost │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞════════════╪══════════════════════╪══════╡ │ brown ┆ Old Ken Road ┆ 60 │ │ brown ┆ Whitechapel Road ┆ 60 │ │ null ┆ Sesame Street ┆ 100 │ │ stations ┆ Kings Cross Station ┆ 200 │ │ light_blue ┆ The Angel, Islington ┆ 100 │ └────────────┴──────────────────────┴──────┘` We show that `df1.join(df2, how="right", ...)` is the same as `df2.join(df1, how="left", ...)`, up to the order of the columns of the result, with the computation below: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `print( result.equals( props_prices.join( props_groups, on="property_name", how="left", # Reorder the columns to match the order from above. ).select(pl.col("group"), pl.col("property_name"), pl.col("cost")) ) )` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) ``// `equals_missing` is needed instead of `equals` // so that missing values compare as equal. let dfs_match = result.equals_missing( &props_prices .clone() .lazy() .join( props_groups.clone().lazy(), [col("property_name")], [col("property_name")], JoinArgs::new(JoinType::Left), ) .select([ // Reorder the columns to match the order of `result`. col("group"), col("property_name"), col("cost"), ]) .collect()?, ); println!("{dfs_match}");`` `True` ### Full join A full outer join will keep all of the rows from the left and right dataframes, even if they don't have matching rows in the other dataframe: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `result = props_groups.join(props_prices, on="property_name", how="full") print(result)` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) `let result = props_groups .clone() .lazy() .join( props_prices.clone().lazy(), [col("property_name")], [col("property_name")], JoinArgs::new(JoinType::Full), ) .collect()?; println!("{result}");` `shape: (6, 4) ┌──────────────────────┬────────────┬──────────────────────┬──────┐ │ property_name ┆ group ┆ property_name_right ┆ cost │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ i64 │ ╞══════════════════════╪════════════╪══════════════════════╪══════╡ │ Old Ken Road ┆ brown ┆ Old Ken Road ┆ 60 │ │ Whitechapel Road ┆ brown ┆ Whitechapel Road ┆ 60 │ │ null ┆ null ┆ Sesame Street ┆ 100 │ │ Kings Cross Station ┆ stations ┆ Kings Cross Station ┆ 200 │ │ The Angel, Islington ┆ light_blue ┆ The Angel, Islington ┆ 100 │ │ The Shire ┆ fantasy ┆ null ┆ null │ └──────────────────────┴────────────┴──────────────────────┴──────┘` In this case, we see that we get two columns `property_name` and `property_name_right` to make up for the fact that we are matching on the column `property_name` of both dataframes and there are some names for which there are no matches. The two columns help differentiate the source of each row data. If we wanted to force `join` to coalesce the two columns `property_name` into a single column, we could set `coalesce=True` explicitly: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `result = props_groups.join( props_prices, on="property_name", how="full", coalesce=True, ) print(result)` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) `let result = props_groups .clone() .lazy() .join( props_prices.clone().lazy(), [col("property_name")], [col("property_name")], JoinArgs::new(JoinType::Full).with_coalesce(JoinCoalesce::CoalesceColumns), ) .collect()?; println!("{result}");` `shape: (6, 3) ┌──────────────────────┬────────────┬──────┐ │ property_name ┆ group ┆ cost │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞══════════════════════╪════════════╪══════╡ │ Old Ken Road ┆ brown ┆ 60 │ │ Whitechapel Road ┆ brown ┆ 60 │ │ Sesame Street ┆ null ┆ 100 │ │ Kings Cross Station ┆ stations ┆ 200 │ │ The Angel, Islington ┆ light_blue ┆ 100 │ │ The Shire ┆ fantasy ┆ null │ └──────────────────────┴────────────┴──────┘` When not set, the parameter `coalesce` is determined automatically from the join strategy and the key(s) specified, which is why the inner, left, and right, joins acted as if `coalesce=True`, even though we didn't set it. ### Semi join A semi join will return the rows of the left dataframe that have a match in the right dataframe, but we do not actually join the matching rows: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `result = props_groups.join(props_prices, on="property_name", how="semi") print(result)` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) · [Available on feature semi\_anti\_join](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag semi_anti_join") `let result = props_groups .clone() .lazy() .join( props_prices.clone().lazy(), [col("property_name")], [col("property_name")], JoinArgs::new(JoinType::Semi), ) .collect()?; println!("{result}");` `shape: (4, 2) ┌──────────────────────┬────────────┐ │ property_name ┆ group │ │ --- ┆ --- │ │ str ┆ str │ ╞══════════════════════╪════════════╡ │ Old Ken Road ┆ brown │ │ Whitechapel Road ┆ brown │ │ Kings Cross Station ┆ stations │ │ The Angel, Islington ┆ light_blue │ └──────────────────────┴────────────┘` A semi join acts as a sort of row filter based on a second dataframe. ### Anti join Conversely, an anti join will return the rows of the left dataframe that do not have a match in the right dataframe: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `result = props_groups.join(props_prices, on="property_name", how="anti") print(result)` [`join`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html#method.join) · [Available on feature semi\_anti\_join](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag semi_anti_join") `let result = props_groups .lazy() .join( props_prices.clone().lazy(), [col("property_name")], [col("property_name")], JoinArgs::new(JoinType::Anti), ) .collect()?; println!("{result}");` `shape: (1, 2) ┌───────────────┬─────────┐ │ property_name ┆ group │ │ --- ┆ --- │ │ str ┆ str │ ╞═══════════════╪═════════╡ │ The Shire ┆ fantasy │ └───────────────┴─────────┘` Non-equi joins -------------- In a non-equi join matches between the left and right dataframes are computed differently. Instead of looking for matches on key expressions, we provide a single predicate that determines what rows of the left dataframe can be paired up with what rows of the right dataframe. For example, consider the following Monopoly players and their current cash: Python Rust `players = pl.DataFrame( { "name": ["Alice", "Bob"], "cash": [78, 135], } ) print(players)` `let players = df!( "name" => ["Alice", "Bob"], "cash" => [78, 135], )?; println!("{players}");` `shape: (2, 2) ┌───────┬──────┐ │ name ┆ cash │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═══════╪══════╡ │ Alice ┆ 78 │ │ Bob ┆ 135 │ └───────┴──────┘` Using a non-equi join we can easily build a dataframe with all the possible properties that each player could be interested in buying. We use the function `join_where` to compute a non-equi join: Python Rust [`join_where`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join_where.html) `result = players.join_where(props_prices, pl.col("cash") > pl.col("cost")) print(result)` [`join_where`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JoinBuilder.html#method.join_where) · [Available on feature iejoin](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag iejoin") `let result = players .clone() .lazy() .join_builder() .with(props_prices.lazy()) .join_where(vec![col("cash").cast(DataType::Int64).gt(col("cost"))]) .collect()?; println!("{result}");` `shape: (6, 4) ┌───────┬──────┬──────────────────────┬──────┐ │ name ┆ cash ┆ property_name ┆ cost │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str ┆ i64 │ ╞═══════╪══════╪══════════════════════╪══════╡ │ Bob ┆ 135 ┆ Sesame Street ┆ 100 │ │ Bob ┆ 135 ┆ The Angel, Islington ┆ 100 │ │ Bob ┆ 135 ┆ Old Ken Road ┆ 60 │ │ Bob ┆ 135 ┆ Whitechapel Road ┆ 60 │ │ Alice ┆ 78 ┆ Old Ken Road ┆ 60 │ │ Alice ┆ 78 ┆ Whitechapel Road ┆ 60 │ └───────┴──────┴──────────────────────┴──────┘` You can provide multiple expressions as predicates, in that case they will be AND combined. You can also combine expressions in a single expression if you need other combinations like OR or XOR. Asof join --------- An `asof` join is like a left join except that we match on nearest key rather than equal keys. In Polars we can do an asof join with the `join_asof` method. For the asof join we will consider a scenario inspired by the stock market. Suppose a stock market broker has a dataframe called `df_trades` showing transactions it has made for different stocks. Python Rust `from datetime import datetime df_trades = pl.DataFrame( { "time": [ datetime(2020, 1, 1, 9, 1, 0), datetime(2020, 1, 1, 9, 1, 0), datetime(2020, 1, 1, 9, 3, 0), datetime(2020, 1, 1, 9, 6, 0), ], "stock": ["A", "B", "B", "C"], "trade": [101, 299, 301, 500], } ) print(df_trades)` `use chrono::prelude::*; let df_trades = df!( "time" => [ NaiveDate::from_ymd_opt(2020, 1, 1).unwrap().and_hms_opt(9, 1, 0).unwrap(), NaiveDate::from_ymd_opt(2020, 1, 1).unwrap().and_hms_opt(9, 1, 0).unwrap(), NaiveDate::from_ymd_opt(2020, 1, 1).unwrap().and_hms_opt(9, 3, 0).unwrap(), NaiveDate::from_ymd_opt(2020, 1, 1).unwrap().and_hms_opt(9, 6, 0).unwrap(), ], "stock" => ["A", "B", "B", "C"], "trade" => [101, 299, 301, 500], )?; println!("{df_trades}");` `shape: (4, 3) ┌─────────────────────┬───────┬───────┐ │ time ┆ stock ┆ trade │ │ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ str ┆ i64 │ ╞═════════════════════╪═══════╪═══════╡ │ 2020-01-01 09:01:00 ┆ A ┆ 101 │ │ 2020-01-01 09:01:00 ┆ B ┆ 299 │ │ 2020-01-01 09:03:00 ┆ B ┆ 301 │ │ 2020-01-01 09:06:00 ┆ C ┆ 500 │ └─────────────────────┴───────┴───────┘` The broker has another dataframe called `df_quotes` showing prices it has quoted for these stocks: Python Rust `df_quotes = pl.DataFrame( { "time": [ datetime(2020, 1, 1, 9, 0, 0), datetime(2020, 1, 1, 9, 2, 0), datetime(2020, 1, 1, 9, 4, 0), datetime(2020, 1, 1, 9, 6, 0), ], "stock": ["A", "B", "C", "A"], "quote": [100, 300, 501, 102], } ) print(df_quotes)` `let df_quotes = df!( "time" => [ NaiveDate::from_ymd_opt(2020, 1, 1).unwrap().and_hms_opt(9, 1, 0).unwrap(), NaiveDate::from_ymd_opt(2020, 1, 1).unwrap().and_hms_opt(9, 2, 0).unwrap(), NaiveDate::from_ymd_opt(2020, 1, 1).unwrap().and_hms_opt(9, 4, 0).unwrap(), NaiveDate::from_ymd_opt(2020, 1, 1).unwrap().and_hms_opt(9, 6, 0).unwrap(), ], "stock" => ["A", "B", "C", "A"], "quote" => [100, 300, 501, 102], )?; println!("{df_quotes}");` `shape: (4, 3) ┌─────────────────────┬───────┬───────┐ │ time ┆ stock ┆ quote │ │ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ str ┆ i64 │ ╞═════════════════════╪═══════╪═══════╡ │ 2020-01-01 09:00:00 ┆ A ┆ 100 │ │ 2020-01-01 09:02:00 ┆ B ┆ 300 │ │ 2020-01-01 09:04:00 ┆ C ┆ 501 │ │ 2020-01-01 09:06:00 ┆ A ┆ 102 │ └─────────────────────┴───────┴───────┘` You want to produce a dataframe showing for each trade the most recent quote provided _on or before_ the time of the trade. You do this with `join_asof` (using the default `strategy = "backward"`). To avoid joining between trades on one stock with a quote on another you must specify an exact preliminary join on the stock column with `by="stock"`. Python Rust [`join_asof`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join_asof.html) `df_asof_join = df_trades.join_asof(df_quotes, on="time", by="stock") print(df_asof_join)` [`join_asof_by`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsofJoinBy.html#method.join_asof_by) · [Available on feature asof\_join](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag asof_join") `let result = df_trades.join_asof_by( &df_quotes, "time", "time", ["stock"], ["stock"], AsofStrategy::Backward, None, true, true, )?; println!("{result}");` `shape: (4, 4) ┌─────────────────────┬───────┬───────┬───────┐ │ time ┆ stock ┆ trade ┆ quote │ │ --- ┆ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ str ┆ i64 ┆ i64 │ ╞═════════════════════╪═══════╪═══════╪═══════╡ │ 2020-01-01 09:01:00 ┆ A ┆ 101 ┆ 100 │ │ 2020-01-01 09:01:00 ┆ B ┆ 299 ┆ null │ │ 2020-01-01 09:03:00 ┆ B ┆ 301 ┆ 300 │ │ 2020-01-01 09:06:00 ┆ C ┆ 500 ┆ 501 │ └─────────────────────┴───────┴───────┴───────┘` If you want to make sure that only quotes within a certain time range are joined to the trades you can specify the `tolerance` argument. In this case we want to make sure that the last preceding quote is within 1 minute of the trade so we set `tolerance = "1m"`. Python Rust [`join_asof`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join_asof.html) `df_asof_tolerance_join = df_trades.join_asof( df_quotes, on="time", by="stock", tolerance="1m" ) print(df_asof_tolerance_join)` [`join_asof_by`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsofJoinBy.html#method.join_asof_by) · [Available on feature asof\_join](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag asof_join") `let result = df_trades.join_asof_by( &df_quotes, "time", "time", ["stock"], ["stock"], AsofStrategy::Backward, Some(AnyValue::Duration(60000, TimeUnit::Milliseconds)), true, true, )?; println!("{result}");` `shape: (4, 4) ┌─────────────────────┬───────┬───────┬───────┐ │ time ┆ stock ┆ trade ┆ quote │ │ --- ┆ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ str ┆ i64 ┆ i64 │ ╞═════════════════════╪═══════╪═══════╪═══════╡ │ 2020-01-01 09:01:00 ┆ A ┆ 101 ┆ 100 │ │ 2020-01-01 09:01:00 ┆ B ┆ 299 ┆ null │ │ 2020-01-01 09:03:00 ┆ B ┆ 301 ┆ 300 │ │ 2020-01-01 09:06:00 ┆ C ┆ 500 ┆ null │ └─────────────────────┴───────┴───────┴───────┘` Cartesian product ----------------- Polars allows you to compute the [Cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) of two dataframes, producing a dataframe where all rows of the left dataframe are paired up with all the rows of the right dataframe. To compute the Cartesian product of two dataframes, you can pass the strategy `how="cross"` to the function `join` without specifying any of `on`, `left_on`, and `right_on`: Python Rust [`join`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.join.html) `tokens = pl.DataFrame({"monopoly_token": ["hat", "shoe", "boat"]}) result = players.select(pl.col("name")).join(tokens, how="cross") print(result)` [`cross_join`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html#method.cross_join) · [Available on feature cross\_join](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag cross_join") `let tokens = df!( "monopoly_token" => ["hat", "shoe", "boat"], )?; let result = players .lazy() .select([col("name")]) .cross_join(tokens.lazy(), None) .collect()?; println!("{result}");` `shape: (6, 2) ┌───────┬────────────────┐ │ name ┆ monopoly_token │ │ --- ┆ --- │ │ str ┆ str │ ╞═══════╪════════════════╡ │ Alice ┆ hat │ │ Alice ┆ shoe │ │ Alice ┆ boat │ │ Bob ┆ hat │ │ Bob ┆ shoe │ │ Bob ┆ boat │ └───────┴────────────────┘` --- # Window functions - Polars user guide [Skip to content](https://docs.pola.rs/user-guide/expressions/window-functions/#window-functions) Window functions ================ Window functions are expressions with superpowers. They allow you to perform aggregations on groups within the context `select`. Let's get a feel for what that means. First, we load a Pokémon dataset: Python Rust [`read_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html) `import polars as pl types = ( "Grass Water Fire Normal Ground Electric Psychic Fighting Bug Steel " "Flying Dragon Dark Ghost Poison Rock Ice Fairy".split() ) type_enum = pl.Enum(types) # then let's load some csv data with information about pokemon pokemon = pl.read_csv( "https://gist.githubusercontent.com/ritchie46/cac6b337ea52281aa23c049250a4ff03/raw/89a957ff3919d90e6ef2d34235e6bf22304f3366/pokemon.csv", ).cast({"Type 1": type_enum, "Type 2": type_enum}) print(pokemon.head())` [`CsvReader`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReader.html) · [Available on feature csv](https://docs.pola.rs/user-guide/installation/#feature-flags "To use this functionality enable the feature flag csv") `use polars::prelude::*; use reqwest::blocking::Client; let data: Vec = Client::new() .get("https://gist.githubusercontent.com/ritchie46/cac6b337ea52281aa23c049250a4ff03/raw/89a957ff3919d90e6ef2d34235e6bf22304f3366/pokemon.csv") .send()? .text()? .bytes() .collect(); let file = std::io::Cursor::new(data); let df = CsvReadOptions::default() .with_has_header(true) .into_reader_with_file_handle(file) .finish()?; println!("{}", df.head(Some(5)));` `shape: (5, 13) ┌─────┬───────────────────────┬────────┬────────┬───┬─────────┬───────┬────────────┬───────────┐ │ # ┆ Name ┆ Type 1 ┆ Type 2 ┆ … ┆ Sp. Def ┆ Speed ┆ Generation ┆ Legendary │ │ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ enum ┆ enum ┆ ┆ i64 ┆ i64 ┆ i64 ┆ bool │ ╞═════╪═══════════════════════╪════════╪════════╪═══╪═════════╪═══════╪════════════╪═══════════╡ │ 1 ┆ Bulbasaur ┆ Grass ┆ Poison ┆ … ┆ 65 ┆ 45 ┆ 1 ┆ false │ │ 2 ┆ Ivysaur ┆ Grass ┆ Poison ┆ … ┆ 80 ┆ 60 ┆ 1 ┆ false │ │ 3 ┆ Venusaur ┆ Grass ┆ Poison ┆ … ┆ 100 ┆ 80 ┆ 1 ┆ false │ │ 3 ┆ VenusaurMega Venusaur ┆ Grass ┆ Poison ┆ … ┆ 120 ┆ 80 ┆ 1 ┆ false │ │ 4 ┆ Charmander ┆ Fire ┆ null ┆ … ┆ 50 ┆ 65 ┆ 1 ┆ false │ └─────┴───────────────────────┴────────┴────────┴───┴─────────┴───────┴────────────┴───────────┘` Operations per group -------------------- Window functions are ideal when we want to perform an operation within a group. For instance, suppose we want to rank our Pokémon by the column “Speed”. However, instead of a global ranking, we want to rank the speed within each group defined by the column “Type 1”. We write the expression to rank the data by the column “Speed” and then we add the function `over` to specify that this should happen over the unique values of the column “Type 1”: Python Rust [`over`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.over.html) `result = pokemon.select( pl.col("Name", "Type 1"), pl.col("Speed").rank("dense", descending=True).over("Type 1").alias("Speed rank"), ) print(result)` [`over`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.over) `let result = df .clone() .lazy() .select([ col("Name"), col("Type 1"), col("Speed") .rank( RankOptions { method: RankMethod::Dense, descending: true, }, None, ) .over(["Type 1"]) .alias("Speed rank"), ]) .collect()?; println!("{result}");` `shape: (163, 3) ┌───────────────────────┬─────────┬────────────┐ │ Name ┆ Type 1 ┆ Speed rank │ │ --- ┆ --- ┆ --- │ │ str ┆ enum ┆ u32 │ ╞═══════════════════════╪═════════╪════════════╡ │ Bulbasaur ┆ Grass ┆ 6 │ │ Ivysaur ┆ Grass ┆ 3 │ │ Venusaur ┆ Grass ┆ 1 │ │ VenusaurMega Venusaur ┆ Grass ┆ 1 │ │ Charmander ┆ Fire ┆ 7 │ │ … ┆ … ┆ … │ │ Moltres ┆ Fire ┆ 5 │ │ Dratini ┆ Dragon ┆ 3 │ │ Dragonair ┆ Dragon ┆ 2 │ │ Dragonite ┆ Dragon ┆ 1 │ │ Mewtwo ┆ Psychic ┆ 2 │ └───────────────────────┴─────────┴────────────┘` To help visualise this operation, you may imagine that Polars selects the subsets of the data that share the same value for the column “Type 1” and then computes the ranking expression only for those values. Then, the results for that specific group are projected back to the original rows and Polars does this for all of the existing groups. The diagram below highlights the ranking computation for the Pokémon with “Type 1” equal to “Grass”. Bulbasaur Ivysaur Venusaur VenusaurMega Venusaur Charmander ... Oddish Gloom ... Grass Grass Grass Grass Fire ... Grass Grass ... 45 60 80 80 65 ... 30 40 ... 6 3 1 1 7 ... 8 7 ... Name Type 1 Speed Speed rank Golbat Poison 90 1 Note how the row for the Pokémon “Golbat” has a “Speed” value of `90`, which is greater than the value `80` of the Pokémon “Venusaur”, and yet the latter was ranked 1 because “Golbat” and “Venusar” do not share the same value for the column “Type 1”. The function `over` accepts an arbitrary number of expressions to specify the groups over which to perform the computations. We can repeat the ranking above, but over the combination of the columns “Type 1” and “Type 2” for a more fine-grained ranking: Python Rust [`over`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.over.html) `result = pokemon.select( pl.col("Name", "Type 1", "Type 2"), pl.col("Speed") .rank("dense", descending=True) .over("Type 1", "Type 2") .alias("Speed rank"), ) print(result)` [`over`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.over) `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (163, 4) ┌───────────────────────┬─────────┬────────┬────────────┐ │ Name ┆ Type 1 ┆ Type 2 ┆ Speed rank │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ enum ┆ enum ┆ u32 │ ╞═══════════════════════╪═════════╪════════╪════════════╡ │ Bulbasaur ┆ Grass ┆ Poison ┆ 6 │ │ Ivysaur ┆ Grass ┆ Poison ┆ 3 │ │ Venusaur ┆ Grass ┆ Poison ┆ 1 │ │ VenusaurMega Venusaur ┆ Grass ┆ Poison ┆ 1 │ │ Charmander ┆ Fire ┆ null ┆ 7 │ │ … ┆ … ┆ … ┆ … │ │ Moltres ┆ Fire ┆ Flying ┆ 2 │ │ Dratini ┆ Dragon ┆ null ┆ 2 │ │ Dragonair ┆ Dragon ┆ null ┆ 1 │ │ Dragonite ┆ Dragon ┆ Flying ┆ 1 │ │ Mewtwo ┆ Psychic ┆ null ┆ 2 │ └───────────────────────┴─────────┴────────┴────────────┘` In general, the results you get with the function `over` can also be achieved with [an aggregation](https://docs.pola.rs/user-guide/expressions/aggregation/) followed by a call to the function `explode`, although the rows would be in a different order: Python Rust [`explode`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.explode.html) `result = ( pokemon.group_by("Type 1") .agg( pl.col("Name"), pl.col("Speed").rank("dense", descending=True).alias("Speed rank"), ) .select(pl.col("Name"), pl.col("Type 1"), pl.col("Speed rank")) .explode("Name", "Speed rank") ) print(result)` [`explode`](https://docs.rs/polars/latest/polars/frame/struct.DataFrame.html#method.explode) `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (163, 3) ┌──────────┬──────────┬────────────┐ │ Name ┆ Type 1 ┆ Speed rank │ │ --- ┆ --- ┆ --- │ │ str ┆ enum ┆ u32 │ ╞══════════╪══════════╪════════════╡ │ Mankey ┆ Fighting ┆ 4 │ │ Primeape ┆ Fighting ┆ 1 │ │ Machop ┆ Fighting ┆ 7 │ │ Machoke ┆ Fighting ┆ 6 │ │ Machamp ┆ Fighting ┆ 5 │ │ … ┆ … ┆ … │ │ Golbat ┆ Poison ┆ 1 │ │ Grimer ┆ Poison ┆ 12 │ │ Muk ┆ Poison ┆ 9 │ │ Koffing ┆ Poison ┆ 11 │ │ Weezing ┆ Poison ┆ 6 │ └──────────┴──────────┴────────────┘` This shows that, usually, `group_by` and `over` produce results of different shapes: * `group_by` usually produces a resulting dataframe with as many rows as groups used for aggregating; and * `over` usually produces a dataframe with the same number of rows as the original. The function `over` does not always produce results with the same number of rows as the original dataframe, and that is what we explore next. Mapping results to dataframe rows --------------------------------- The function `over` accepts a parameter `mapping_strategy` that determines how the results of the expression over the group are mapped back to the rows of the dataframe. ### `group_to_rows` The default behaviour is `"group_to_rows"`: the result of the expression over the group should be the same length as the group and the results are mapped back to the rows of that group. If the order of the rows is not relevant, the option `"explode"` is more performant. Instead of mapping the resulting values to the original rows, Polars creates a new dataframe where values from the same group are next to each other. To help understand the distinction, consider the following dataframe: `shape: (6, 3) ┌─────────┬─────────┬──────┐ │ athlete ┆ country ┆ rank │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞═════════╪═════════╪══════╡ │ A ┆ PT ┆ 6 │ │ B ┆ NL ┆ 1 │ │ C ┆ NL ┆ 5 │ │ D ┆ PT ┆ 4 │ │ E ┆ PT ┆ 2 │ │ F ┆ NL ┆ 3 │ └─────────┴─────────┴──────┘` We can sort the athletes by rank within their own countries. If we do so, the Dutch athletes were in the second, third, and sixth, rows, and they will remain there. What will change is the order of the names of the athletes, which goes from “B”, “C”, and “F”, to “B”, “F”, and “C”: Python Rust [`over`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.over.html) `result = athletes.select( pl.col("athlete", "rank").sort_by(pl.col("rank")).over(pl.col("country")), pl.col("country"), ) print(result)` [`over`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.over) `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (6, 3) ┌─────────┬──────┬─────────┐ │ athlete ┆ rank ┆ country │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str │ ╞═════════╪══════╪═════════╡ │ E ┆ 2 ┆ PT │ │ B ┆ 1 ┆ NL │ │ F ┆ 3 ┆ NL │ │ D ┆ 4 ┆ PT │ │ A ┆ 6 ┆ PT │ │ C ┆ 5 ┆ NL │ └─────────┴──────┴─────────┘` The diagram below represents this transformation: A B C D E F PT NL NL PT PT NL 6 1 5 4 2 3 E B F D A C PT NL NL PT PT NL 2 1 3 4 6 5 NL NL ### `explode` If we set the parameter `mapping_strategy` to `"explode"`, then athletes of the same country are grouped together, but the final order of the rows – with respect to the countries – will not be the same, as the diagram shows: A B C D E F PT NL NL PT PT NL 6 1 5 4 2 3 E B F D A C PT NL NL PT PT NL 2 1 3 4 6 5 NL NL NL Because Polars does not need to keep track of the positions of the rows of each group, using `"explode"` is typically faster than `"group_to_rows"`. However, using `"explode"` also requires more care because it implies reordering the other columns that we wish to keep. The code that produces this result follows Python Rust [`over`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.over.html) `result = athletes.select( pl.all() .sort_by(pl.col("rank")) .over(pl.col("country"), mapping_strategy="explode"), ) print(result)` [`over`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.over) `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (6, 3) ┌─────────┬─────────┬──────┐ │ athlete ┆ country ┆ rank │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞═════════╪═════════╪══════╡ │ E ┆ PT ┆ 2 │ │ D ┆ PT ┆ 4 │ │ A ┆ PT ┆ 6 │ │ B ┆ NL ┆ 1 │ │ F ┆ NL ┆ 3 │ │ C ┆ NL ┆ 5 │ └─────────┴─────────┴──────┘` ### `join` Another possible value for the parameter `mapping_strategy` is `"join"`, which aggregates the resulting values in a list and repeats the list over all rows of the same group: Python Rust [`over`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.over.html) `result = athletes.with_columns( pl.col("rank").sort().over(pl.col("country"), mapping_strategy="join"), ) print(result)` [`over`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.over) `// Contribute the Rust translation of the Python example by opening a PR.` `shape: (6, 3) ┌─────────┬─────────┬───────────┐ │ athlete ┆ country ┆ rank │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ list[i64] │ ╞═════════╪═════════╪═══════════╡ │ A ┆ PT ┆ [2, 4, 6] │ │ B ┆ NL ┆ [1, 3, 5] │ │ C ┆ NL ┆ [1, 3, 5] │ │ D ┆ PT ┆ [2, 4, 6] │ │ E ┆ PT ┆ [2, 4, 6] │ │ F ┆ NL ┆ [1, 3, 5] │ └─────────┴─────────┴───────────┘` Windowed aggregation expressions -------------------------------- In case the expression applied to the values of a group produces a scalar value, the scalar is broadcast across the rows of the group: Python Rust [`over`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.over.html) `result = pokemon.select( pl.col("Name", "Type 1", "Speed"), pl.col("Speed").mean().over(pl.col("Type 1")).alias("Mean speed in group"), ) print(result)` [`over`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.over) `let result = df .clone() .lazy() .select([ col("Name"), col("Type 1"), col("Speed"), col("Speed") .mean() .over(["Type 1"]) .alias("Mean speed in group"), ]) .collect()?; println!("{result}");` `shape: (163, 4) ┌───────────────────────┬─────────┬───────┬─────────────────────┐ │ Name ┆ Type 1 ┆ Speed ┆ Mean speed in group │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ enum ┆ i64 ┆ f64 │ ╞═══════════════════════╪═════════╪═══════╪═════════════════════╡ │ Bulbasaur ┆ Grass ┆ 45 ┆ 54.230769 │ │ Ivysaur ┆ Grass ┆ 60 ┆ 54.230769 │ │ Venusaur ┆ Grass ┆ 80 ┆ 54.230769 │ │ VenusaurMega Venusaur ┆ Grass ┆ 80 ┆ 54.230769 │ │ Charmander ┆ Fire ┆ 65 ┆ 86.285714 │ │ … ┆ … ┆ … ┆ … │ │ Moltres ┆ Fire ┆ 90 ┆ 86.285714 │ │ Dratini ┆ Dragon ┆ 50 ┆ 66.666667 │ │ Dragonair ┆ Dragon ┆ 70 ┆ 66.666667 │ │ Dragonite ┆ Dragon ┆ 80 ┆ 66.666667 │ │ Mewtwo ┆ Psychic ┆ 130 ┆ 99.25 │ └───────────────────────┴─────────┴───────┴─────────────────────┘` More examples ------------- For more exercises, below are some window functions for us to compute: * sort all Pokémon by type; * select the first `3` Pokémon per type as `"Type 1"`; * sort the Pokémon within a type by speed in descending order and select the first `3` as `"fastest/group"`; * sort the Pokémon within a type by attack in descending order and select the first `3` as `"strongest/group"`; and * sort the Pokémon within a type by name and select the first `3` as `"sorted_by_alphabet"`. Python Rust [`over`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.over.html) `result = pokemon.sort("Type 1").select( pl.col("Type 1").head(3).over("Type 1", mapping_strategy="explode"), pl.col("Name") .sort_by(pl.col("Speed"), descending=True) .head(3) .over("Type 1", mapping_strategy="explode") .alias("fastest/group"), pl.col("Name") .sort_by(pl.col("Attack"), descending=True) .head(3) .over("Type 1", mapping_strategy="explode") .alias("strongest/group"), pl.col("Name") .sort() .head(3) .over("Type 1", mapping_strategy="explode") .alias("sorted_by_alphabet"), ) print(result)` [`over`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.over) `let result = df .lazy() .select([ col("Type 1") .head(Some(3)) .over_with_options(Some(["Type 1"]), None, WindowMapping::Explode)? .flatten(), col("Name") .sort_by( ["Speed"], SortMultipleOptions::default().with_order_descending(true), ) .head(Some(3)) .over_with_options(Some(["Type 1"]), None, WindowMapping::Explode)? .flatten() .alias("fastest/group"), col("Name") .sort_by( ["Attack"], SortMultipleOptions::default().with_order_descending(true), ) .head(Some(3)) .over_with_options(Some(["Type 1"]), None, WindowMapping::Explode)? .flatten() .alias("strongest/group"), col("Name") .sort(Default::default()) .head(Some(3)) .over_with_options(Some(["Type 1"]), None, WindowMapping::Explode)? .flatten() .alias("sorted_by_alphabet"), ]) .collect()?; println!("{result:?}");` `shape: (43, 4) ┌────────┬───────────────────────┬───────────────────────┬─────────────────────────┐ │ Type 1 ┆ fastest/group ┆ strongest/group ┆ sorted_by_alphabet │ │ --- ┆ --- ┆ --- ┆ --- │ │ enum ┆ str ┆ str ┆ str │ ╞════════╪═══════════════════════╪═══════════════════════╪═════════════════════════╡ │ Grass ┆ Venusaur ┆ Victreebel ┆ Bellsprout │ │ Grass ┆ VenusaurMega Venusaur ┆ VenusaurMega Venusaur ┆ Bulbasaur │ │ Grass ┆ Victreebel ┆ Exeggutor ┆ Exeggcute │ │ Water ┆ Starmie ┆ GyaradosMega Gyarados ┆ Blastoise │ │ Water ┆ Tentacruel ┆ Kingler ┆ BlastoiseMega Blastoise │ │ … ┆ … ┆ … ┆ … │ │ Rock ┆ Kabutops ┆ Kabutops ┆ Geodude │ │ Ice ┆ Jynx ┆ Articuno ┆ Articuno │ │ Ice ┆ Articuno ┆ Jynx ┆ Jynx │ │ Fairy ┆ Clefable ┆ Clefable ┆ Clefable │ │ Fairy ┆ Clefairy ┆ Clefairy ┆ Clefairy │ └────────┴───────────────────────┴───────────────────────┴─────────────────────────┘` --- # Redirecting... Redirecting... --- # Python API reference — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/index.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Python API reference[#](https://docs.pola.rs/api/python/stable/reference/index.html#python-api-reference "Link to this heading") ================================================================================================================================= This page gives a high-level overview of all public Polars objects, functions and methods. All classes and functions exposed in the `polars.*` namespace are public. * [DataFrame](https://docs.pola.rs/api/python/stable/reference/dataframe/index.html) * [LazyFrame](https://docs.pola.rs/api/python/stable/reference/lazyframe/index.html) * [Series](https://docs.pola.rs/api/python/stable/reference/series/index.html) * [Expressions](https://docs.pola.rs/api/python/stable/reference/expressions/index.html) * [Selectors](https://docs.pola.rs/api/python/stable/reference/selectors.html) * [Importing](https://docs.pola.rs/api/python/stable/reference/selectors.html#importing) * [Set operations](https://docs.pola.rs/api/python/stable/reference/selectors.html#set-operations) * [Functions](https://docs.pola.rs/api/python/stable/reference/selectors.html#functions) * [DataType expressions](https://docs.pola.rs/api/python/stable/reference/datatype_expr/index.html) * [Functions](https://docs.pola.rs/api/python/stable/reference/functions.html) * [Conversion](https://docs.pola.rs/api/python/stable/reference/functions.html#conversion) * [Miscellaneous](https://docs.pola.rs/api/python/stable/reference/functions.html#miscellaneous) * [Multiple queries](https://docs.pola.rs/api/python/stable/reference/functions.html#multiple-queries) * [Random](https://docs.pola.rs/api/python/stable/reference/functions.html#random) * [Extension Types](https://docs.pola.rs/api/python/stable/reference/functions.html#extension-types) * [StringCache](https://docs.pola.rs/api/python/stable/reference/functions.html#stringcache) * [Data types](https://docs.pola.rs/api/python/stable/reference/datatypes.html) * [DataType](https://docs.pola.rs/api/python/stable/reference/datatypes.html#datatype) * [Numeric](https://docs.pola.rs/api/python/stable/reference/datatypes.html#numeric) * [Temporal](https://docs.pola.rs/api/python/stable/reference/datatypes.html#temporal) * [Nested](https://docs.pola.rs/api/python/stable/reference/datatypes.html#nested) * [String](https://docs.pola.rs/api/python/stable/reference/datatypes.html#string) * [Other](https://docs.pola.rs/api/python/stable/reference/datatypes.html#other) * [Schema](https://docs.pola.rs/api/python/stable/reference/schema/index.html) * [Input/output](https://docs.pola.rs/api/python/stable/reference/io.html) * [Avro](https://docs.pola.rs/api/python/stable/reference/io.html#avro) * [Clipboard](https://docs.pola.rs/api/python/stable/reference/io.html#clipboard) * [CSV](https://docs.pola.rs/api/python/stable/reference/io.html#csv) * [Database](https://docs.pola.rs/api/python/stable/reference/io.html#database) * [Delta Lake](https://docs.pola.rs/api/python/stable/reference/io.html#delta-lake) * [Excel / ODS](https://docs.pola.rs/api/python/stable/reference/io.html#excel-ods) * [Feather / IPC](https://docs.pola.rs/api/python/stable/reference/io.html#feather-ipc) * [Iceberg](https://docs.pola.rs/api/python/stable/reference/io.html#iceberg) * [JSON](https://docs.pola.rs/api/python/stable/reference/io.html#json) * [Partition](https://docs.pola.rs/api/python/stable/reference/io.html#partition) * [Parquet](https://docs.pola.rs/api/python/stable/reference/io.html#parquet) * [PyArrow Datasets](https://docs.pola.rs/api/python/stable/reference/io.html#pyarrow-datasets) * [Cloud Credentials](https://docs.pola.rs/api/python/stable/reference/io.html#cloud-credentials) * [Scan Cast Options](https://docs.pola.rs/api/python/stable/reference/io.html#scan-cast-options) * [Catalog](https://docs.pola.rs/api/python/stable/reference/catalog/index.html) * [Unity Catalog](https://docs.pola.rs/api/python/stable/reference/catalog/unity.html) * [Config](https://docs.pola.rs/api/python/stable/reference/config.html) * [Config options](https://docs.pola.rs/api/python/stable/reference/config.html#config-options) * [Config load, save, state](https://docs.pola.rs/api/python/stable/reference/config.html#config-load-save-state) * [Use as a context manager](https://docs.pola.rs/api/python/stable/reference/config.html#use-as-a-context-manager) * [Use as a decorator](https://docs.pola.rs/api/python/stable/reference/config.html#use-as-a-decorator) * [Multiple Config instances](https://docs.pola.rs/api/python/stable/reference/config.html#multiple-config-instances) * [Extending the API](https://docs.pola.rs/api/python/stable/reference/api.html) * [Providing new functionality](https://docs.pola.rs/api/python/stable/reference/api.html#providing-new-functionality) * [Available registrations](https://docs.pola.rs/api/python/stable/reference/api.html#available-registrations) * [Examples](https://docs.pola.rs/api/python/stable/reference/api.html#examples) * [Plugins](https://docs.pola.rs/api/python/stable/reference/plugins.html) * [SQL Interface](https://docs.pola.rs/api/python/stable/reference/sql/index.html) * [Python API](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html) * [SQL Clauses](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html) * [SQL Functions](https://docs.pola.rs/api/python/stable/reference/sql/functions/index.html) * [Set Operations](https://docs.pola.rs/api/python/stable/reference/sql/set_operations.html) * [Table Operations](https://docs.pola.rs/api/python/stable/reference/sql/table_operations.html) * [Exceptions](https://docs.pola.rs/api/python/stable/reference/exceptions.html) * [Testing](https://docs.pola.rs/api/python/stable/reference/testing.html) * [Asserts](https://docs.pola.rs/api/python/stable/reference/testing.html#asserts) * [Parametric testing](https://docs.pola.rs/api/python/stable/reference/testing.html#parametric-testing) * [Metadata](https://docs.pola.rs/api/python/stable/reference/metadata.html) --- # polars - Rust [Crate polars](https://docs.pola.rs/api/rust/dev/polars/#) ----------------------------------------------------------- Crate polars Copy item path =========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars/lib.rs.html#1-436) Expand description [§](https://docs.pola.rs/api/rust/dev/polars/#polars-dataframes-in-rust) Polars: _DataFrames in Rust_ ----------------------------------------------------------------------------------------------------- Polars is a DataFrame library for Rust. It is based on [Apache Arrow](https://arrow.apache.org/) ’s memory model. Apache Arrow provides very cache efficient columnar data structures and is becoming the defacto standard for columnar data. ### [§](https://docs.pola.rs/api/rust/dev/polars/#quickstart) Quickstart We recommend building queries directly with [polars-lazy](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html "mod polars_lazy") . This allows you to combine expressions into powerful aggregations and column selections. All expressions are evaluated in parallel and queries are optimized just in time. use polars::prelude::*; let lf1 = LazyFrame::scan_parquet("myfile_1.parquet", Default::default())? .group_by([col("ham")]) .agg([\ // expressions can be combined into powerful aggregations\ col("foo")\ .sort_by([col("ham").rank(Default::default(), None)], SortMultipleOptions::default())\ .last()\ .alias("last_foo_ranked_by_ham"),\ // every expression runs in parallel\ col("foo").cum_min(false).alias("cumulative_min_per_group"),\ // every expression runs in parallel\ col("foo").reverse().implode().alias("reverse_group"),\ ]); let lf2 = LazyFrame::scan_parquet("myfile_2.parquet", Default::default())? .select([col("ham"), col("spam")]); let df = lf1 .join(lf2, [col("reverse")], [col("foo")], JoinArgs::new(JoinType::Left)) // now we finally materialize the result. .collect()?; This means that Polars data structures can be shared zero copy with processes in many different languages. ### [§](https://docs.pola.rs/api/rust/dev/polars/#tree-of-contents) Tree Of Contents * [Cookbooks](https://docs.pola.rs/api/rust/dev/polars/#cookbooks) * [Data structures](https://docs.pola.rs/api/rust/dev/polars/#data-structures) * [DataFrame](https://docs.pola.rs/api/rust/dev/polars/#dataframe) * [Series](https://docs.pola.rs/api/rust/dev/polars/#series) * [ChunkedArray](https://docs.pola.rs/api/rust/dev/polars/#chunkedarray) * [SIMD](https://docs.pola.rs/api/rust/dev/polars/#simd) * [API](https://docs.pola.rs/api/rust/dev/polars/#api) * [Expressions](https://docs.pola.rs/api/rust/dev/polars/#expressions) * [Compile times](https://docs.pola.rs/api/rust/dev/polars/#compile-times) * [Performance](https://docs.pola.rs/api/rust/dev/polars/#performance-and-string-data) * [Custom allocator](https://docs.pola.rs/api/rust/dev/polars/#custom-allocator) * [Config](https://docs.pola.rs/api/rust/dev/polars/#config-with-env-vars) * [User guide](https://docs.pola.rs/api/rust/dev/polars/#user-guide) ### [§](https://docs.pola.rs/api/rust/dev/polars/#cookbooks) Cookbooks See examples in the cookbooks: * [Eager](https://docs.pola.rs/api/rust/dev/polars/docs/eager/index.html "mod polars::docs::eager") * [Lazy](https://docs.pola.rs/api/rust/dev/polars/docs/lazy/index.html "mod polars::docs::lazy") ### [§](https://docs.pola.rs/api/rust/dev/polars/#data-structures) Data Structures The base data structures provided by polars are [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") , [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") , and [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") . We will provide a short, top-down view of these data structures. #### [§](https://docs.pola.rs/api/rust/dev/polars/#dataframe) DataFrame A [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") is a two-dimensional data structure backed by a [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") and can be seen as an abstraction on [`Vec`](https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html "struct alloc::vec::Vec") . Operations that can be executed on a [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") are similar to what is done in a `SQL` like query. You can `GROUP`, `JOIN`, `PIVOT` etc. #### [§](https://docs.pola.rs/api/rust/dev/polars/#series) Series [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") are the type-agnostic columnar data representation of Polars. The [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") struct and [`SeriesTrait`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesTrait.html "trait polars::prelude::SeriesTrait") trait provide many operations out of the box. Most type-agnostic operations are provided by [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . Type-aware operations require downcasting to the typed data structure that is wrapped by the [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . The underlying typed data structure is a [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") . #### [§](https://docs.pola.rs/api/rust/dev/polars/#chunkedarray) ChunkedArray [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") are wrappers around an arrow array, that can contain multiples chunks, e.g. [`Vec`](https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html "struct alloc::vec::Vec") . These are the root data structures of Polars, and implement many operations. Most operations are implemented by traits defined in [chunked\_array::ops](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/index.html "mod polars::chunked_array::ops") , or on the [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") struct. ### [§](https://docs.pola.rs/api/rust/dev/polars/#simd) SIMD Polars / Arrow uses packed\_simd to speed up kernels with SIMD operations. SIMD is an optional `feature = "nightly"`, and requires a nightly compiler. If you don’t need SIMD, **Polars runs on stable!** ### [§](https://docs.pola.rs/api/rust/dev/polars/#api) API Polars supports an eager and a lazy API. The eager API directly yields results, but is overall more verbose and less capable of building elegant composite queries. We recommend to use the Lazy API whenever you can. As neither API is async they should be wrapped in _spawn\_blocking_ when used in an async context to avoid blocking the async thread pool of the runtime. ### [§](https://docs.pola.rs/api/rust/dev/polars/#expressions) Expressions Polars has a powerful concept called expressions. Polars expressions can be used in various contexts and are a functional mapping of `Fn(Series) -> Series`, meaning that they have [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") as input and [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") as output. By looking at this functional definition, we can see that the output of an [`Expr`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html "enum polars::prelude::Expr") also can serve as the input of an [`Expr`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html "enum polars::prelude::Expr") . That may sound a bit strange, so lets give an example. The following is an expression: `col("foo").sort().head(2)` The snippet above says select column `"foo"` then sort this column and then take the first 2 values of the sorted output. The power of expressions is that every expression produces a new expression and that they can be piped together. You can run an expression by passing them on one of polars execution contexts. Here we run two expressions in the **select** context: df.lazy() .select([\ col("foo").sort(Default::default()).head(None),\ col("bar").filter(col("foo").eq(lit(1))).sum(),\ ]) .collect()?; All expressions are run in parallel, meaning that separate polars expressions are embarrassingly parallel. (Note that within an expression there may be more parallelization going on). Understanding Polars expressions is most important when starting with the Polars library. Read more about them in the [user guide](https://docs.pola.rs/user-guide/expressions) . #### [§](https://docs.pola.rs/api/rust/dev/polars/#eager) Eager Read more in the pages of the following data structures /traits. * [DataFrame struct](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") * [Series struct](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") * [Series trait](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesTrait.html "trait polars::prelude::SeriesTrait") * [ChunkedArray struct](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") * [ChunkedArray operations traits](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/index.html "mod polars::chunked_array::ops") #### [§](https://docs.pola.rs/api/rust/dev/polars/#lazy) Lazy Unlock full potential with lazy computation. This allows query optimizations and provides Polars the full query context so that the fastest algorithm can be chosen. **[Read more in the lazy module.](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html "mod polars_lazy") ** ### [§](https://docs.pola.rs/api/rust/dev/polars/#compile-times) Compile times A DataFrame library typically consists of * Tons of features * A lot of datatypes Both of these really put strain on compile times. To keep Polars lean, we make both **opt-in**, meaning that you only pay the compilation cost if you need it. ### [§](https://docs.pola.rs/api/rust/dev/polars/#compile-times-and-opt-in-features) Compile times and opt-in features The opt-in features are (not including dtype features): * `lazy` - Lazy API * `regex` - Use regexes in [column selection](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.col.html "fn polars::prelude::col") * `dot_diagram` - Create dot diagrams from lazy logical plans. * `sql` - Pass SQL queries to Polars. * `random` - Generate arrays with randomly sampled values * `ndarray`\- Convert from [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") to [ndarray](https://docs.rs/ndarray/) * `temporal` - Conversions between [Chrono](https://docs.rs/chrono/) and Polars for temporal data types * `timezones` - Activate timezone support. * `strings` - Extra string utilities for [`StringChunked`](https://docs.pola.rs/api/rust/dev/polars/prelude/type.StringChunked.html "type polars::prelude::StringChunked") * `string_pad` - `zfill`, `ljust`, `rjust` * `string_to_integer` - `parse_int` * `object` - Support for generic ChunkedArrays called [`ObjectChunked`](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ObjectChunked.html "type polars::prelude::ObjectChunked") (generic over `T`). These are downcastable from Series through the [Any](https://doc.rust-lang.org/std/any/index.html) trait. * Performance related: * `nightly` - Several nightly only features such as SIMD and specialization. * `performant` - more fast paths, slower compile times. * `bigidx` - Activate this feature if you expect >> 2^32 rows. This is rarely needed. This allows Polars to scale up beyond 2^32 rows by using an index with a `u64` data type. Polars will be a bit slower with this feature activated as many data structures are less cache efficient. * `cse` - Activate common subplan elimination optimization * IO related: * `serde` - Support for [serde](https://crates.io/crates/serde) serialization and deserialization. Can be used for JSON and more serde supported serialization formats. * `serde-lazy` - Support for [serde](https://crates.io/crates/serde) serialization and deserialization. Can be used for JSON and more serde supported serialization formats. * `parquet` - Read Apache Parquet format * `json` - JSON serialization * `ipc` - Arrow’s IPC format serialization * `decompress` - Automatically infer compression of csvs and decompress them. Supported compressions: * gzip * zlib * zstd * [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") operations: * `dynamic_group_by` - Groupby based on a time window instead of predefined keys. Also activates rolling window group by operations. * `sort_multiple` - Allow sorting a [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") on multiple columns * `rows` - Create [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") from rows and extract rows from [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") s. Also activates `pivot` and `transpose` operations * `asof_join` - Join ASOF, to join on nearest keys instead of exact equality match. * `cross_join` - Create the Cartesian product of two [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") s. * `semi_anti_join` - SEMI and ANTI joins. * `row_hash` - Utility to hash [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") rows to [`UInt64Chunked`](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt64Chunked.html "type polars::prelude::UInt64Chunked") * `diagonal_concat` - Concat diagonally thereby combining different schemas. * `dataframe_arithmetic` - Arithmetic on ([`Dataframe`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") and [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") s) and ([`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") on [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") ) * `partition_by` - Split into multiple [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") s partitioned by groups. * [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") /[`Expr`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html "enum polars::prelude::Expr") operations: * `is_in` - Check for membership in [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . * `zip_with` - [Zip two Series/ ChunkedArrays](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkZip.html "trait polars::prelude::ChunkZip") . * `round_series` - Round underlying float types of [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . * `repeat_by` - Repeat element in an Array N times, where N is given by another array. * `is_first_distinct` - Check if element is first unique value. * `is_last_distinct` - Check if element is last unique value. * `is_between` - Check if this expression is between the given lower and upper bounds. * `checked_arithmetic` - checked arithmetic/ returning [`None`](https://doc.rust-lang.org/nightly/core/option/enum.Option.html#variant.None "variant core::option::Option::None") on invalid operations. * `dot_product` - Dot/inner product on [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") and [`Expr`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html "enum polars::prelude::Expr") . * `concat_str` - Concat string data in linear time. * `reinterpret` - Utility to reinterpret bits to signed/unsigned * `take_opt_iter` - Take from a [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") with [`Iterator>`](https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html "trait core::iter::traits::iterator::Iterator") . * `mode` - [Return the most occurring value(s)](https://docs.pola.rs/api/rust/dev/polars/prelude/mode/index.html "mod polars::prelude::mode") * `cum_agg` - [`cum_sum`](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_sum.html "fn polars::prelude::cum_sum") , [`cum_min`](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_min.html "fn polars::prelude::cum_min") , [`cum_max`](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_max.html "fn polars::prelude::cum_max") aggregation. * `rolling_window` - rolling window functions, like [`rolling_mean`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html#method.rolling_mean "struct polars::prelude::Series") * `interpolate` - [interpolate None values](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.interpolate.html "fn polars::prelude::interpolate") * `extract_jsonpath` - [Run jsonpath queries on StringChunked](https://goessner.net/articles/JsonPath/) * `list` - List utils. * `list_gather` take sublist by multiple indices * `rank` - Ranking algorithms. * `moment` - Kurtosis and skew statistics * `ewma` - Exponential moving average windows * `abs` - Get absolute values of [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . * `arange` - Range operation on [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . * `product` - Compute the product of a [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . * `diff` - [`diff`](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.diff.html "fn polars::prelude::diff") operation. * `pct_change` - Compute change percentages. * `unique_counts` - Count unique values in expressions. * `log` - Logarithms for [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . * `list_to_struct` - Convert [`List`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataType.html#variant.List "variant polars::prelude::DataType::List") to [`Struct`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataType.html#variant.Struct "variant polars::prelude::DataType::Struct") dtypes. * `list_count` - Count elements in lists. * `list_eval` - Apply expressions over list elements. * `list_sets` - Compute UNION, INTERSECTION, and DIFFERENCE on list types. * `cumulative_eval` - Apply expressions over cumulatively increasing windows. * `arg_where` - Get indices where condition holds. * `search_sorted` - Find indices where elements should be inserted to maintain order. * `offset_by` - Add an offset to dates that take months and leap years into account. * `trigonometry` - Trigonometric functions. * `sign` - Compute the element-wise sign of a [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . * `propagate_nans` - NaN propagating min/max aggregations. * `extract_groups` - Extract multiple regex groups from strings. * `cov` - Covariance and correlation functions. * `find_many` - Find/replace multiple string patterns at once. * [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") pretty printing * `fmt` - Activate [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") formatting ### [§](https://docs.pola.rs/api/rust/dev/polars/#compile-times-and-opt-in-data-types) Compile times and opt-in data types As mentioned above, Polars [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") are wrappers around [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") without the generic parameter `T`. To get rid of the generic parameter, all the possible values of `T` are compiled for [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . This gets more expensive the more types you want for a [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . In order to reduce the compile times, we have decided to default to a minimal set of types and make more [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") types opt-in. Note that if you get strange compile time errors, you probably need to opt-in for that [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") dtype. The opt-in dtypes are: | data type | feature flag | | --- | --- | | Date | dtype-date | | Datetime | dtype-datetime | | Time | dtype-time | | Duration | dtype-duration | | Int8 | dtype-i8 | | Int16 | dtype-i16 | | UInt8 | dtype-u8 | | UInt16 | dtype-u16 | | Categorical | dtype-categorical | | Struct | dtype-struct | Or you can choose one of the preconfigured pre-sets. * `dtype-full` - all opt-in dtypes. * `dtype-slim` - slim preset of opt-in dtypes. ### [§](https://docs.pola.rs/api/rust/dev/polars/#performance) Performance To get the best performance out of Polars we recommend compiling on a nightly compiler with the features `simd` and `performant` activated. The activated cpu features also influence the amount of simd acceleration we can use. See the features we activate for our python builds, or if you just run locally and want to use all available features on your cpu, set `RUSTFLAGS='-C target-cpu=native'`. #### [§](https://docs.pola.rs/api/rust/dev/polars/#custom-allocator) Custom allocator An OLAP query engine does a lot of heap allocations. It is recommended to use a custom allocator, (we have found this to have up to ~25% runtime influence). [JeMalloc](https://crates.io/crates/tikv-jemallocator) and [Mimalloc](https://crates.io/crates/mimalloc) for instance, show a significant performance gain in runtime as well as memory usage. ##### [§](https://docs.pola.rs/api/rust/dev/polars/#jemalloc-usage) Jemalloc Usage [ⓘ](https://docs.pola.rs/api/rust/dev/polars/# "This example is not tested") use tikv_jemallocator::Jemalloc; #[global_allocator] static GLOBAL: Jemalloc = Jemalloc; ##### [§](https://docs.pola.rs/api/rust/dev/polars/#cargotoml) Cargo.toml [dependencies] tikv-jemallocator = { version = "*" } ##### [§](https://docs.pola.rs/api/rust/dev/polars/#mimalloc-usage) Mimalloc Usage [ⓘ](https://docs.pola.rs/api/rust/dev/polars/# "This example is not tested") use mimalloc::MiMalloc; #[global_allocator] static GLOBAL: MiMalloc = MiMalloc; ##### [§](https://docs.pola.rs/api/rust/dev/polars/#cargotoml-1) Cargo.toml [dependencies] mimalloc = { version = "*", default-features = false } ##### [§](https://docs.pola.rs/api/rust/dev/polars/#notes) Notes [Benchmarks](https://github.com/pola-rs/polars/pull/3108) have shown that on Linux and macOS JeMalloc outperforms Mimalloc on all tasks and is therefore the default allocator used for the Python bindings on Unix platforms. ### [§](https://docs.pola.rs/api/rust/dev/polars/#config-with-env-vars) Config with ENV vars * `POLARS_FMT_TABLE_FORMATTING` -> define styling of tables using any of the following options (default = UTF8\_FULL\_CONDENSED). These options are defined by comfy-table which provides examples for each at [https://github.com/Nukesor/comfy-table/blob/main/src/style/presets.rs](https://github.com/Nukesor/comfy-table/blob/main/src/style/presets.rs) * `ASCII_FULL` * `ASCII_FULL_CONDENSED` * `ASCII_NO_BORDERS` * `ASCII_BORDERS_ONLY` * `ASCII_BORDERS_ONLY_CONDENSED` * `ASCII_HORIZONTAL_ONLY` * `ASCII_MARKDOWN` * `MARKDOWN` * `UTF8_FULL` * `UTF8_FULL_CONDENSED` * `UTF8_NO_BORDERS` * `UTF8_BORDERS_ONLY` * `UTF8_HORIZONTAL_ONLY` * `NOTHING` * `POLARS_FMT_TABLE_CELL_ALIGNMENT` -> define cell alignment using any of the following options (default = LEFT): * `LEFT` * `CENTER` * `RIGHT` * `POLARS_FMT_TABLE_DATAFRAME_SHAPE_BELOW` -> print shape information below the table. * `POLARS_FMT_TABLE_HIDE_COLUMN_NAMES` -> hide table column names. * `POLARS_FMT_TABLE_HIDE_COLUMN_DATA_TYPES` -> hide data types for columns. * `POLARS_FMT_TABLE_HIDE_COLUMN_SEPARATOR` -> hide separator that separates column names from rows. * `POLARS_FMT_TABLE_HIDE_DATAFRAME_SHAPE_INFORMATION"` -> omit table shape information. * `POLARS_FMT_TABLE_INLINE_COLUMN_DATA_TYPE` -> put column data type on the same line as the column name. * `POLARS_FMT_TABLE_ROUNDED_CORNERS` -> apply rounded corners to UTF8-styled tables. * `POLARS_FMT_MAX_COLS` -> maximum number of columns shown when formatting DataFrames. * `POLARS_FMT_MAX_ROWS` -> maximum number of rows shown when formatting DataFrames, `-1` to show all. * `POLARS_FMT_STR_LEN` -> maximum number of characters printed per string value. * `POLARS_TABLE_WIDTH` -> width of the tables used during DataFrame formatting. * `POLARS_MAX_THREADS` -> maximum number of threads used to initialize thread pool (on startup). * `POLARS_VERBOSE` -> print logging info to stderr. * `POLARS_NO_PARTITION` -> polars may choose to partition the group\_by operation, based on data cardinality. Setting this env var will turn partitioned group\_by’s off. * `POLARS_PARTITION_UNIQUE_COUNT` -> at which (estimated) key count a partitioned group\_by should run. defaults to `1000`, any higher cardinality will run default group\_by. * `POLARS_FORCE_PARTITION` -> force partitioned group\_by if the keys and aggregations allow it. * `POLARS_ALLOW_EXTENSION` -> allows for [`ObjectChunked`](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ObjectChunked.html "type polars::prelude::ObjectChunked") to be used in arrow, opening up possibilities like using `T` in complex lazy expressions. However this does require `unsafe` code allow this. * `POLARS_NO_PARQUET_STATISTICS` -> if set, statistics in parquet files are ignored. * `POLARS_PANIC_ON_ERR` -> panic instead of returning an Error. * `POLARS_BACKTRACE_IN_ERR` -> include a Rust backtrace in Error messages. * `POLARS_NO_CHUNKED_JOIN` -> force rechunk before joins. ### [§](https://docs.pola.rs/api/rust/dev/polars/#user-guide) User guide If you want to read more, check the [user guide](https://docs.pola.rs/) . Re-exports[§](https://docs.pola.rs/api/rust/dev/polars/#reexports) ------------------------------------------------------------------- `pub use [polars_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html "mod polars_io") as io;``polars-io` `pub use [polars_lazy](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html "mod polars_lazy") as lazy;``lazy` `pub use [polars_time](https://docs.pola.rs/api/rust/dev/polars_time/index.html "mod polars_time") as time;``temporal` Modules[§](https://docs.pola.rs/api/rust/dev/polars/#modules) -------------------------------------------------------------- [chunked\_array](https://docs.pola.rs/api/rust/dev/polars/chunked_array/index.html "mod polars::chunked_array") The typed heart of every Series column. [datatypes](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html "mod polars::datatypes") Data types supported by Polars. [docs](https://docs.pola.rs/api/rust/dev/polars/docs/index.html "mod polars::docs") [error](https://docs.pola.rs/api/rust/dev/polars/error/index.html "mod polars::error") [frame](https://docs.pola.rs/api/rust/dev/polars/frame/index.html "mod polars::frame") DataFrame module. [functions](https://docs.pola.rs/api/rust/dev/polars/functions/index.html "mod polars::functions") Functions [prelude](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html "mod polars::prelude") [series](https://docs.pola.rs/api/rust/dev/polars/series/index.html "mod polars::series") Type agnostic columnar data structure. [testing](https://docs.pola.rs/api/rust/dev/polars/testing/index.html "mod polars::testing") Testing utilities. Macros[§](https://docs.pola.rs/api/rust/dev/polars/#macros) ------------------------------------------------------------ [apply\_method\_all\_arrow\_series](https://docs.pola.rs/api/rust/dev/polars/macro.apply_method_all_arrow_series.html "macro polars::apply_method_all_arrow_series") [df](https://docs.pola.rs/api/rust/dev/polars/macro.df.html "macro polars::df") Constants[§](https://docs.pola.rs/api/rust/dev/polars/#constants) ------------------------------------------------------------------ [VERSION](https://docs.pola.rs/api/rust/dev/polars/constant.VERSION.html "constant polars::VERSION") Polars crate version --- # Data types — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/datatypes.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Data types[#](https://docs.pola.rs/api/python/stable/reference/datatypes.html#data-types "Link to this heading") ================================================================================================================= DataType[#](https://docs.pola.rs/api/python/stable/reference/datatypes.html#datatype "Link to this heading") ------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`DataType`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.DataType.html#polars.datatypes.DataType "polars.datatypes.DataType") | Base class for all Polars data types. | Numeric[#](https://docs.pola.rs/api/python/stable/reference/datatypes.html#numeric "Link to this heading") ----------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`Decimal`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Decimal.html#polars.datatypes.Decimal "polars.datatypes.Decimal") | Decimal 128-bit type with an optional precision and non-negative scale. | | [`Float16`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Float16.html#polars.datatypes.Float16 "polars.datatypes.Float16") | 16-bit floating point type. | | [`Float32`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Float32.html#polars.datatypes.Float32 "polars.datatypes.Float32") | 32-bit floating point type. | | [`Float64`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Float64.html#polars.datatypes.Float64 "polars.datatypes.Float64") | 64-bit floating point type. | | [`Int8`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Int8.html#polars.datatypes.Int8 "polars.datatypes.Int8") | 8-bit signed integer type. | | [`Int16`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Int16.html#polars.datatypes.Int16 "polars.datatypes.Int16") | 16-bit signed integer type. | | [`Int32`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Int32.html#polars.datatypes.Int32 "polars.datatypes.Int32") | 32-bit signed integer type. | | [`Int64`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Int64.html#polars.datatypes.Int64 "polars.datatypes.Int64") | 64-bit signed integer type. | | [`Int128`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Int128.html#polars.datatypes.Int128 "polars.datatypes.Int128") | 128-bit signed integer type. | | [`UInt8`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.UInt8.html#polars.datatypes.UInt8 "polars.datatypes.UInt8") | 8-bit unsigned integer type. | | [`UInt16`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.UInt16.html#polars.datatypes.UInt16 "polars.datatypes.UInt16") | 16-bit unsigned integer type. | | [`UInt32`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.UInt32.html#polars.datatypes.UInt32 "polars.datatypes.UInt32") | 32-bit unsigned integer type. | | [`UInt64`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.UInt64.html#polars.datatypes.UInt64 "polars.datatypes.UInt64") | 64-bit unsigned integer type. | Temporal[#](https://docs.pola.rs/api/python/stable/reference/datatypes.html#temporal "Link to this heading") ------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`Date`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Date.html#polars.datatypes.Date "polars.datatypes.Date") | Data type representing a calendar date. | | [`Datetime`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Datetime.html#polars.datatypes.Datetime "polars.datatypes.Datetime") | Data type representing a calendar date and time of day. | | [`Duration`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Duration.html#polars.datatypes.Duration "polars.datatypes.Duration") | Data type representing a time duration. | | [`Time`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Time.html#polars.datatypes.Time "polars.datatypes.Time") | Data type representing the time of day. | Nested[#](https://docs.pola.rs/api/python/stable/reference/datatypes.html#nested "Link to this heading") --------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`Array`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Array.html#polars.datatypes.Array "polars.datatypes.Array")
(inner\[, shape, width\]) | Fixed length list type. | | [`List`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.List.html#polars.datatypes.List "polars.datatypes.List")
(inner) | Variable length list type. | | [`Field`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Field.html#polars.datatypes.Field "polars.datatypes.Field")
(name, dtype) | Definition of a single field within a `Struct` DataType. | | [`Struct`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Struct.html#polars.datatypes.Struct "polars.datatypes.Struct")
(fields) | Struct composite type. | String[#](https://docs.pola.rs/api/python/stable/reference/datatypes.html#string "Link to this heading") --------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`String`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.String.html#polars.datatypes.String "polars.datatypes.String") | UTF-8 encoded string type. | | [`Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html#polars.datatypes.Categorical "polars.datatypes.Categorical") | A categorical encoding of a set of strings. | | [`Categories`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categories.html#polars.datatypes.Categories "polars.datatypes.Categories") | A named collection of categories for [`Categorical`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html#polars.datatypes.Categorical "polars.datatypes.Categorical")
. | | [`Enum`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Enum.html#polars.datatypes.Enum "polars.datatypes.Enum") | A fixed categorical encoding of a unique set of strings. | | [`Utf8`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Utf8.html#polars.datatypes.Utf8 "polars.datatypes.Utf8") | alias of [`String`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.String.html#polars.datatypes.String "polars.datatypes.classes.String") | Other[#](https://docs.pola.rs/api/python/stable/reference/datatypes.html#other "Link to this heading") ------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`BaseExtension`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.BaseExtension.html#polars.datatypes.BaseExtension "polars.datatypes.BaseExtension") | Base class for extension data types. | | [`Binary`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Binary.html#polars.datatypes.Binary "polars.datatypes.Binary") | Binary type. | | [`Boolean`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Boolean.html#polars.datatypes.Boolean "polars.datatypes.Boolean") | Boolean type. | | [`Extension`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Extension.html#polars.datatypes.Extension "polars.datatypes.Extension") | Generic extension data type. | | [`Null`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Null.html#polars.datatypes.Null "polars.datatypes.Null") | Data type representing null values. | | [`Object`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Object.html#polars.datatypes.Object "polars.datatypes.Object") | Data type for wrapping arbitrary Python objects. | | [`Unknown`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Unknown.html#polars.datatypes.Unknown "polars.datatypes.Unknown") | Type representing DataType values that could not be determined statically. | On this page --- # Functions — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/functions.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Functions[#](https://docs.pola.rs/api/python/stable/reference/functions.html#functions "Link to this heading") =============================================================================================================== Conversion[#](https://docs.pola.rs/api/python/stable/reference/functions.html#conversion "Link to this heading") ----------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`from_arrow`](https://docs.pola.rs/api/python/stable/reference/api/polars.from_arrow.html#polars.from_arrow "polars.from_arrow")
(data\[, schema, schema\_overrides, ...\]) | Create a DataFrame or Series from an Arrow Table or Array. | | [`from_dataframe`](https://docs.pola.rs/api/python/stable/reference/api/polars.from_dataframe.html#polars.from_dataframe "polars.from_dataframe")
(df, \*\[, allow\_copy, rechunk\]) | Build a Polars DataFrame from any dataframe supporting the PyCapsule Interface. | | [`from_dict`](https://docs.pola.rs/api/python/stable/reference/api/polars.from_dict.html#polars.from_dict "polars.from_dict")
(data\[, schema, schema\_overrides, ...\]) | Construct a DataFrame from a dictionary of sequences. | | [`from_dicts`](https://docs.pola.rs/api/python/stable/reference/api/polars.from_dicts.html#polars.from_dicts "polars.from_dicts")
(data\[, schema, schema\_overrides, ...\]) | Construct a DataFrame from a sequence of dictionaries. | | [`from_numpy`](https://docs.pola.rs/api/python/stable/reference/api/polars.from_numpy.html#polars.from_numpy "polars.from_numpy")
(data\[, schema, schema\_overrides, ...\]) | Construct a DataFrame from a NumPy ndarray. | | [`from_pandas`](https://docs.pola.rs/api/python/stable/reference/api/polars.from_pandas.html#polars.from_pandas "polars.from_pandas")
(data, \*\[, schema\_overrides, ...\]) | Construct a Polars DataFrame or Series from a pandas DataFrame, Series, or Index. | | [`from_records`](https://docs.pola.rs/api/python/stable/reference/api/polars.from_records.html#polars.from_records "polars.from_records")
(data\[, schema, ...\]) | Construct a DataFrame from a sequence of sequences. | | [`from_repr`](https://docs.pola.rs/api/python/stable/reference/api/polars.from_repr.html#polars.from_repr "polars.from_repr")
(data) | Construct a Polars DataFrame or Series from its string representation. | | [`json_normalize`](https://docs.pola.rs/api/python/stable/reference/api/polars.json_normalize.html#polars.json_normalize "polars.json_normalize")
(data, \*\[, separator, ...\]) | Normalize semi-structured deserialized JSON data into a flat table. | Miscellaneous[#](https://docs.pola.rs/api/python/stable/reference/functions.html#miscellaneous "Link to this heading") ----------------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`align_frames`](https://docs.pola.rs/api/python/stable/reference/api/polars.align_frames.html#polars.align_frames "polars.align_frames")
(\*frames, on\[, how, select, ...\]) | Align a sequence of frames using common values from one or more columns as a key. | | [`concat`](https://docs.pola.rs/api/python/stable/reference/api/polars.concat.html#polars.concat "polars.concat")
(items, \*\[, how, rechunk, parallel, ...\]) | Combine multiple DataFrames, LazyFrames, or Series into a single object. | | [`union`](https://docs.pola.rs/api/python/stable/reference/api/polars.union.html#polars.union "polars.union")
(items, \*\[, how, strict\]) | Combine multiple DataFrames, LazyFrames, or Series into a single object. | | [`defer`](https://docs.pola.rs/api/python/stable/reference/api/polars.defer.html#polars.defer "polars.defer")
(function, \*, schema\[, validate\_schema\]) | Deferred execution. | | [`escape_regex`](https://docs.pola.rs/api/python/stable/reference/api/polars.escape_regex.html#polars.escape_regex "polars.escape_regex")
(s) | Escapes string regex meta characters. | Multiple queries[#](https://docs.pola.rs/api/python/stable/reference/functions.html#multiple-queries "Link to this heading") ----------------------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`collect_all`](https://docs.pola.rs/api/python/stable/reference/api/polars.collect_all.html#polars.collect_all "polars.collect_all")
(lazy\_frames, \*\[, type\_coercion, ...\]) | Collect multiple LazyFrames at the same time. | | [`collect_all_async`](https://docs.pola.rs/api/python/stable/reference/api/polars.collect_all_async.html#polars.collect_all_async "polars.collect_all_async")
(lazy\_frames, \*\[, gevent, ...\]) | Collect multiple LazyFrames at the same time asynchronously in thread pool. | | [`explain_all`](https://docs.pola.rs/api/python/stable/reference/api/polars.explain_all.html#polars.explain_all "polars.explain_all")
(lazy\_frames, \*\[, optimizations\]) | Explain multiple LazyFrames as if passed to `collect_all`. | Random[#](https://docs.pola.rs/api/python/stable/reference/functions.html#random "Link to this heading") --------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`set_random_seed`](https://docs.pola.rs/api/python/stable/reference/api/polars.set_random_seed.html#polars.set_random_seed "polars.set_random_seed")
(seed) | Set the global random seed for Polars. | Extension Types[#](https://docs.pola.rs/api/python/stable/reference/functions.html#extension-types "Link to this heading") --------------------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`register_extension_type`](https://docs.pola.rs/api/python/stable/reference/api/polars.register_extension_type.html#polars.register_extension_type "polars.register_extension_type")
(ext\_name\[, ...\]) | Register the extension type for the given extension name. | | [`unregister_extension_type`](https://docs.pola.rs/api/python/stable/reference/api/polars.unregister_extension_type.html#polars.unregister_extension_type "polars.unregister_extension_type")
(ext\_name) | Unregister the extension type for the given extension name. | | [`get_extension_type`](https://docs.pola.rs/api/python/stable/reference/api/polars.get_extension_type.html#polars.get_extension_type "polars.get_extension_type")
(ext\_name) | Get the extension type class for the given extension name. | StringCache[#](https://docs.pola.rs/api/python/stable/reference/functions.html#stringcache "Link to this heading") ------------------------------------------------------------------------------------------------------------------- Note that the `StringCache` can be used as both a context manager and a decorator, in order to explicitly scope cache lifetime. | | | | --- | --- | | [`StringCache`](https://docs.pola.rs/api/python/stable/reference/api/polars.StringCache.html#polars.StringCache "polars.StringCache")
() | Context manager for enabling and disabling the global string cache. | | [`enable_string_cache`](https://docs.pola.rs/api/python/stable/reference/api/polars.enable_string_cache.html#polars.enable_string_cache "polars.enable_string_cache")
() | Enable the global string cache. | | [`disable_string_cache`](https://docs.pola.rs/api/python/stable/reference/api/polars.disable_string_cache.html#polars.disable_string_cache "polars.disable_string_cache")
() | Disable and clear the global string cache. | | [`using_string_cache`](https://docs.pola.rs/api/python/stable/reference/api/polars.using_string_cache.html#polars.using_string_cache "polars.using_string_cache")
() | Check whether the global string cache is enabled. | On this page --- # Catalog — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/catalog/index.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Catalog[#](https://docs.pola.rs/api/python/stable/reference/catalog/index.html#catalog "Link to this heading") =============================================================================================================== Interface with data catalogs. **Unity Catalog** * [Unity Catalog](https://docs.pola.rs/api/python/stable/reference/catalog/unity.html) * [polars.Catalog](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.html) * [`Catalog`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.html#polars.Catalog) * [polars.Catalog.list\_catalogs](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.list_catalogs.html) * [`Catalog.list_catalogs()`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.list_catalogs.html#polars.Catalog.list_catalogs) * [polars.Catalog.list\_namespaces](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.list_namespaces.html) * [`Catalog.list_namespaces()`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.list_namespaces.html#polars.Catalog.list_namespaces) * [polars.Catalog.list\_tables](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.list_tables.html) * [`Catalog.list_tables()`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.list_tables.html#polars.Catalog.list_tables) * [polars.Catalog.get\_table\_info](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.get_table_info.html) * [`Catalog.get_table_info()`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.get_table_info.html#polars.Catalog.get_table_info) * [polars.Catalog.scan\_table](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.scan_table.html) * [`Catalog.scan_table()`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.Catalog.scan_table.html#polars.Catalog.scan_table) * [polars.catalog.unity.CatalogInfo](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.CatalogInfo.html) * [`CatalogInfo`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.CatalogInfo.html#polars.catalog.unity.CatalogInfo) * [polars.catalog.unity.ColumnInfo](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.ColumnInfo.html) * [`ColumnInfo`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.ColumnInfo.html#polars.catalog.unity.ColumnInfo) * [polars.catalog.unity.DataSourceFormat](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.DataSourceFormat.html) * [`DataSourceFormat`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.DataSourceFormat.html#polars.catalog.unity.DataSourceFormat) * [polars.catalog.unity.NamespaceInfo](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.NamespaceInfo.html) * [`NamespaceInfo`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.NamespaceInfo.html#polars.catalog.unity.NamespaceInfo) * [polars.catalog.unity.TableInfo](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.TableInfo.html) * [`TableInfo`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.TableInfo.html#polars.catalog.unity.TableInfo) * [polars.catalog.unity.TableInfo.get\_polars\_schema](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.TableInfo.get_polars_schema.html) * [`TableInfo.get_polars_schema()`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.TableInfo.get_polars_schema.html#polars.catalog.unity.TableInfo.get_polars_schema) * [polars.catalog.unity.TableType](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.TableType.html) * [`TableType`](https://docs.pola.rs/api/python/stable/reference/catalog/api/polars.catalog.unity.TableType.html#polars.catalog.unity.TableType) --- # Schema — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/schema/index.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Schema[#](https://docs.pola.rs/api/python/stable/reference/schema/index.html#schema "Link to this heading") ============================================================================================================ _class_ polars.Schema( _schema: Mapping\[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ , SchemaInitDataType\] | Iterable\[[tuple](https://docs.python.org/3/library/stdtypes.html#tuple "(in Python v3.14)")\ \[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ , SchemaInitDataType\] | ArrowSchemaExportable\] | ArrowSchemaExportable | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _check\_dtypes: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_, )[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/schema.py#L54-L288) Ordered mapping of column names to their data type. Parameters: **schema** The schema definition given by column names and their associated Polars data type. Accepts a mapping, or an iterable of tuples, or any object implementing the `__arrow_c_schema__` PyCapsule interface (e.g. pyarrow schemas). Examples Define a schema by passing instantiated data types. \>>> schema \= pl.Schema( ... { ... "foo": pl.String(), ... "bar": pl.Duration("us"), ... "baz": pl.Array(pl.Int8, 4), ... } ... ) \>>> schema Schema({'foo': String, 'bar': Duration(time\_unit='us'), 'baz': Array(Int8, shape=(4,))}) Access the data type associated with a specific column name. \>>> schema\["baz"\] Array(Int8, shape=(4,)) Access various schema properties using the `names`, `dtypes`, and `len` methods. \>>> schema.names() \['foo', 'bar', 'baz'\] \>>> schema.dtypes() \[String, Duration(time\_unit='us'), Array(Int8, shape=(4,))\] \>>> schema.len() 3 Import a pyarrow schema. \>>> import pyarrow as pa \>>> pl.Schema(pa.schema(\[pa.field("x", pa.int32())\])) Schema({'x': Int32}) Export a schema to pyarrow. \>>> pa.schema(pl.Schema({"x": pl.Int32})) x: int32 **Methods:** | | | | --- | --- | | `dtypes` | Get the data types of the schema. | | `len` | Get the number of schema entries. | | `names` | Get the column names of the schema. | | `to_arrow` | Convert the schema to a pyarrow schema. | | `to_frame` | Create an empty DataFrame (or LazyFrame) from this Schema. | | `to_python` | Return a dictionary of column names and Python types. | dtypes() → [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[DataType](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.DataType.html#polars.datatypes.DataType "polars.datatypes.DataType")\ \][\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/schema.py#L180-L190) Get the data types of the schema. Examples \>>> s \= pl.Schema({"x": pl.UInt8(), "y": pl.List(pl.UInt8)}) \>>> s.dtypes() \[UInt8, List(UInt8)\] len() → [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") [\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/schema.py#L258-L270) Get the number of schema entries. Examples \>>> s \= pl.Schema({"x": pl.Int32(), "y": pl.List(pl.String)}) \>>> s.len() 2 \>>> len(s) 2 names() → [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ \][\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/schema.py#L168-L178) Get the column names of the schema. Examples \>>> s \= pl.Schema({"x": pl.Float64(), "y": pl.Datetime(time\_zone\="UTC")}) \>>> s.names() \['x', 'y'\] to\_arrow( _\*_, _compat\_level: CompatLevel | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, ) → [Schema](https://arrow.apache.org/docs/python/generated/pyarrow.Schema.html#pyarrow.Schema "(in Apache Arrow v22.0.0)") [\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/schema.py#L192-L223) Convert the schema to a pyarrow schema. Parameters: **compat\_level** Use a specific compatibility level when exporting Polars’ internal data types. Examples \>>> pl.Schema({"x": pl.String}).to\_arrow() x: string\_view to\_frame(_\*_, _eager: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_) → DataFrame | LazyFrame[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/schema.py#L231-L256) Create an empty DataFrame (or LazyFrame) from this Schema. Parameters: **eager** If True, create a DataFrame; otherwise, create a LazyFrame. Examples \>>> s \= pl.Schema({"x": pl.Int32(), "y": pl.String()}) \>>> s.to\_frame() shape: (0, 2) ┌─────┬─────┐ │ x ┆ y │ │ --- ┆ --- │ │ i32 ┆ str │ ╞═════╪═════╡ └─────┴─────┘ \>>> s.to\_frame(eager\=False) to\_python() → [dict](https://docs.python.org/3/library/stdtypes.html#dict "(in Python v3.14)") \[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ , [type](https://docs.python.org/3/library/functions.html#type "(in Python v3.14)")\ \][\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/schema.py#L272-L288) Return a dictionary of column names and Python types. Examples \>>> s \= pl.Schema( ... { ... "x": pl.Int8(), ... "y": pl.String(), ... "z": pl.Duration("us"), ... } ... ) \>>> s.to\_python() {'x': , 'y': , 'z': } --- # DataType expressions — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/datatype_expr/index.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") DataType expressions[#](https://docs.pola.rs/api/python/stable/reference/datatype_expr/index.html#datatype-expressions "Link to this heading") =============================================================================================================================================== Data type expressions allow lazily determining a datatype of a column or expression and using in expressions. This page gives an overview of all public Polars expressions. _class_ polars.DataTypeExpr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/datatype_expr/datatype_expr.py#L30-L304) A lazily instantiated `DataType` that can be used in an `Expr`. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. This expression is made to represent a `DataType` that can be used to reference a datatype in a lazy context. Examples \>>> lf \= pl.LazyFrame({"a": \[1, 2, 3\]}) \>>> lf.with\_columns( ... pl.col.a.map\_batches(lambda x: x \* 2, return\_dtype\=pl.dtype\_of("a")) ... ).collect() shape: (3, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 2 │ │ 4 │ │ 6 │ └─────┘ **Methods:** | | | | --- | --- | | `collect_dtype` | Materialize the `DataTypeExpr` in a specific context. | | `default_value` | Get a default value of a specific type. | | `display` | Get a formatted version of the output DataType. | | `inner_dtype` | Get the inner DataType of a List or Array. | | `matches` | Get whether the output DataType is matches a certain selector. | | `to_signed_integer` | Get the signed integer version of the same bitsize. | | `to_unsigned_integer` | Get the unsigned integer version of the same bitsize. | | `wrap_in_array` | Get the DataType wrapped in an array. | | `wrap_in_list` | Get the DataType wrapped in a list. | collect\_dtype( _context: SchemaDict | Schema | DataFrame | LazyFrame_, ) → [DataType](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.DataType.html#polars.datatypes.DataType "polars.datatypes.DataType") [\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/datatype_expr/datatype_expr.py#L271-L304) Materialize the `DataTypeExpr` in a specific context. This is a useful function when debugging datatype expressions. Examples \>>> lf \= pl.LazyFrame( ... { ... "a": \[1, 2, 3\], ... } ... ) \>>> pl.dtype\_of("a").collect\_dtype(lf) Int64 \>>> pl.dtype\_of("a").collect\_dtype({"a": pl.String}) String default\_value( _n: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, _\*_, _numeric\_to\_one: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _num\_list\_values: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 0_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/datatype_expr/datatype_expr.py#L207-L254) Get a default value of a specific type. * Integers and floats are their zero value as default, unless otherwise specified * Temporals are a physical zero as default * `pl.Decimal` is zero as default * `pl.String` and `pl.Binary` are an empty string * `pl.List` is an empty list, unless otherwise specified * `pl.Array` is the inner default value repeated over the shape * `pl.Struct` is the inner default value for all fields * `pl.Enum` is the first category if it exists * `pl.Null`, `pl.Object` and `pl.Categorical` are `null`. Parameters: **n** Number of types you want the value **numeric\_to\_one** Use `1` instead of `0` as the default value for numeric types **num\_list\_values** The amount of values a list contains Examples \>>> uint32 \= pl.UInt32.to\_dtype\_expr() \>>> pl.select(default\=uint32.default\_value()) shape: (1, 1) ┌─────────┐ │ default │ │ --- │ │ u32 │ ╞═════════╡ │ 0 │ └─────────┘ display() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/datatype_expr/datatype_expr.py#L97-L126) Get a formatted version of the output DataType. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, 3\], ... "b": \["X", "Y", "Z"\], ... "c": \[1.3, 3.7, 4.2\], ... } ... ) \>>> df.select( ... a\=pl.dtype\_of("a").display(), ... b\=pl.dtype\_of("b").display(), ... c\=pl.dtype\_of("c").display(), ... ).transpose(include\_header\=True, column\_names\=\["dtype"\]) shape: (3, 2) ┌────────┬───────┐ │ column ┆ dtype │ │ --- ┆ --- │ │ str ┆ str │ ╞════════╪═══════╡ │ a ┆ i64 │ │ b ┆ str │ │ c ┆ f64 │ └────────┴───────┘ inner\_dtype() → DataTypeExpr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/datatype_expr/datatype_expr.py#L93-L95) Get the inner DataType of a List or Array. matches(_selector: [Selector](https://docs.pola.rs/api/python/stable/reference/selectors.html#polars.selectors.Selector "polars.selectors.Selector") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/datatype_expr/datatype_expr.py#L128-L152) Get whether the output DataType is matches a certain selector. Examples \>>> import polars.selectors as cs \>>> pl.DataFrame( ... { ... "a": \[1, 2, 3\], ... } ... ).select( ... a\_is\_string\=pl.dtype\_of("a").matches(cs.string()), ... a\_is\_integer\=pl.dtype\_of("a").matches(cs.integer()), ... ) shape: (1, 2) ┌─────────────┬──────────────┐ │ a\_is\_string ┆ a\_is\_integer │ │ --- ┆ --- │ │ bool ┆ bool │ ╞═════════════╪══════════════╡ │ false ┆ true │ └─────────────┴──────────────┘ to\_signed\_integer() → DataTypeExpr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/datatype_expr/datatype_expr.py#L193-L205) Get the signed integer version of the same bitsize. Examples \>>> uint32 \= pl.UInt32.to\_dtype\_expr() \>>> uint32.to\_signed\_integer().collect\_dtype({}) Int32 to\_unsigned\_integer() → DataTypeExpr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/datatype_expr/datatype_expr.py#L179-L191) Get the unsigned integer version of the same bitsize. Examples \>>> int32 \= pl.Int32.to\_dtype\_expr() \>>> int32.to\_unsigned\_integer().collect\_dtype({}) UInt32 wrap\_in\_array( _\*_, _width: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, ) → DataTypeExpr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/datatype_expr/datatype_expr.py#L166-L177) Get the DataType wrapped in an array. Examples \>>> pl.Int32.to\_dtype\_expr().wrap\_in\_array(width\=5).collect\_dtype({}) Array(Int32, shape=(5,)) wrap\_in\_list() → DataTypeExpr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/datatype_expr/datatype_expr.py#L154-L164) Get the DataType wrapped in a list. Examples \>>> pl.Int32.to\_dtype\_expr().wrap\_in\_list().collect\_dtype({}) List(Int32) --- # Input/output — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/io.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Input/output[#](https://docs.pola.rs/api/python/stable/reference/io.html#input-output "Link to this heading") ============================================================================================================== Avro[#](https://docs.pola.rs/api/python/stable/reference/io.html#avro "Link to this heading") ---------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_avro`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_avro.html#polars.read_avro "polars.read_avro")
(source, \*\[, columns, n\_rows\]) | Read into a DataFrame from Apache Avro format. | | [`DataFrame.write_avro`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_avro.html#polars.DataFrame.write_avro "polars.DataFrame.write_avro")
(file\[, compression, name\]) | Write to Apache Avro file. | Clipboard[#](https://docs.pola.rs/api/python/stable/reference/io.html#clipboard "Link to this heading") -------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_clipboard`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_clipboard.html#polars.read_clipboard "polars.read_clipboard")
(\[separator\]) | Read text from clipboard and pass to `read_csv`. | | [`DataFrame.write_clipboard`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_clipboard.html#polars.DataFrame.write_clipboard "polars.DataFrame.write_clipboard")
(\*\[, separator\]) | Copy `DataFrame` in csv format to the system clipboard with `write_csv`. | CSV[#](https://docs.pola.rs/api/python/stable/reference/io.html#csv "Link to this heading") -------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv.html#polars.read_csv "polars.read_csv")
(source, \*\[, has\_header, columns, ...\]) | Read a CSV file into a DataFrame. | | [`read_csv_batched`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_csv_batched.html#polars.read_csv_batched "polars.read_csv_batched")
(source, \*\[, has\_header, ...\]) | Read a CSV file in batches. | | [`scan_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_csv.html#polars.scan_csv "polars.scan_csv")
(source, \*\[, has\_header, separator, ...\]) | Lazily read from a CSV file or multiple files via glob patterns. | | [`DataFrame.write_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_csv.html#polars.DataFrame.write_csv "polars.DataFrame.write_csv")
(\[file, include\_bom, ...\]) | Write to comma-separated values (CSV) file. | | [`LazyFrame.sink_csv`](https://docs.pola.rs/api/python/stable/reference/api/polars.LazyFrame.sink_csv.html#polars.LazyFrame.sink_csv "polars.LazyFrame.sink_csv")
(path, \*\[, include\_bom, ...\]) | Evaluate the query in streaming mode and write to a CSV file. | | | | | --- | --- | | [`BatchedCsvReader.next_batches`](https://docs.pola.rs/api/python/stable/reference/api/polars.io.csv.batched_reader.BatchedCsvReader.next_batches.html#polars.io.csv.batched_reader.BatchedCsvReader.next_batches "polars.io.csv.batched_reader.BatchedCsvReader.next_batches")
(n) | Read `n` batches from the reader. | Database[#](https://docs.pola.rs/api/python/stable/reference/io.html#database "Link to this heading") ------------------------------------------------------------------------------------------------------ | | | | --- | --- | | [`read_database`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_database.html#polars.read_database "polars.read_database")
(query, connection, \*\[, ...\]) | Read the results of a SQL query into a DataFrame, given a connection object. | | [`read_database_uri`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_database_uri.html#polars.read_database_uri "polars.read_database_uri")
(query, uri, \*\[, ...\]) | Read the results of a SQL query into a DataFrame, given a URI. | | [`DataFrame.write_database`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_database.html#polars.DataFrame.write_database "polars.DataFrame.write_database")
(table\_name, ...\[, ...\]) | Write the data in a Polars DataFrame to a database. | Delta Lake[#](https://docs.pola.rs/api/python/stable/reference/io.html#delta-lake "Link to this heading") ---------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_delta`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_delta.html#polars.read_delta "polars.read_delta")
(source, \*\[, version, columns, ...\]) | Reads into a DataFrame from a Delta lake table. | | [`scan_delta`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_delta.html#polars.scan_delta "polars.scan_delta")
(source, \*\[, version, ...\]) | Lazily read from a Delta lake table. | | [`DataFrame.write_delta`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_delta.html#polars.DataFrame.write_delta "polars.DataFrame.write_delta")
(target, \*\[, mode, ...\]) | Write DataFrame as delta table. | Excel / ODS[#](https://docs.pola.rs/api/python/stable/reference/io.html#excel-ods "Link to this heading") ---------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_excel`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_excel.html#polars.read_excel "polars.read_excel")
(source, \*\[, sheet\_id, ...\]) | Read Excel spreadsheet data into a DataFrame. | | [`read_ods`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_ods.html#polars.read_ods "polars.read_ods")
(source, \*\[, sheet\_id, sheet\_name, ...\]) | Read OpenOffice (ODS) spreadsheet data into a DataFrame. | | [`DataFrame.write_excel`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_excel.html#polars.DataFrame.write_excel "polars.DataFrame.write_excel")
(\[workbook, worksheet, ...\]) | Write frame data to a table in an Excel workbook/worksheet. | Feather / IPC[#](https://docs.pola.rs/api/python/stable/reference/io.html#feather-ipc "Link to this heading") -------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_ipc`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_ipc.html#polars.read_ipc "polars.read_ipc")
(source, \*\[, columns, n\_rows, ...\]) | Read into a DataFrame from Arrow IPC (Feather v2) file. | | [`read_ipc_schema`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_ipc_schema.html#polars.read_ipc_schema "polars.read_ipc_schema")
(source) | Get the schema of an IPC file without reading data. | | [`read_ipc_stream`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_ipc_stream.html#polars.read_ipc_stream "polars.read_ipc_stream")
(source, \*\[, columns, ...\]) | Read into a DataFrame from Arrow IPC record batch stream. | | [`scan_ipc`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_ipc.html#polars.scan_ipc "polars.scan_ipc")
(source, \*\[, n\_rows, cache, ...\]) | Lazily read from an Arrow IPC (Feather v2) file or multiple files via glob patterns. | | [`DataFrame.write_ipc`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_ipc.html#polars.DataFrame.write_ipc "polars.DataFrame.write_ipc")
(file, \*\[, compression, ...\]) | Write to Arrow IPC binary stream or Feather file. | | [`DataFrame.write_ipc_stream`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_ipc_stream.html#polars.DataFrame.write_ipc_stream "polars.DataFrame.write_ipc_stream")
(file, \*\[, ...\]) | Write to Arrow IPC record batch stream. | | [`LazyFrame.sink_ipc`](https://docs.pola.rs/api/python/stable/reference/api/polars.LazyFrame.sink_ipc.html#polars.LazyFrame.sink_ipc "polars.LazyFrame.sink_ipc")
(path, \*\[, compression, ...\]) | Evaluate the query in streaming mode and write to an IPC file. | Iceberg[#](https://docs.pola.rs/api/python/stable/reference/io.html#iceberg "Link to this heading") ---------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`scan_iceberg`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_iceberg.html#polars.scan_iceberg "polars.scan_iceberg")
(source, \*\[, snapshot\_id, ...\]) | Lazily read from an Apache Iceberg table. | | [`DataFrame.write_iceberg`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_iceberg.html#polars.DataFrame.write_iceberg "polars.DataFrame.write_iceberg")
(target, mode) | Write DataFrame to an Iceberg table. | JSON[#](https://docs.pola.rs/api/python/stable/reference/io.html#json "Link to this heading") ---------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_json`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_json.html#polars.read_json "polars.read_json")
(source, \*\[, schema, ...\]) | Read into a DataFrame from a JSON file. | | [`read_ndjson`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_ndjson.html#polars.read_ndjson "polars.read_ndjson")
(source, \*\[, schema, ...\]) | Read into a DataFrame from a newline delimited JSON file. | | [`scan_ndjson`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_ndjson.html#polars.scan_ndjson "polars.scan_ndjson")
(source, \*\[, schema, ...\]) | Lazily read from a newline delimited JSON file or multiple files via glob patterns. | | [`DataFrame.write_json`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_json.html#polars.DataFrame.write_json "polars.DataFrame.write_json")
(\[file\]) | Serialize to JSON representation. | | [`DataFrame.write_ndjson`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_ndjson.html#polars.DataFrame.write_ndjson "polars.DataFrame.write_ndjson")
(\[file\]) | Serialize to newline delimited JSON representation. | | [`LazyFrame.sink_ndjson`](https://docs.pola.rs/api/python/stable/reference/api/polars.LazyFrame.sink_ndjson.html#polars.LazyFrame.sink_ndjson "polars.LazyFrame.sink_ndjson")
(path, \*\[, ...\]) | Evaluate the query in streaming mode and write to an NDJSON file. | Partition[#](https://docs.pola.rs/api/python/stable/reference/io.html#partition "Link to this heading") -------------------------------------------------------------------------------------------------------- Sink to disk with differing partitioning strategies. | | | | --- | --- | | [`PartitionBy`](https://docs.pola.rs/api/python/stable/reference/api/polars.PartitionBy.html#polars.PartitionBy "polars.PartitionBy")
(base\_path, \*\[, ...\]) | Configuration for writing to multiple output files. | | [`PartitionByKey`](https://docs.pola.rs/api/python/stable/reference/api/polars.PartitionByKey.html#polars.PartitionByKey "polars.PartitionByKey")
(base\_path, \*\[, file\_path, ...\]) | Partitioning scheme to write files split by the values of keys. | | [`PartitionMaxSize`](https://docs.pola.rs/api/python/stable/reference/api/polars.PartitionMaxSize.html#polars.PartitionMaxSize "polars.PartitionMaxSize")
(base\_path, \*\[, file\_path, ...\]) | Partitioning scheme to write files with a maximum size. | | [`PartitionParted`](https://docs.pola.rs/api/python/stable/reference/api/polars.PartitionParted.html#polars.PartitionParted "polars.PartitionParted")
(base\_path, \*\[, file\_path, ...\]) | Partitioning scheme to split parted dataframes. | | | | | --- | --- | | [`FileProviderArgs`](https://docs.pola.rs/api/python/stable/reference/api/polars.io.partition.FileProviderArgs.html#polars.io.partition.FileProviderArgs "polars.io.partition.FileProviderArgs")
(\*, index\_in\_partition, ...) | Holds information on the file being sinked to. | | [`KeyedPartition`](https://docs.pola.rs/api/python/stable/reference/api/polars.io.partition.KeyedPartition.html#polars.io.partition.KeyedPartition "polars.io.partition.KeyedPartition")
(name, str\_value, raw\_value) | A key-value pair for a partition. | | [`BasePartitionContext`](https://docs.pola.rs/api/python/stable/reference/api/polars.io.partition.BasePartitionContext.html#polars.io.partition.BasePartitionContext "polars.io.partition.BasePartitionContext")
(file\_idx, file\_path, ...) | Callback context for a partition creation. | | [`KeyedPartitionContext`](https://docs.pola.rs/api/python/stable/reference/api/polars.io.partition.KeyedPartitionContext.html#polars.io.partition.KeyedPartitionContext "polars.io.partition.KeyedPartitionContext")
(file\_idx, part\_idx, ...) | Callback context for a partition creation using keys. | Parquet[#](https://docs.pola.rs/api/python/stable/reference/io.html#parquet "Link to this heading") ---------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_parquet.html#polars.read_parquet "polars.read_parquet")
(source, \*\[, columns, n\_rows, ...\]) | Read into a DataFrame from a parquet file. | | [`read_parquet_metadata`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_parquet_metadata.html#polars.read_parquet_metadata "polars.read_parquet_metadata")
(source\[, ...\]) | Get file-level custom metadata of a Parquet file without reading data. | | [`read_parquet_schema`](https://docs.pola.rs/api/python/stable/reference/api/polars.read_parquet_schema.html#polars.read_parquet_schema "polars.read_parquet_schema")
(source) | Get the schema of a Parquet file without reading data. | | [`scan_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_parquet.html#polars.scan_parquet "polars.scan_parquet")
(source, \*\[, n\_rows, ...\]) | Lazily read from a local or cloud-hosted parquet file (or files). | | [`DataFrame.write_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.DataFrame.write_parquet.html#polars.DataFrame.write_parquet "polars.DataFrame.write_parquet")
(file, \*\[, ...\]) | Write to Apache Parquet file. | | [`LazyFrame.sink_parquet`](https://docs.pola.rs/api/python/stable/reference/api/polars.LazyFrame.sink_parquet.html#polars.LazyFrame.sink_parquet "polars.LazyFrame.sink_parquet")
(path, \*\[, ...\]) | Evaluate the query in streaming mode and write to a Parquet file. | | | | | --- | --- | | [`ParquetFieldOverwrites`](https://docs.pola.rs/api/python/stable/reference/api/polars.io.parquet.ParquetFieldOverwrites.html#polars.io.parquet.ParquetFieldOverwrites "polars.io.parquet.ParquetFieldOverwrites")
(\*\[, name, children, ...\]) | Write-option overwrites for individual Parquet fields. | PyArrow Datasets[#](https://docs.pola.rs/api/python/stable/reference/io.html#pyarrow-datasets "Link to this heading") ---------------------------------------------------------------------------------------------------------------------- Connect to pyarrow datasets. | | | | --- | --- | | [`scan_pyarrow_dataset`](https://docs.pola.rs/api/python/stable/reference/api/polars.scan_pyarrow_dataset.html#polars.scan_pyarrow_dataset "polars.scan_pyarrow_dataset")
(source, \*\[, ...\]) | Scan a pyarrow dataset. | Cloud Credentials[#](https://docs.pola.rs/api/python/stable/reference/io.html#cloud-credentials "Link to this heading") ------------------------------------------------------------------------------------------------------------------------ Configuration for cloud credential provisioning. | | | | --- | --- | | [`CredentialProvider`](https://docs.pola.rs/api/python/stable/reference/api/polars.CredentialProvider.html#polars.CredentialProvider "polars.CredentialProvider")
() | Base class for credential providers. | | [`CredentialProviderAWS`](https://docs.pola.rs/api/python/stable/reference/api/polars.CredentialProviderAWS.html#polars.CredentialProviderAWS "polars.CredentialProviderAWS")
(\*\[, profile\_name, ...\]) | AWS Credential Provider. | | [`CredentialProviderAzure`](https://docs.pola.rs/api/python/stable/reference/api/polars.CredentialProviderAzure.html#polars.CredentialProviderAzure "polars.CredentialProviderAzure")
(\*\[, scopes, ...\]) | Azure Credential Provider. | | [`CredentialProviderGCP`](https://docs.pola.rs/api/python/stable/reference/api/polars.CredentialProviderGCP.html#polars.CredentialProviderGCP "polars.CredentialProviderGCP")
(\*\[, scopes, request, ...\]) | GCP Credential Provider. | Scan Cast Options[#](https://docs.pola.rs/api/python/stable/reference/io.html#scan-cast-options "Link to this heading") ------------------------------------------------------------------------------------------------------------------------ Configuration for type-casting during scans. | | | | --- | --- | | [`ScanCastOptions`](https://docs.pola.rs/api/python/stable/reference/api/polars.ScanCastOptions.html#polars.ScanCastOptions "polars.ScanCastOptions")
(\*\[, integer\_cast, ...\]) | Options for scanning files. | On this page --- # Config — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/config.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Config[#](https://docs.pola.rs/api/python/stable/reference/config.html#config "Link to this heading") ====================================================================================================== Config options[#](https://docs.pola.rs/api/python/stable/reference/config.html#config-options "Link to this heading") ---------------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`Config.set_ascii_tables`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_ascii_tables.html#polars.Config.set_ascii_tables "polars.Config.set_ascii_tables")
(\[active\]) | Use ASCII characters to display table outlines. | | [`Config.set_auto_structify`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_auto_structify.html#polars.Config.set_auto_structify "polars.Config.set_auto_structify")
(\[active\]) | Allow multi-output expressions to be automatically turned into Structs. | | [`Config.set_decimal_separator`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_decimal_separator.html#polars.Config.set_decimal_separator "polars.Config.set_decimal_separator")
(\[separator\]) | Set the decimal separator character. | | [`Config.set_default_credential_provider`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_default_credential_provider.html#polars.Config.set_default_credential_provider "polars.Config.set_default_credential_provider")
(...) | Set a default credential provider. | | [`Config.set_engine_affinity`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_engine_affinity.html#polars.Config.set_engine_affinity "polars.Config.set_engine_affinity")
(\[engine\]) | Set which engine to use by default. | | [`Config.set_float_precision`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_float_precision.html#polars.Config.set_float_precision "polars.Config.set_float_precision")
(\[precision\]) | Control the number of decimal places displayed for floating point values. | | [`Config.set_fmt_float`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_fmt_float.html#polars.Config.set_fmt_float "polars.Config.set_fmt_float")
(\[fmt\]) | Control how floating point values are displayed. | | [`Config.set_fmt_str_lengths`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_fmt_str_lengths.html#polars.Config.set_fmt_str_lengths "polars.Config.set_fmt_str_lengths")
(n) | Set the number of characters used to display string values. | | [`Config.set_fmt_table_cell_list_len`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_fmt_table_cell_list_len.html#polars.Config.set_fmt_table_cell_list_len "polars.Config.set_fmt_table_cell_list_len")
(n) | Set the number of elements to display for List values. | | [`Config.set_streaming_chunk_size`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_streaming_chunk_size.html#polars.Config.set_streaming_chunk_size "polars.Config.set_streaming_chunk_size")
(size) | Overwrite chunk size used in `streaming` engine. | | [`Config.set_tbl_cell_alignment`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_cell_alignment.html#polars.Config.set_tbl_cell_alignment "polars.Config.set_tbl_cell_alignment")
(format) | Set table cell alignment. | | [`Config.set_tbl_cell_numeric_alignment`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_cell_numeric_alignment.html#polars.Config.set_tbl_cell_numeric_alignment "polars.Config.set_tbl_cell_numeric_alignment")
(format) | Set table cell alignment for numeric columns. | | [`Config.set_tbl_cols`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_cols.html#polars.Config.set_tbl_cols "polars.Config.set_tbl_cols")
(n) | Set the number of columns that are visible when displaying tables. | | [`Config.set_tbl_column_data_type_inline`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_column_data_type_inline.html#polars.Config.set_tbl_column_data_type_inline "polars.Config.set_tbl_column_data_type_inline")
(\[active\]) | Display the data type next to the column name (to the right, in parentheses). | | [`Config.set_tbl_dataframe_shape_below`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_dataframe_shape_below.html#polars.Config.set_tbl_dataframe_shape_below "polars.Config.set_tbl_dataframe_shape_below")
(\[active\]) | Print the DataFrame shape information below the data when displaying tables. | | [`Config.set_tbl_formatting`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_formatting.html#polars.Config.set_tbl_formatting "polars.Config.set_tbl_formatting")
(\[format, ...\]) | Set table formatting style. | | [`Config.set_tbl_hide_column_data_types`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_hide_column_data_types.html#polars.Config.set_tbl_hide_column_data_types "polars.Config.set_tbl_hide_column_data_types")
(\[active\]) | Hide table column data types (i64, f64, str etc.). | | [`Config.set_tbl_hide_column_names`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_hide_column_names.html#polars.Config.set_tbl_hide_column_names "polars.Config.set_tbl_hide_column_names")
(\[active\]) | Hide table column names. | | [`Config.set_tbl_hide_dataframe_shape`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_hide_dataframe_shape.html#polars.Config.set_tbl_hide_dataframe_shape "polars.Config.set_tbl_hide_dataframe_shape")
(\[active\]) | Hide the DataFrame shape information when displaying tables. | | [`Config.set_tbl_hide_dtype_separator`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_hide_dtype_separator.html#polars.Config.set_tbl_hide_dtype_separator "polars.Config.set_tbl_hide_dtype_separator")
(\[active\]) | Hide the '---' separator displayed between the column names and column types. | | [`Config.set_tbl_rows`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_rows.html#polars.Config.set_tbl_rows "polars.Config.set_tbl_rows")
(n) | Set the max number of rows used to draw the table (both Dataframe and Series). | | [`Config.set_tbl_width_chars`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_tbl_width_chars.html#polars.Config.set_tbl_width_chars "polars.Config.set_tbl_width_chars")
(width) | Set the maximum width of a table in characters. | | [`Config.set_thousands_separator`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_thousands_separator.html#polars.Config.set_thousands_separator "polars.Config.set_thousands_separator")
(\[separator\]) | Set the thousands grouping separator character. | | [`Config.set_trim_decimal_zeros`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_trim_decimal_zeros.html#polars.Config.set_trim_decimal_zeros "polars.Config.set_trim_decimal_zeros")
(\[active\]) | Strip trailing zeros from Decimal data type values. | | [`Config.set_verbose`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.set_verbose.html#polars.Config.set_verbose "polars.Config.set_verbose")
(\[active\]) | Enable additional verbose/debug logging. | Config load, save, state[#](https://docs.pola.rs/api/python/stable/reference/config.html#config-load-save-state "Link to this heading") ---------------------------------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`Config.load`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.load.html#polars.Config.load "polars.Config.load")
(cfg) | Load (and set) previously saved Config options from a JSON string. | | [`Config.load_from_file`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.load_from_file.html#polars.Config.load_from_file "polars.Config.load_from_file")
(file) | Load (and set) previously saved Config options from file. | | [`Config.save`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.save.html#polars.Config.save "polars.Config.save")
(\*\[, if\_set\]) | Save the current set of Config options as a JSON string. | | [`Config.save_to_file`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.save_to_file.html#polars.Config.save_to_file "polars.Config.save_to_file")
(file) | Save the current set of Config options as a JSON file. | | [`Config.state`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.state.html#polars.Config.state "polars.Config.state")
(\*\[, if\_set, env\_only\]) | Show the current state of all Config variables in the environment as a dict. | | [`Config.restore_defaults`](https://docs.pola.rs/api/python/stable/reference/api/polars.Config.restore_defaults.html#polars.Config.restore_defaults "polars.Config.restore_defaults")
() | Reset all polars Config settings to their default state. | While it is easy to restore _all_ configuration options to their default value using `restore_defaults`, it can also be useful to reset _individual_ options. This can be done by setting the related value to `None`, eg: pl.Config.set\_tbl\_rows(None) Use as a context manager[#](https://docs.pola.rs/api/python/stable/reference/config.html#use-as-a-context-manager "Link to this heading") ------------------------------------------------------------------------------------------------------------------------------------------ Note that `Config` supports setting context-scoped options. These options are valid _only_ during scope lifetime, and are reset to their initial values (whatever they were before entering the new context) on scope exit. You can take advantage of this by initialising a `Config` instance and then explicitly calling one or more of the available “set\_” methods on it… with pl.Config() as cfg: cfg.set\_verbose(True) do\_various\_things() \# on scope exit any modified settings are restored to their previous state …or, often cleaner, by setting the options in the `Config` init directly (optionally omitting the “set\_” prefix for brevity): with pl.Config(verbose\=True): do\_various\_things() Use as a decorator[#](https://docs.pola.rs/api/python/stable/reference/config.html#use-as-a-decorator "Link to this heading") ------------------------------------------------------------------------------------------------------------------------------ In the same vein, you can also use a `Config` instance as a function decorator to temporarily set options for the duration of the function call: cfg\_ascii\_frames \= pl.Config(ascii\_tables\=True, apply\_on\_context\_enter\=True) @cfg\_ascii\_frames def write\_markdown\_frame\_to\_stdout(df: pl.DataFrame) \-> None: sys.stdout.write(str(df)) Multiple Config instances[#](https://docs.pola.rs/api/python/stable/reference/config.html#multiple-config-instances "Link to this heading") -------------------------------------------------------------------------------------------------------------------------------------------- You may want to establish related bundles of `Config` options for use in different parts of your code. Usually options are set immediately on `Config` init, meaning the `Config` instance cannot be reused; however, you can defer this so that options are only invoked when entering context scope (which includes function entry if used as a decorator).\_ This allows you to create multiple _reusable_ `Config` instances in one place, update and modify them centrally, and apply them as needed throughout your codebase. cfg\_verbose \= pl.Config(verbose\=True, apply\_on\_context\_enter\=True) cfg\_markdown \= pl.Config(tbl\_formatting\="MARKDOWN", apply\_on\_context\_enter\=True) @cfg\_markdown def write\_markdown\_frame\_to\_stdout(df: pl.DataFrame) \-> None: sys.stdout.write(str(df)) @cfg\_verbose def do\_various\_things(): ... On this page --- # Plugins — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/plugins.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Plugins[#](https://docs.pola.rs/api/python/stable/reference/plugins.html#plugins "Link to this heading") ========================================================================================================= Polars allows you to extend its functionality with either Expression plugins or IO plugins. See the [user guide](https://docs.pola.rs/user-guide/plugins/) for more information and resources. Expression plugins[#](https://docs.pola.rs/api/python/stable/reference/plugins.html#expression-plugins "Link to this heading") ------------------------------------------------------------------------------------------------------------------------------- Expression plugins are the preferred way to create user defined functions. They allow you to compile a Rust function and register that as an expression into the Polars library. The Polars engine will dynamically link your function at runtime and your expression will run almost as fast as native expressions. Note that this works without any interference of Python and thus no GIL contention. See the [expression plugins section of the user guide](https://docs.pola.rs/user-guide/plugins/expr_plugins/) for more information. | | | | --- | --- | | [`plugins.register_plugin_function`](https://docs.pola.rs/api/python/stable/reference/api/polars.plugins.register_plugin_function.html#polars.plugins.register_plugin_function "polars.plugins.register_plugin_function")
(\*, ...\[, ...\]) | Register a plugin function. | IO plugins[#](https://docs.pola.rs/api/python/stable/reference/plugins.html#io-plugins "Link to this heading") --------------------------------------------------------------------------------------------------------------- IO plugins allow you to register different file formats as sources to the Polars engines. See the [IO plugins section of the user guide](https://docs.pola.rs/user-guide/plugins/io_plugins/) for more information. Note The `io.plugins` module is not imported by default in order to optimise import speed of the primary `polars` module. Either import `polars.io.plugins` and _then_ use that namespace, or import `register_io_source` from the full module path, e.g.: from polars.io.plugins import register\_io\_source | | | | --- | --- | | [`io.plugins.register_io_source`](https://docs.pola.rs/api/python/stable/reference/api/polars.io.plugins.register_io_source.html#polars.io.plugins.register_io_source "polars.io.plugins.register_io_source")
(io\_source, \*, ...) | Register your IO plugin and initialize a LazyFrame. | On this page --- # SQL Interface — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/sql/index.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") SQL Interface[#](https://docs.pola.rs/api/python/stable/reference/sql/index.html#sql-interface "Link to this heading") ======================================================================================================================= This page gives an overview of all public SQL functions and operations supported by Polars. **Python API** * [Python API](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html) * [Introduction](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html#introduction) * [Querying](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html#querying) * [Global SQL](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html#global-sql) * [Frame SQL](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html#frame-sql) * [Expression SQL](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html#expression-sql) * [SQLContext](https://docs.pola.rs/api/python/stable/reference/sql/python_api.html#sqlcontext) **SQL Clauses** * [SQL Clauses](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html) * [SELECT](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#select) * [DISTINCT](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#distinct) * [FROM](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#from) * [JOIN](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#join) * [WHERE](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#where) * [GROUP BY](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#group-by) * [HAVING](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#having) * [WINDOW](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#window) * [QUALIFY](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#qualify) * [ORDER BY](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#order-by) * [LIMIT](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#limit) * [OFFSET](https://docs.pola.rs/api/python/stable/reference/sql/clauses.html#offset) **SQL Functions** [Overview](https://docs.pola.rs/api/python/stable/reference/sql/functions/index.html) * [SQL Functions](https://docs.pola.rs/api/python/stable/reference/sql/functions/index.html) * [Aggregate](https://docs.pola.rs/api/python/stable/reference/sql/functions/aggregate.html) * [Array](https://docs.pola.rs/api/python/stable/reference/sql/functions/array.html) * [Bitwise](https://docs.pola.rs/api/python/stable/reference/sql/functions/bitwise.html) * [Conditional](https://docs.pola.rs/api/python/stable/reference/sql/functions/conditional.html) * [Math](https://docs.pola.rs/api/python/stable/reference/sql/functions/math.html) * [String](https://docs.pola.rs/api/python/stable/reference/sql/functions/string.html) * [Temporal](https://docs.pola.rs/api/python/stable/reference/sql/functions/temporal.html) * [Trigonometry](https://docs.pola.rs/api/python/stable/reference/sql/functions/trigonometry.html) * [Types](https://docs.pola.rs/api/python/stable/reference/sql/functions/types.html) * [Window](https://docs.pola.rs/api/python/stable/reference/sql/functions/window.html) **Set Operations** * [Set Operations](https://docs.pola.rs/api/python/stable/reference/sql/set_operations.html) * [EXCEPT](https://docs.pola.rs/api/python/stable/reference/sql/set_operations.html#except) * [INTERSECT](https://docs.pola.rs/api/python/stable/reference/sql/set_operations.html#intersect) * [UNION](https://docs.pola.rs/api/python/stable/reference/sql/set_operations.html#union) * [UNION ALL](https://docs.pola.rs/api/python/stable/reference/sql/set_operations.html#union-all) * [UNION BY NAME](https://docs.pola.rs/api/python/stable/reference/sql/set_operations.html#union-by-name) **Table Operations** * [Table Operations](https://docs.pola.rs/api/python/stable/reference/sql/table_operations.html) * [CREATE TABLE](https://docs.pola.rs/api/python/stable/reference/sql/table_operations.html#create-table) * [DELETE](https://docs.pola.rs/api/python/stable/reference/sql/table_operations.html#delete) * [DROP TABLES](https://docs.pola.rs/api/python/stable/reference/sql/table_operations.html#drop-tables) * [EXPLAIN](https://docs.pola.rs/api/python/stable/reference/sql/table_operations.html#explain) * [SHOW TABLES](https://docs.pola.rs/api/python/stable/reference/sql/table_operations.html#show-tables) * [UNNEST](https://docs.pola.rs/api/python/stable/reference/sql/table_operations.html#unnest) * [TRUNCATE](https://docs.pola.rs/api/python/stable/reference/sql/table_operations.html#truncate) --- # Extending the API — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/api.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Extending the API[#](https://docs.pola.rs/api/python/stable/reference/api.html#extending-the-api "Link to this heading") ========================================================================================================================= Providing new functionality[#](https://docs.pola.rs/api/python/stable/reference/api.html#providing-new-functionality "Link to this heading") --------------------------------------------------------------------------------------------------------------------------------------------- These functions allow you to register custom functionality in a dedicated namespace on the underlying Polars classes without requiring subclassing or mixins. Expr, DataFrame, LazyFrame, and Series are all supported targets. This feature is primarily intended for use by library authors providing domain-specific capabilities which may not exist (or belong) in the core library. Available registrations[#](https://docs.pola.rs/api/python/stable/reference/api.html#available-registrations "Link to this heading") ------------------------------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`register_expr_namespace`](https://docs.pola.rs/api/python/stable/reference/api/polars.api.register_expr_namespace.html#polars.api.register_expr_namespace "polars.api.register_expr_namespace")
(name) | Decorator for registering custom functionality with a Polars Expr. | | [`register_dataframe_namespace`](https://docs.pola.rs/api/python/stable/reference/api/polars.api.register_dataframe_namespace.html#polars.api.register_dataframe_namespace "polars.api.register_dataframe_namespace")
(name) | Decorator for registering custom functionality with a Polars DataFrame. | | [`register_lazyframe_namespace`](https://docs.pola.rs/api/python/stable/reference/api/polars.api.register_lazyframe_namespace.html#polars.api.register_lazyframe_namespace "polars.api.register_lazyframe_namespace")
(name) | Decorator for registering custom functionality with a Polars LazyFrame. | | [`register_series_namespace`](https://docs.pola.rs/api/python/stable/reference/api/polars.api.register_series_namespace.html#polars.api.register_series_namespace "polars.api.register_series_namespace")
(name) | Decorator for registering custom functionality with a polars Series. | Note You cannot override existing Polars namespaces (such as `.str` or `.dt`), and attempting to do so will raise an [AttributeError](https://docs.python.org/3/library/exceptions.html#AttributeError) . However, you _can_ override other custom namespaces (which will only generate a [UserWarning](https://docs.python.org/3/library/exceptions.html#UserWarning) ). Examples[#](https://docs.pola.rs/api/python/stable/reference/api.html#examples "Link to this heading") ------------------------------------------------------------------------------------------------------- Expr @pl.api.register\_expr\_namespace("greetings") class Greetings: def \_\_init\_\_(self, expr: pl.Expr) \-> None: self.\_expr \= expr def hello(self) \-> pl.Expr: return (pl.lit("Hello ") + self.\_expr).alias("hi there") def goodbye(self) \-> pl.Expr: return (pl.lit("Sayōnara ") + self.\_expr).alias("bye") pl.DataFrame(data\=\["world", "world!", "world!!"\]).select( \[\ pl.all().greetings.hello(),\ pl.all().greetings.goodbye(),\ \] ) \# shape: (3, 1) shape: (3, 2) \# ┌──────────┐ ┌───────────────┬──────────────────┐ \# │ column\_0 │ │ hi there ┆ bye │ \# │ --- │ │ --- ┆ --- │ \# │ str │ │ str ┆ str │ \# ╞══════════╡ >> ╞═══════════════╪══════════════════╡ \# │ world │ │ Hello world ┆ Sayōnara world │ \# │ world! │ │ Hello world! ┆ Sayōnara world! │ \# │ world!! │ │ Hello world!! ┆ Sayōnara world!! │ \# └──────────┘ └───────────────┴──────────────────┘ DataFrame @pl.api.register\_dataframe\_namespace("split") class SplitFrame: def \_\_init\_\_(self, df: pl.DataFrame) \-> None: self.\_df \= df def by\_alternate\_rows(self) \-> list\[pl.DataFrame\]: df \= self.\_df.with\_row\_index(name\="n") return \[\ df.filter((pl.col("n") % 2) \== 0).drop("n"),\ df.filter((pl.col("n") % 2) != 0).drop("n"),\ \] pl.DataFrame( data\=\["aaa", "bbb", "ccc", "ddd", "eee", "fff"\], schema\=\[("txt", pl.String)\], ).split.by\_alternate\_rows() \# \[┌─────┐ ┌─────┐\ \# │ txt │ │ txt │\ \# │ --- │ │ --- │\ \# │ str │ │ str │\ \# ╞═════╡ ╞═════╡\ \# │ aaa │ │ bbb │\ \# │ ccc │ │ ddd │\ \# │ eee │ │ fff │\ \# └─────┘, └─────┘\] LazyFrame @pl.api.register\_lazyframe\_namespace("types") class DTypeOperations: def \_\_init\_\_(self, ldf: pl.LazyFrame) \-> None: self.\_ldf \= ldf def upcast\_integer\_types(self) \-> pl.LazyFrame: return self.\_ldf.with\_columns( pl.col(tp).cast(pl.Int64) for tp in (pl.Int8, pl.Int16, pl.Int32) ) ldf \= pl.DataFrame( data\={"a": \[1, 2\], "b": \[3, 4\], "c": \[5.6, 6.7\]}, schema\=\[("a", pl.Int16), ("b", pl.Int32), ("c", pl.Float32)\], ).lazy() ldf.types.upcast\_integer\_types() \# shape: (2, 3) shape: (2, 3) \# ┌─────┬─────┬─────┐ ┌─────┬─────┬─────┐ \# │ a ┆ b ┆ c │ │ a ┆ b ┆ c │ \# │ --- ┆ --- ┆ --- │ │ --- ┆ --- ┆ --- │ \# │ i16 ┆ i32 ┆ f32 │ >> │ i64 ┆ i64 ┆ f32 │ \# ╞═════╪═════╪═════╡ ╞═════╪═════╪═════╡ \# │ 1 ┆ 3 ┆ 5.6 │ │ 1 ┆ 3 ┆ 5.6 │ \# │ 2 ┆ 4 ┆ 6.7 │ │ 2 ┆ 4 ┆ 6.7 │ \# └─────┴─────┴─────┘ └─────┴─────┴─────┘ Series @pl.api.register\_series\_namespace("math") class MathShortcuts: def \_\_init\_\_(self, s: pl.Series) \-> None: self.\_s \= s def square(self) \-> pl.Series: return self.\_s \* self.\_s def cube(self) \-> pl.Series: return self.\_s \* self.\_s \* self.\_s s \= pl.Series("n", \[1, 2, 3, 4, 5\]) s2 \= s.math.square().rename("n2") s3 \= s.math.cube().rename("n3") \# shape: (5,) shape: (5,) shape: (5,) \# Series: 'n' \[i64\] Series: 'n2' \[i64\] Series: 'n3' \[i64\] \# \[ \[ \[\ \# 1 1 1\ \# 2 4 8\ \# 3 9 27\ \# 4 16 64\ \# 5 25 125\ \# \] \] \] On this page --- # Exceptions — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/exceptions.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Exceptions[#](https://docs.pola.rs/api/python/stable/reference/exceptions.html#exceptions "Link to this heading") ================================================================================================================== Errors[#](https://docs.pola.rs/api/python/stable/reference/exceptions.html#errors "Link to this heading") ---------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`PolarsError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.PolarsError.html#polars.exceptions.PolarsError "polars.exceptions.PolarsError") | Base class for all Polars errors. | | [`ColumnNotFoundError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.ColumnNotFoundError.html#polars.exceptions.ColumnNotFoundError "polars.exceptions.ColumnNotFoundError") | Exception raised when a specified column is not found. | | [`ComputeError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.ComputeError.html#polars.exceptions.ComputeError "polars.exceptions.ComputeError") | Exception raised when Polars could not perform an underlying computation. | | [`DuplicateError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.DuplicateError.html#polars.exceptions.DuplicateError "polars.exceptions.DuplicateError") | Exception raised when a column name is duplicated. | | [`InvalidOperationError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.InvalidOperationError.html#polars.exceptions.InvalidOperationError "polars.exceptions.InvalidOperationError") | Exception raised when an operation is not allowed (or possible) against a given object or data structure. | | [`ModuleUpgradeRequiredError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.ModuleUpgradeRequiredError.html#polars.exceptions.ModuleUpgradeRequiredError "polars.exceptions.ModuleUpgradeRequiredError") | Exception raised when a module is installed but needs to be upgraded. | | [`NoDataError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.NoDataError.html#polars.exceptions.NoDataError "polars.exceptions.NoDataError") | Exception raised when an operation cannot be performed on an empty data structure. | | [`NoRowsReturnedError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.NoRowsReturnedError.html#polars.exceptions.NoRowsReturnedError "polars.exceptions.NoRowsReturnedError") | Exception raised when no rows are returned, but at least one row is expected. | | [`OutOfBoundsError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.OutOfBoundsError.html#polars.exceptions.OutOfBoundsError "polars.exceptions.OutOfBoundsError") | Exception raised when the given index is out of bounds. | | [`ParameterCollisionError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.ParameterCollisionError.html#polars.exceptions.ParameterCollisionError "polars.exceptions.ParameterCollisionError") | Exception raised when the same parameter occurs multiple times. | | [`RowsError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.RowsError.html#polars.exceptions.RowsError "polars.exceptions.RowsError") | Exception raised when the number of returned rows does not match expectation. | | [`SQLInterfaceError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.SQLInterfaceError.html#polars.exceptions.SQLInterfaceError "polars.exceptions.SQLInterfaceError") | Exception raised when an error occurs in the SQL interface. | | [`SQLSyntaxError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.SQLSyntaxError.html#polars.exceptions.SQLSyntaxError "polars.exceptions.SQLSyntaxError") | Exception raised from the SQL interface when encountering invalid syntax. | | [`SchemaError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.SchemaError.html#polars.exceptions.SchemaError "polars.exceptions.SchemaError") | Exception raised when an unexpected schema mismatch causes an error. | | [`SchemaFieldNotFoundError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.SchemaFieldNotFoundError.html#polars.exceptions.SchemaFieldNotFoundError "polars.exceptions.SchemaFieldNotFoundError") | Exception raised when a specified schema field is not found. | | [`ShapeError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.ShapeError.html#polars.exceptions.ShapeError "polars.exceptions.ShapeError") | Exception raised when trying to perform operations on data structures with incompatible shapes. | | [`StringCacheMismatchError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.StringCacheMismatchError.html#polars.exceptions.StringCacheMismatchError "polars.exceptions.StringCacheMismatchError") | Exception raised when string caches come from different sources. | | [`StructFieldNotFoundError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.StructFieldNotFoundError.html#polars.exceptions.StructFieldNotFoundError "polars.exceptions.StructFieldNotFoundError") | Exception raised when a specified Struct field is not found. | | [`TooManyRowsReturnedError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.TooManyRowsReturnedError.html#polars.exceptions.TooManyRowsReturnedError "polars.exceptions.TooManyRowsReturnedError") | Exception raised when more rows than expected are returned. | | [`UnsuitableSQLError`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.UnsuitableSQLError.html#polars.exceptions.UnsuitableSQLError "polars.exceptions.UnsuitableSQLError") | Exception raised when unsuitable SQL is given to a database method. | Warnings[#](https://docs.pola.rs/api/python/stable/reference/exceptions.html#warnings "Link to this heading") -------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`PolarsWarning`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.PolarsWarning.html#polars.exceptions.PolarsWarning "polars.exceptions.PolarsWarning") | Base class for all Polars warnings. | | [`CategoricalRemappingWarning`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.CategoricalRemappingWarning.html#polars.exceptions.CategoricalRemappingWarning "polars.exceptions.CategoricalRemappingWarning") | Warning issued when a categorical needs to be remapped to be compatible with another categorical. | | [`ChronoFormatWarning`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.ChronoFormatWarning.html#polars.exceptions.ChronoFormatWarning "polars.exceptions.ChronoFormatWarning") | Warning issued when a chrono format string contains dubious patterns. | | [`CustomUFuncWarning`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.CustomUFuncWarning.html#polars.exceptions.CustomUFuncWarning "polars.exceptions.CustomUFuncWarning") | Warning issued when a custom ufunc is handled differently than numpy ufunc would. | | [`DataOrientationWarning`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.DataOrientationWarning.html#polars.exceptions.DataOrientationWarning "polars.exceptions.DataOrientationWarning") | Warning issued to indicate row orientation was inferred from the inputs. | | [`MapWithoutReturnDtypeWarning`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.MapWithoutReturnDtypeWarning.html#polars.exceptions.MapWithoutReturnDtypeWarning "polars.exceptions.MapWithoutReturnDtypeWarning") | Warning issued when `map_elements` is performed without specifying the return dtype. | | [`PerformanceWarning`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.PerformanceWarning.html#polars.exceptions.PerformanceWarning "polars.exceptions.PerformanceWarning") | Warning issued to indicate potential performance pitfalls. | | [`PolarsInefficientMapWarning`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.PolarsInefficientMapWarning.html#polars.exceptions.PolarsInefficientMapWarning "polars.exceptions.PolarsInefficientMapWarning") | Warning issued when a potentially slow `map_*` operation is performed. | | [`UnstableWarning`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.UnstableWarning.html#polars.exceptions.UnstableWarning "polars.exceptions.UnstableWarning") | Warning issued when unstable functionality is used. | Panic[#](https://docs.pola.rs/api/python/stable/reference/exceptions.html#panic "Link to this heading") -------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`PanicException`](https://docs.pola.rs/api/python/stable/reference/api/polars.exceptions.PanicException.html#polars.exceptions.PanicException "polars.exceptions.PanicException") | Exception raised when an unexpected state causes a panic in the underlying Rust library. | On this page --- # Testing — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/testing.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Testing[#](https://docs.pola.rs/api/python/stable/reference/testing.html#testing "Link to this heading") ========================================================================================================= The `testing` module provides a number of functions and helpers for use with unit tests. Note The `testing` module is not imported by default in order to optimise import speed of the primary `polars` module. Either import `polars.testing` and _then_ use that namespace, or import the specific functions you need from the full module path, e.g.: from polars.testing import assert\_frame\_equal, assert\_series\_equal Asserts[#](https://docs.pola.rs/api/python/stable/reference/testing.html#asserts "Link to this heading") --------------------------------------------------------------------------------------------------------- Polars provides some standard asserts for use with unit tests: | | | | --- | --- | | [`testing.assert_frame_equal`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.assert_frame_equal.html#polars.testing.assert_frame_equal "polars.testing.assert_frame_equal")
(left, right, \*\[, ...\]) | Assert that the left and right frame are equal. | | [`testing.assert_frame_not_equal`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.assert_frame_not_equal.html#polars.testing.assert_frame_not_equal "polars.testing.assert_frame_not_equal")
(left, right, \*) | Assert that the left and right frame are **not** equal. | | [`testing.assert_series_equal`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.assert_series_equal.html#polars.testing.assert_series_equal "polars.testing.assert_series_equal")
(left, right, \*) | Assert that the left and right Series are equal. | | [`testing.assert_series_not_equal`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.assert_series_not_equal.html#polars.testing.assert_series_not_equal "polars.testing.assert_series_not_equal")
(left, right, \*) | Assert that the left and right Series are **not** equal. | Parametric testing[#](https://docs.pola.rs/api/python/stable/reference/testing.html#parametric-testing "Link to this heading") ------------------------------------------------------------------------------------------------------------------------------- See the Hypothesis library for more details about property-based testing, strategies, and library integrations: * [Overview](https://hypothesis.readthedocs.io/) * [Quick start guide](https://hypothesis.readthedocs.io/en/latest/quickstart.html) ### Polars strategies[#](https://docs.pola.rs/api/python/stable/reference/testing.html#polars-strategies "Link to this heading") Polars provides the following [hypothesis](https://hypothesis.readthedocs.io/) testing strategies: | | | | --- | --- | | [`testing.parametric.dataframes`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.parametric.dataframes.html#polars.testing.parametric.dataframes "polars.testing.parametric.dataframes")
(\[cols, lazy, ...\]) | Hypothesis strategy for producing Polars DataFrames or LazyFrames. | | [`testing.parametric.dtypes`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.parametric.dtypes.html#polars.testing.parametric.dtypes "polars.testing.parametric.dtypes")
(\*\[, ...\]) | Create a strategy for generating Polars `DataType` objects. | | [`testing.parametric.lists`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.parametric.lists.html#polars.testing.parametric.lists "polars.testing.parametric.lists")
(inner\_dtype, \*\[, ...\]) | Create a strategy for generating lists of the given data type. | | [`testing.parametric.series`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.parametric.series.html#polars.testing.parametric.series "polars.testing.parametric.series")
(\*\[, name, dtype, ...\]) | Hypothesis strategy for producing Polars Series. | ### Strategy helpers[#](https://docs.pola.rs/api/python/stable/reference/testing.html#strategy-helpers "Link to this heading") | | | | --- | --- | | [`testing.parametric.column`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.parametric.column.html#polars.testing.parametric.column "polars.testing.parametric.column")
(\[name, dtype, ...\]) | Define a column for use with the `dataframes` strategy. | | [`testing.parametric.columns`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.parametric.columns.html#polars.testing.parametric.columns "polars.testing.parametric.columns")
(\[cols, dtype, ...\]) | Define multiple columns for use with the @dataframes strategy. | | [`testing.parametric.create_list_strategy`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.parametric.create_list_strategy.html#polars.testing.parametric.create_list_strategy "polars.testing.parametric.create_list_strategy")
(\[...\]) | Create a strategy for generating Polars `List` data. | ### Profiles[#](https://docs.pola.rs/api/python/stable/reference/testing.html#profiles "Link to this heading") Several standard/named [hypothesis](https://hypothesis.readthedocs.io/) profiles are provided: * `fast`: runs 100 iterations. * `balanced`: runs 1,000 iterations. * `expensive`: runs 10,000 iterations. The load/set helper functions allow you to access these profiles directly, set your preferred profile (default is `fast`), or set a custom number of iterations. | | | | --- | --- | | [`testing.parametric.load_profile`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.parametric.load_profile.html#polars.testing.parametric.load_profile "polars.testing.parametric.load_profile")
(\[profile, ...\]) | Load a named (or custom) hypothesis profile for use with the parametric tests. | | [`testing.parametric.set_profile`](https://docs.pola.rs/api/python/stable/reference/api/polars.testing.parametric.set_profile.html#polars.testing.parametric.set_profile "polars.testing.parametric.set_profile")
(profile) | Set the env var `POLARS_HYPOTHESIS_PROFILE` to the given profile name/value. | **Approximate profile timings:** Running polars’ own parametric unit tests on `0.17.6` against release and debug builds, on a machine with 12 cores, using `xdist -n auto` results in the following timings (these values are indicative only, and may vary significantly depending on your own hardware setup): | Profile | Iterations | Release | Debug | | --- | --- | --- | --- | | `fast` | 100 | ~6 secs | ~8 secs | | `balanced` | 1,000 | ~22 secs | ~30 secs | | `expensive` | 10,000 | ~3 mins 5 secs | ~4 mins 45 secs | ### Examples[#](https://docs.pola.rs/api/python/stable/reference/testing.html#examples "Link to this heading") **Basic:** Create a parametric unit test that will receive a series of generated DataFrames, each having 5 numeric columns with a 10% chance of any generated value being `null` (this is distinct from `NaN`). import polars as pl from polars.testing.parametric import dataframes from polars import NUMERIC\_DTYPES from hypothesis import given @given( dataframes( cols\=5, allow\_null\=True, allowed\_dtypes\=NUMERIC\_DTYPES, ) ) def test\_numeric(df: pl.DataFrame): assert all(df\[col\].dtype.is\_numeric() for col in df.columns) \# Example frame: \# ┌──────┬────────┬───────┬────────────┬────────────┐ \# │ col0 ┆ col1 ┆ col2 ┆ col3 ┆ col4 │ \# │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ \# │ u8 ┆ i16 ┆ u16 ┆ i32 ┆ f64 │ \# ╞══════╪════════╪═══════╪════════════╪════════════╡ \# │ 54 ┆ -29096 ┆ 485 ┆ 2147483647 ┆ -2.8257e14 │ \# │ null ┆ 7508 ┆ 37338 ┆ 7264 ┆ 1.5 │ \# │ 0 ┆ 321 ┆ null ┆ 16996 ┆ NaN │ \# │ 121 ┆ -361 ┆ 63204 ┆ 1 ┆ 1.1443e235 │ \# └──────┴────────┴───────┴────────────┴────────────┘ **Intermediate:** Integrate hypothesis-native strategies into specifically-named columns, generating a series of LazyFrames, with a minimum size of five rows and values that conform to the given strategies: import polars as pl from polars.testing.parametric import column, dataframes import hypothesis.strategies as st from hypothesis import given from string import ascii\_letters, digits id\_chars \= ascii\_letters + digits @given( dataframes( cols\=\[\ column("id", strategy\=st.text(min\_size\=4, max\_size\=4, alphabet\=id\_chars)),\ column("ccy", strategy\=st.sampled\_from(\["GBP", "EUR", "JPY", "USD"\])),\ column("price", strategy\=st.floats(min\_value\=0.0, max\_value\=1000.0)),\ \], min\_size\=5, lazy\=True, ) ) def test\_price\_calculations(lf: pl.LazyFrame): ... print(lf.collect()) \# Example frame: \# ┌──────┬─────┬─────────┐ \# │ id ┆ ccy ┆ price │ \# │ --- ┆ --- ┆ --- │ \# │ str ┆ str ┆ f64 │ \# ╞══════╪═════╪═════════╡ \# │ A101 ┆ GBP ┆ 1.1 │ \# │ 8nIn ┆ JPY ┆ 1.5 │ \# │ QHoO ┆ EUR ┆ 714.544 │ \# │ i0e0 ┆ GBP ┆ 0.0 │ \# │ 0000 ┆ USD ┆ 999.0 │ \# └──────┴─────┴─────────┘ **Advanced:** Create and use a `List[UInt8]` dtype strategy as a hypothesis [composite](https://hypothesis.readthedocs.io/en/latest/data.html#hypothesis.strategies.composite) that generates pairs of pairs of small integer values in which the first value in each nested pair is always less than or equal to the second value: import polars as pl from polars.testing.parametric import column, dataframes, lists import hypothesis.strategies as st from hypothesis import given @st.composite def uint8\_pairs(draw: st.DrawFn): uints \= lists(pl.UInt8, size\=2) pairs \= list(zip(draw(uints), draw(uints))) return \[sorted(ints) for ints in pairs\] @given( dataframes( cols\=\[\ column("colx", strategy\=uint8\_pairs()),\ column("coly", strategy\=uint8\_pairs()),\ column("colz", strategy\=uint8\_pairs()),\ \], min\_size\=3, max\_size\=3, ) ) def test\_miscellaneous(df: pl.DataFrame): ... \# Example frame: \# ┌─────────────────────────┬─────────────────────────┬──────────────────────────┐ \# │ colx ┆ coly ┆ colz │ \# │ --- ┆ --- ┆ --- │ \# │ list\[list\[i64\]\] ┆ list\[list\[i64\]\] ┆ list\[list\[i64\]\] │ \# ╞═════════════════════════╪═════════════════════════╪══════════════════════════╡ \# │ \[\[143, 235\], \[75, 101\]\] ┆ \[\[143, 235\], \[75, 101\]\] ┆ \[\[31, 41\], \[57, 250\]\] │ \# │ \[\[87, 186\], \[174, 179\]\] ┆ \[\[87, 186\], \[174, 179\]\] ┆ \[\[112, 213\], \[149, 221\]\] │ \# │ \[\[23, 85\], \[7, 86\]\] ┆ \[\[23, 85\], \[7, 86\]\] ┆ \[\[22, 255\], \[27, 28\]\] │ \# └─────────────────────────┴─────────────────────────┴──────────────────────────┘ On this page --- # List of all items in this crate [All](https://docs.pola.rs/api/rust/dev/polars/all.html#) ---------------------------------------------------------- List of all items ================= ### Structs * [chunked\_array::ChunkedArray](https://docs.pola.rs/api/rust/dev/polars/chunked_array/struct.ChunkedArray.html) * [chunked\_array::builder::AnonymousListBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.AnonymousListBuilder.html) * [chunked\_array::builder::AnonymousOwnedListBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.AnonymousOwnedListBuilder.html) * [chunked\_array::builder::BinViewChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.BinViewChunkedBuilder.html) * [chunked\_array::builder::BooleanChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.BooleanChunkedBuilder.html) * [chunked\_array::builder::CategoricalChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.CategoricalChunkedBuilder.html) * [chunked\_array::builder::ListBinaryChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.ListBinaryChunkedBuilder.html) * [chunked\_array::builder::ListBooleanChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.ListBooleanChunkedBuilder.html) * [chunked\_array::builder::ListNullChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.ListNullChunkedBuilder.html) * [chunked\_array::builder::ListPrimitiveChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.ListPrimitiveChunkedBuilder.html) * [chunked\_array::builder::ListStringChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.ListStringChunkedBuilder.html) * [chunked\_array::builder::NullChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.NullChunkedBuilder.html) * [chunked\_array::builder::PrimitiveChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/struct.PrimitiveChunkedBuilder.html) * [chunked\_array::builder::categorical::CategoricalChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/categorical/struct.CategoricalChunkedBuilder.html) * [chunked\_array::builder::list::AnonymousListBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/list/struct.AnonymousListBuilder.html) * [chunked\_array::builder::list::AnonymousOwnedListBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/list/struct.AnonymousOwnedListBuilder.html) * [chunked\_array::builder::list::ListBinaryChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/list/struct.ListBinaryChunkedBuilder.html) * [chunked\_array::builder::list::ListBooleanChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/list/struct.ListBooleanChunkedBuilder.html) * [chunked\_array::builder::list::ListNullChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/list/struct.ListNullChunkedBuilder.html) * [chunked\_array::builder::list::ListPrimitiveChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/list/struct.ListPrimitiveChunkedBuilder.html) * [chunked\_array::builder::list::ListStringChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/list/struct.ListStringChunkedBuilder.html) * [chunked\_array::flags::StatisticsFlags](https://docs.pola.rs/api/rust/dev/polars/chunked_array/flags/struct.StatisticsFlags.html) * [chunked\_array::flags::StatisticsFlagsIM](https://docs.pola.rs/api/rust/dev/polars/chunked_array/flags/struct.StatisticsFlagsIM.html) * [chunked\_array::iterator::BoolIterNoNull](https://docs.pola.rs/api/rust/dev/polars/chunked_array/iterator/struct.BoolIterNoNull.html) * [chunked\_array::iterator::FixedSizeListIterNoNull](https://docs.pola.rs/api/rust/dev/polars/chunked_array/iterator/struct.FixedSizeListIterNoNull.html) * [chunked\_array::iterator::SomeIterator](https://docs.pola.rs/api/rust/dev/polars/chunked_array/iterator/struct.SomeIterator.html) * [chunked\_array::object::ObjectArray](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/struct.ObjectArray.html) * [chunked\_array::object::builder::ObjectChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/builder/struct.ObjectChunkedBuilder.html) * [chunked\_array::object::registry::ObjectRegistry](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/struct.ObjectRegistry.html) * [chunked\_array::ops::ExplodeOptions](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/struct.ExplodeOptions.html) * [chunked\_array::ops::SortMultipleOptions](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/struct.SortMultipleOptions.html) * [chunked\_array::ops::SortOptions](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/struct.SortOptions.html) * [chunked\_array::ops::sort::options::SortMultipleOptions](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/sort/options/struct.SortMultipleOptions.html) * [chunked\_array::ops::sort::options::SortOptions](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/sort/options/struct.SortOptions.html) * [datatypes::BinaryOffsetType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.BinaryOffsetType.html) * [datatypes::BinaryType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.BinaryType.html) * [datatypes::BooleanType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.BooleanType.html) * [datatypes::Categorical16Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Categorical16Type.html) * [datatypes::Categorical32Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Categorical32Type.html) * [datatypes::Categorical8Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Categorical8Type.html) * [datatypes::CategoricalMapping](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.CategoricalMapping.html) * [datatypes::CategoricalType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.CategoricalType.html) * [datatypes::Categories](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Categories.html) * [datatypes::CompatLevel](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.CompatLevel.html) * [datatypes::DateType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.DateType.html) * [datatypes::DatetimeType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.DatetimeType.html) * [datatypes::DecimalType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.DecimalType.html) * [datatypes::Dimension](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Dimension.html) * [datatypes::DurationType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.DurationType.html) * [datatypes::FalseT](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.FalseT.html) * [datatypes::Field](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Field.html) * [datatypes::FixedSizeListType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.FixedSizeListType.html) * [datatypes::Float16Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Float16Type.html) * [datatypes::Float32Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Float32Type.html) * [datatypes::Float64Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Float64Type.html) * [datatypes::FrozenCategories](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.FrozenCategories.html) * [datatypes::Int128Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Int128Type.html) * [datatypes::Int16Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Int16Type.html) * [datatypes::Int32Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Int32Type.html) * [datatypes::Int64Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Int64Type.html) * [datatypes::Int8Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Int8Type.html) * [datatypes::ListType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.ListType.html) * [datatypes::Logical](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Logical.html) * [datatypes::ObjectType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.ObjectType.html) * [datatypes::OwnedObject](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.OwnedObject.html) * [datatypes::PlSmallStr](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.PlSmallStr.html) * [datatypes::StringType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.StringType.html) * [datatypes::StructType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.StructType.html) * [datatypes::TimeType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.TimeType.html) * [datatypes::TimeZone](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.TimeZone.html) * [datatypes::TrueT](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.TrueT.html) * [datatypes::UInt128Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.UInt128Type.html) * [datatypes::UInt16Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.UInt16Type.html) * [datatypes::UInt32Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.UInt32Type.html) * [datatypes::UInt64Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.UInt64Type.html) * [datatypes::UInt8Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.UInt8Type.html) * [datatypes::time\_zone::TimeZone](https://docs.pola.rs/api/rust/dev/polars/datatypes/time_zone/struct.TimeZone.html) * [error::ErrString](https://docs.pola.rs/api/rust/dev/polars/error/struct.ErrString.html) * [error::signals::KeyboardInterrupt](https://docs.pola.rs/api/rust/dev/polars/error/signals/struct.KeyboardInterrupt.html) * [frame::DataFrame](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html) * [frame::PhysRecordBatchIter](https://docs.pola.rs/api/rust/dev/polars/frame/struct.PhysRecordBatchIter.html) * [frame::RecordBatchIter](https://docs.pola.rs/api/rust/dev/polars/frame/struct.RecordBatchIter.html) * [frame::builder::DataFrameBuilder](https://docs.pola.rs/api/rust/dev/polars/frame/builder/struct.DataFrameBuilder.html) * [frame::column::ScalarColumn](https://docs.pola.rs/api/rust/dev/polars/frame/column/struct.ScalarColumn.html) * [frame::explode::UnpivotArgsIR](https://docs.pola.rs/api/rust/dev/polars/frame/explode/struct.UnpivotArgsIR.html) * [frame::group\_by::GroupBy](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/struct.GroupBy.html) * [frame::group\_by::GroupPositions](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/struct.GroupPositions.html) * [frame::group\_by::GroupsIdx](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/struct.GroupsIdx.html) * [frame::group\_by::GroupsTypeIter](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/struct.GroupsTypeIter.html) * [frame::group\_by::GroupsTypeParIter](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/struct.GroupsTypeParIter.html) * [frame::row::Row](https://docs.pola.rs/api/rust/dev/polars/frame/row/struct.Row.html) * [prelude::AnonymousScanArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.AnonymousScanArgs.html) * [prelude::AnonymousScanOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.AnonymousScanOptions.html) * [prelude::Arc](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Arc.html) * [prelude::ArrayNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ArrayNameSpace.html) * [prelude::ArrowField](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ArrowField.html) * [prelude::AsOfOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.AsOfOptions.html) * [prelude::BaseColumnUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BaseColumnUdf.html) * [prelude::BinaryOffsetType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BinaryOffsetType.html) * [prelude::BinaryType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BinaryType.html) * [prelude::BooleanChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BooleanChunkedBuilder.html) * [prelude::BooleanType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BooleanType.html) * [prelude::Bounds](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Bounds.html) * [prelude::BoundsIter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BoundsIter.html) * [prelude::CallbackSinkType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CallbackSinkType.html) * [prelude::CastColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CastColumnsPolicy.html) * [prelude::Categorical16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Categorical16Type.html) * [prelude::Categorical32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Categorical32Type.html) * [prelude::Categorical8Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Categorical8Type.html) * [prelude::CategoricalMapping](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CategoricalMapping.html) * [prelude::CategoricalNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CategoricalNameSpace.html) * [prelude::CategoricalType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CategoricalType.html) * [prelude::Categories](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Categories.html) * [prelude::ChainedThen](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChainedThen.html) * [prelude::ChainedWhen](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChainedWhen.html) * [prelude::ChunkId](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkId.html) * [prelude::ChunkedArray](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html) * [prelude::CollectBatches](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CollectBatches.html) * [prelude::CompatLevel](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CompatLevel.html) * [prelude::CrossJoinOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CrossJoinOptions.html) * [prelude::CsvParseOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvParseOptions.html) * [prelude::CsvReadOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReadOptions.html) * [prelude::CsvReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReader.html) * [prelude::CsvSerializer](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvSerializer.html) * [prelude::CsvWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvWriter.html) * [prelude::CsvWriterOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvWriterOptions.html) * [prelude::DataFrame](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html) * [prelude::DateType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DateType.html) * [prelude::DatetimeArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DatetimeArgs.html) * [prelude::DatetimeType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DatetimeType.html) * [prelude::DecimalType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DecimalType.html) * [prelude::Dimension](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Dimension.html) * [prelude::DistinctOptionsDSL](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DistinctOptionsDSL.html) * [prelude::DslBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DslBuilder.html) * [prelude::Duration](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Duration.html) * [prelude::DurationArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DurationArgs.html) * [prelude::DurationType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DurationType.html) * [prelude::DynamicGroupOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DynamicGroupOptions.html) * [prelude::ExplodeOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ExplodeOptions.html) * [prelude::ExprNameNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ExprNameNameSpace.html) * [prelude::FalseT](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FalseT.html) * [prelude::Field](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Field.html) * [prelude::FileMetadata](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FileMetadata.html) * [prelude::FileSinkOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FileSinkOptions.html) * [prelude::FixedSizeListType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FixedSizeListType.html) * [prelude::Float16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Float16Type.html) * [prelude::Float32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Float32Type.html) * [prelude::Float64Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Float64Type.html) * [prelude::FrozenCategories](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FrozenCategories.html) * [prelude::GroupBy](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupBy.html) * [prelude::GroupByDynamicWindower](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupByDynamicWindower.html) * [prelude::GroupPositions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupPositions.html) * [prelude::GroupbyOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupbyOptions.html) * [prelude::GroupsIdx](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupsIdx.html) * [prelude::GroupsTypeIter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupsTypeIter.html) * [prelude::GroupsTypeParIter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupsTypeParIter.html) * [prelude::HConcatOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.HConcatOptions.html) * [prelude::HiveOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.HiveOptions.html) * [prelude::IEJoinOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IEJoinOptions.html) * [prelude::InProcessQuery](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.InProcessQuery.html) * [prelude::Int128Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Int128Type.html) * [prelude::Int16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Int16Type.html) * [prelude::Int32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Int32Type.html) * [prelude::Int64Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Int64Type.html) * [prelude::Int8Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Int8Type.html) * [prelude::IpcReadOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcReadOptions.html) * [prelude::IpcReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcReader.html) * [prelude::IpcReaderAsync](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcReaderAsync.html) * [prelude::IpcScanOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcScanOptions.html) * [prelude::IpcStreamReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcStreamReader.html) * [prelude::IpcStreamWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcStreamWriter.html) * [prelude::IpcStreamWriterOption](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcStreamWriterOption.html) * [prelude::IpcWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcWriter.html) * [prelude::IpcWriterOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcWriterOptions.html) * [prelude::JoinArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JoinArgs.html) * [prelude::JoinBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JoinBuilder.html) * [prelude::JoinOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JoinOptions.html) * [prelude::JoinOptionsIR](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JoinOptionsIR.html) * [prelude::JsonLineReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JsonLineReader.html) * [prelude::JsonReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JsonReader.html) * [prelude::JsonWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JsonWriter.html) * [prelude::JsonWriterOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JsonWriterOptions.html) * [prelude::LazyCsvReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyCsvReader.html) * [prelude::LazyFrame](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html) * [prelude::LazyGroupBy](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyGroupBy.html) * [prelude::LazyJsonLineReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyJsonLineReader.html) * [prelude::ListBinaryChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListBinaryChunkedBuilder.html) * [prelude::ListBooleanChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListBooleanChunkedBuilder.html) * [prelude::ListNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListNameSpace.html) * [prelude::ListPrimitiveChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListPrimitiveChunkedBuilder.html) * [prelude::ListStringChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListStringChunkedBuilder.html) * [prelude::ListType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListType.html) * [prelude::Logical](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Logical.html) * [prelude::LogicalPlanUdfOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LogicalPlanUdfOptions.html) * [prelude::MatchToSchemaPerColumn](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.MatchToSchemaPerColumn.html) * [prelude::MetadataKeyValue](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.MetadataKeyValue.html) * [prelude::NDJsonReadOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.NDJsonReadOptions.html) * [prelude::NoNull](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.NoNull.html) * [prelude::Null](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Null.html) * [prelude::NullChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.NullChunked.html) * [prelude::NullableIdxSize](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.NullableIdxSize.html) * [prelude::ObjectType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ObjectType.html) * [prelude::OptFlags](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.OptFlags.html) * [prelude::OwnedObject](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.OwnedObject.html) * [prelude::ParquetFieldOverwrites](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetFieldOverwrites.html) * [prelude::ParquetMetadataContext](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetMetadataContext.html) * [prelude::ParquetObjectStore](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetObjectStore.html) * [prelude::ParquetOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetOptions.html) * [prelude::ParquetReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetReader.html) * [prelude::ParquetWriteOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetWriteOptions.html) * [prelude::ParquetWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetWriter.html) * [prelude::PartitionedSinkOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PartitionedSinkOptions.html) * [prelude::PartitionedSinkOptionsIR](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PartitionedSinkOptionsIR.html) * [prelude::PlRefPath](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PlRefPath.html) * [prelude::PlSmallStr](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PlSmallStr.html) * [prelude::PlanSerializationContext](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PlanSerializationContext.html) * [prelude::PredicateFileSkip](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PredicateFileSkip.html) * [prelude::PrimitiveChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PrimitiveChunkedBuilder.html) * [prelude::RankOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RankOptions.html) * [prelude::RollingCovOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingCovOptions.html) * [prelude::RollingGroupOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingGroupOptions.html) * [prelude::RollingOptionsDynamicWindow](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingOptionsDynamicWindow.html) * [prelude::RollingOptionsFixedWindow](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingOptionsFixedWindow.html) * [prelude::RollingVarParams](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingVarParams.html) * [prelude::RollingWindower](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingWindower.html) * [prelude::RowEncodingOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RowEncodingOptions.html) * [prelude::RowIndex](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RowIndex.html) * [prelude::Scalar](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Scalar.html) * [prelude::ScanArgsAnonymous](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ScanArgsAnonymous.html) * [prelude::ScanArgsParquet](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ScanArgsParquet.html) * [prelude::ScanFlags](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ScanFlags.html) * [prelude::ScanSourceIter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ScanSourceIter.html) * [prelude::SerializeOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SerializeOptions.html) * [prelude::Series](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html) * [prelude::SortMultipleOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SortMultipleOptions.html) * [prelude::SortOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SortOptions.html) * [prelude::SpecialEq](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SpecialEq.html) * [prelude::SplitLines](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SplitLines.html) * [prelude::SplitNChars](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SplitNChars.html) * [prelude::StatisticsOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StatisticsOptions.html) * [prelude::StringType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StringType.html) * [prelude::StrptimeOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StrptimeOptions.html) * [prelude::StructArray](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StructArray.html) * [prelude::StructNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StructNameSpace.html) * [prelude::StructType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StructType.html) * [prelude::TableStatistics](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.TableStatistics.html) * [prelude::Then](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Then.html) * [prelude::TimeType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.TimeType.html) * [prelude::TimeUnitSet](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.TimeUnitSet.html) * [prelude::TimeZone](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.TimeZone.html) * [prelude::TrueT](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.TrueT.html) * [prelude::UInt128Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UInt128Type.html) * [prelude::UInt16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UInt16Type.html) * [prelude::UInt32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UInt32Type.html) * [prelude::UInt64Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UInt64Type.html) * [prelude::UInt8Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UInt8Type.html) * [prelude::UnifiedScanArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnifiedScanArgs.html) * [prelude::UnifiedSinkArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnifiedSinkArgs.html) * [prelude::UnionArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnionArgs.html) * [prelude::UnionOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnionOptions.html) * [prelude::UnpivotArgsDSL](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnpivotArgsDSL.html) * [prelude::UnpivotArgsIR](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnpivotArgsIR.html) * [prelude::UserDefinedFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UserDefinedFunction.html) * [prelude::When](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.When.html) * [prelude::Window](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Window.html) * [prelude::\_csv\_read\_internal::CountLines](https://docs.pola.rs/api/rust/dev/polars/prelude/_csv_read_internal/struct.CountLines.html) * [prelude::\_csv\_read\_internal::SplitLines](https://docs.pola.rs/api/rust/dev/polars/prelude/_csv_read_internal/struct.SplitLines.html) * [prelude::anonymous::BaseColumnUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/struct.BaseColumnUdf.html) * [prelude::anonymous::SpecialEq](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/struct.SpecialEq.html) * [prelude::binary::BinaryNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/binary/struct.BinaryNameSpace.html) * [prelude::buffer::CategoricalField](https://docs.pola.rs/api/rust/dev/polars/prelude/buffer/struct.CategoricalField.html) * [prelude::buffer::DatetimeField](https://docs.pola.rs/api/rust/dev/polars/prelude/buffer/struct.DatetimeField.html) * [prelude::buffer::DecimalField](https://docs.pola.rs/api/rust/dev/polars/prelude/buffer/struct.DecimalField.html) * [prelude::buffer::Utf8Field](https://docs.pola.rs/api/rust/dev/polars/prelude/buffer/struct.Utf8Field.html) * [prelude::byte\_source::MemSliceByteSource](https://docs.pola.rs/api/rust/dev/polars/prelude/byte_source/struct.MemSliceByteSource.html) * [prelude::byte\_source::ObjectStoreByteSource](https://docs.pola.rs/api/rust/dev/polars/prelude/byte_source/struct.ObjectStoreByteSource.html) * [prelude::cat::CategoricalNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/cat/struct.CategoricalNameSpace.html) * [prelude::chunkedarray::RollingOptionsDynamicWindow](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/struct.RollingOptionsDynamicWindow.html) * [prelude::chunkedarray::string::infer::DatetimeInfer](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/string/infer/struct.DatetimeInfer.html) * [prelude::cloud::BlockingCloudWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/struct.BlockingCloudWriter.html) * [prelude::cloud::CloudLocation](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/struct.CloudLocation.html) * [prelude::cloud::CloudOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/struct.CloudOptions.html) * [prelude::cloud::PolarsObjectStore](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/struct.PolarsObjectStore.html) * [prelude::cloud::credential\_provider::CredentialProviderFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/credential_provider/struct.CredentialProviderFunction.html) * [prelude::cloud::options::CloudOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/options/struct.CloudOptions.html) * [prelude::datatypes::BinaryOffsetType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.BinaryOffsetType.html) * [prelude::datatypes::BinaryType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.BinaryType.html) * [prelude::datatypes::BooleanType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.BooleanType.html) * [prelude::datatypes::Categorical16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Categorical16Type.html) * [prelude::datatypes::Categorical32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Categorical32Type.html) * [prelude::datatypes::Categorical8Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Categorical8Type.html) * [prelude::datatypes::CategoricalMapping](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.CategoricalMapping.html) * [prelude::datatypes::CategoricalType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.CategoricalType.html) * [prelude::datatypes::Categories](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Categories.html) * [prelude::datatypes::CompatLevel](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.CompatLevel.html) * [prelude::datatypes::DateType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.DateType.html) * [prelude::datatypes::DatetimeType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.DatetimeType.html) * [prelude::datatypes::DecimalType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.DecimalType.html) * [prelude::datatypes::Dimension](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Dimension.html) * [prelude::datatypes::DurationType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.DurationType.html) * [prelude::datatypes::FalseT](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.FalseT.html) * [prelude::datatypes::Field](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Field.html) * [prelude::datatypes::FixedSizeListType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.FixedSizeListType.html) * [prelude::datatypes::Float16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Float16Type.html) * [prelude::datatypes::Float32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Float32Type.html) * [prelude::datatypes::Float64Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Float64Type.html) * [prelude::datatypes::FrozenCategories](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.FrozenCategories.html) * [prelude::datatypes::Int128Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Int128Type.html) * [prelude::datatypes::Int16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Int16Type.html) * [prelude::datatypes::Int32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Int32Type.html) * [prelude::datatypes::Int64Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Int64Type.html) * [prelude::datatypes::Int8Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Int8Type.html) * [prelude::datatypes::ListType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.ListType.html) * [prelude::datatypes::Logical](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.Logical.html) * [prelude::datatypes::ObjectType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.ObjectType.html) * [prelude::datatypes::OwnedObject](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.OwnedObject.html) * [prelude::datatypes::PlSmallStr](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.PlSmallStr.html) * [prelude::datatypes::StringType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.StringType.html) * [prelude::datatypes::StructType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.StructType.html) * [prelude::datatypes::TimeType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.TimeType.html) * [prelude::datatypes::TimeZone](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.TimeZone.html) * [prelude::datatypes::TrueT](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.TrueT.html) * [prelude::datatypes::UInt128Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.UInt128Type.html) * [prelude::datatypes::UInt16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.UInt16Type.html) * [prelude::datatypes::UInt32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.UInt32Type.html) * [prelude::datatypes::UInt64Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.UInt64Type.html) * [prelude::datatypes::UInt8Type](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/struct.UInt8Type.html) * [prelude::datatypes::time\_zone::TimeZone](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/time_zone/struct.TimeZone.html) * [prelude::default\_values::IcebergIdentityTransformedPartitionFields](https://docs.pola.rs/api/rust/dev/polars/prelude/default_values/struct.IcebergIdentityTransformedPartitionFields.html) * [prelude::dt::DateLikeNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/dt/struct.DateLikeNameSpace.html) * [prelude::file::AsyncDynWriteable](https://docs.pola.rs/api/rust/dev/polars/prelude/file/struct.AsyncDynWriteable.html) * [prelude::file\_provider::FileProviderArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/file_provider/struct.FileProviderArgs.html) * [prelude::file\_provider::HivePathProvider](https://docs.pola.rs/api/rust/dev/polars/prelude/file_provider/struct.HivePathProvider.html) * [prelude::fixed\_size\_list::AnonymousBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/fixed_size_list/struct.AnonymousBuilder.html) * [prelude::iceberg::IcebergColumn](https://docs.pola.rs/api/rust/dev/polars/prelude/iceberg/struct.IcebergColumn.html) * [prelude::iceberg::IcebergSchema](https://docs.pola.rs/api/rust/dev/polars/prelude/iceberg/struct.IcebergSchema.html) * [prelude::null::MutableNullArray](https://docs.pola.rs/api/rust/dev/polars/prelude/null/struct.MutableNullArray.html) * [prelude::pf16](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.pf16.html) * [prelude::sink::CallbackSinkType](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/struct.CallbackSinkType.html) * [prelude::sink::FileSinkOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/struct.FileSinkOptions.html) * [prelude::sink::PartitionedSinkOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/struct.PartitionedSinkOptions.html) * [prelude::sink::PartitionedSinkOptionsIR](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/struct.PartitionedSinkOptionsIR.html) * [prelude::sink::UnifiedSinkArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/struct.UnifiedSinkArgs.html) * [prelude::sort::options::SortMultipleOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/sort/options/struct.SortMultipleOptions.html) * [prelude::sort::options::SortOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/sort/options/struct.SortOptions.html) * [prelude::strings::SplitNChars](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/struct.SplitNChars.html) * [prelude::udf::UserDefinedFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/udf/struct.UserDefinedFunction.html) * [series::Series](https://docs.pola.rs/api/rust/dev/polars/series/struct.Series.html) * [series::SeriesIter](https://docs.pola.rs/api/rust/dev/polars/series/struct.SeriesIter.html) * [series::ToArrowConverter](https://docs.pola.rs/api/rust/dev/polars/series/struct.ToArrowConverter.html) * [series::amortized\_iter::AmortSeries](https://docs.pola.rs/api/rust/dev/polars/series/amortized_iter/struct.AmortSeries.html) * [series::arithmetic::NumericFixedSizeListOp](https://docs.pola.rs/api/rust/dev/polars/series/arithmetic/struct.NumericFixedSizeListOp.html) * [series::arithmetic::NumericListOp](https://docs.pola.rs/api/rust/dev/polars/series/arithmetic/struct.NumericListOp.html) * [series::builder::SeriesBuilder](https://docs.pola.rs/api/rust/dev/polars/series/builder/struct.SeriesBuilder.html) * [series::categorical\_to\_arrow::CategoricalToArrowConverter](https://docs.pola.rs/api/rust/dev/polars/series/categorical_to_arrow/struct.CategoricalToArrowConverter.html) ### Enums * [chunked\_array::ChunkedArrayLayout](https://docs.pola.rs/api/rust/dev/polars/chunked_array/enum.ChunkedArrayLayout.html) * [chunked\_array::cast::CastOptions](https://docs.pola.rs/api/rust/dev/polars/chunked_array/cast/enum.CastOptions.html) * [chunked\_array::ops::FillNullStrategy](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/enum.FillNullStrategy.html) * [chunked\_array::ops::search\_sorted::SearchSortedSide](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/search_sorted/enum.SearchSortedSide.html) * [datatypes::AnyValue](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.AnyValue.html) * [datatypes::ArrowDataType](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.ArrowDataType.html) * [datatypes::ArrowTimeUnit](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.ArrowTimeUnit.html) * [datatypes::CategoricalPhysical](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.CategoricalPhysical.html) * [datatypes::DataType](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.DataType.html) * [datatypes::ReshapeDimension](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.ReshapeDimension.html) * [datatypes::TimeUnit](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.TimeUnit.html) * [datatypes::UnknownKind](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.UnknownKind.html) * [datatypes::time\_unit::TimeUnit](https://docs.pola.rs/api/rust/dev/polars/datatypes/time_unit/enum.TimeUnit.html) * [error::PolarsError](https://docs.pola.rs/api/rust/dev/polars/error/enum.PolarsError.html) * [error::PolarsWarning](https://docs.pola.rs/api/rust/dev/polars/error/enum.PolarsWarning.html) * [frame::RecordBatchIterWrap](https://docs.pola.rs/api/rust/dev/polars/frame/enum.RecordBatchIterWrap.html) * [frame::UniqueKeepStrategy](https://docs.pola.rs/api/rust/dev/polars/frame/enum.UniqueKeepStrategy.html) * [frame::column::Column](https://docs.pola.rs/api/rust/dev/polars/frame/column/enum.Column.html) * [frame::group\_by::GroupByMethod](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/enum.GroupByMethod.html) * [frame::group\_by::GroupsIndicator](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/enum.GroupsIndicator.html) * [frame::group\_by::GroupsType](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/enum.GroupsType.html) * [frame::row::AnyValueBuffer](https://docs.pola.rs/api/rust/dev/polars/frame/row/enum.AnyValueBuffer.html) * [frame::row::AnyValueBufferTrusted](https://docs.pola.rs/api/rust/dev/polars/frame/row/enum.AnyValueBufferTrusted.html) * [prelude::AggExpr](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.AggExpr.html) * [prelude::Ambiguous](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Ambiguous.html) * [prelude::AnyValue](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.AnyValue.html) * [prelude::ArrayDataTypeFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ArrayDataTypeFunction.html) * [prelude::ArrayFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ArrayFunction.html) * [prelude::ArrowDataType](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ArrowDataType.html) * [prelude::ArrowTimeUnit](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ArrowTimeUnit.html) * [prelude::AsofStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.AsofStrategy.html) * [prelude::BinaryFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.BinaryFunction.html) * [prelude::BitwiseFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.BitwiseFunction.html) * [prelude::BooleanFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.BooleanFunction.html) * [prelude::CategoricalFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CategoricalFunction.html) * [prelude::CategoricalPhysical](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CategoricalPhysical.html) * [prelude::ChildFieldOverwrites](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ChildFieldOverwrites.html) * [prelude::ClosedInterval](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ClosedInterval.html) * [prelude::ClosedWindow](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ClosedWindow.html) * [prelude::CloudScheme](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CloudScheme.html) * [prelude::Column](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Column.html) * [prelude::ColumnMapping](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ColumnMapping.html) * [prelude::CommentPrefix](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CommentPrefix.html) * [prelude::CsvCompression](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CsvCompression.html) * [prelude::CsvEncoding](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CsvEncoding.html) * [prelude::DataType](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataType.html) * [prelude::DataTypeExpr](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataTypeExpr.html) * [prelude::DataTypeFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataTypeFunction.html) * [prelude::DataTypeSelector](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataTypeSelector.html) * [prelude::DateRangeArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DateRangeArgs.html) * [prelude::DslPlan](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DslPlan.html) * [prelude::Engine](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Engine.html) * [prelude::EvalVariant](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.EvalVariant.html) * [prelude::Excluded](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Excluded.html) * [prelude::Expr](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html) * [prelude::ExtraColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ExtraColumnsPolicy.html) * [prelude::FileScanDsl](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.FileScanDsl.html) * [prelude::FileScanIR](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.FileScanIR.html) * [prelude::FileWriteFormat](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.FileWriteFormat.html) * [prelude::FillNullStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.FillNullStrategy.html) * [prelude::FunctionExpr](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.FunctionExpr.html) * [prelude::GroupByMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.GroupByMethod.html) * [prelude::GroupsIndicator](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.GroupsIndicator.html) * [prelude::GroupsType](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.GroupsType.html) * [prelude::IndexOrder](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.IndexOrder.html) * [prelude::InequalityOperator](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.InequalityOperator.html) * [prelude::InterpolationMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.InterpolationMethod.html) * [prelude::IpcCompression](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.IpcCompression.html) * [prelude::JoinCoalesce](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JoinCoalesce.html) * [prelude::JoinType](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JoinType.html) * [prelude::JoinTypeOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JoinTypeOptions.html) * [prelude::JoinTypeOptionsIR](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JoinTypeOptionsIR.html) * [prelude::JoinValidation](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JoinValidation.html) * [prelude::JsonFormat](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JsonFormat.html) * [prelude::KeyValueMetadata](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.KeyValueMetadata.html) * [prelude::Label](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Label.html) * [prelude::LazySerde](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.LazySerde.html) * [prelude::ListFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ListFunction.html) * [prelude::LiteralValue](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.LiteralValue.html) * [prelude::MaintainOrderJoin](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.MaintainOrderJoin.html) * [prelude::MissingColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.MissingColumnsPolicy.html) * [prelude::MissingColumnsPolicyOrExpr](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.MissingColumnsPolicyOrExpr.html) * [prelude::NonExistent](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.NonExistent.html) * [prelude::NullStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.NullStrategy.html) * [prelude::NullValues](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.NullValues.html) * [prelude::Operator](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Operator.html) * [prelude::ParallelStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ParallelStrategy.html) * [prelude::ParquetCompression](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ParquetCompression.html) * [prelude::ParquetStatistics](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ParquetStatistics.html) * [prelude::PartitionStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.PartitionStrategy.html) * [prelude::PartitionStrategyIR](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.PartitionStrategyIR.html) * [prelude::PlanCallback](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.PlanCallback.html) * [prelude::PolarsError](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.PolarsError.html) * [prelude::PowFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.PowFunction.html) * [prelude::QuantileMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.QuantileMethod.html) * [prelude::QuoteStyle](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.QuoteStyle.html) * [prelude::RandomMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RandomMethod.html) * [prelude::RangeFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RangeFunction.html) * [prelude::RankMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RankMethod.html) * [prelude::RenameAliasFn](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RenameAliasFn.html) * [prelude::ReshapeDimension](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ReshapeDimension.html) * [prelude::RollingFnParams](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RollingFnParams.html) * [prelude::RollingFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RollingFunction.html) * [prelude::RollingFunctionBy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RollingFunctionBy.html) * [prelude::RollingRankMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RollingRankMethod.html) * [prelude::RoundMode](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RoundMode.html) * [prelude::ScanSource](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ScanSource.html) * [prelude::ScanSourceRef](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ScanSourceRef.html) * [prelude::ScanSources](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ScanSources.html) * [prelude::SearchSortedSide](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.SearchSortedSide.html) * [prelude::Selector](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Selector.html) * [prelude::SinkDestination](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.SinkDestination.html) * [prelude::SinkTarget](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.SinkTarget.html) * [prelude::SinkType](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.SinkType.html) * [prelude::SinkTypeIR](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.SinkTypeIR.html) * [prelude::StartBy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.StartBy.html) * [prelude::StringFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.StringFunction.html) * [prelude::StructDataTypeFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.StructDataTypeFunction.html) * [prelude::StructFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.StructFunction.html) * [prelude::TemporalFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.TemporalFunction.html) * [prelude::TimeUnit](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.TimeUnit.html) * [prelude::TimeZoneSet](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.TimeZoneSet.html) * [prelude::UniqueKeepStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.UniqueKeepStrategy.html) * [prelude::UnknownKind](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.UnknownKind.html) * [prelude::UpcastOrForbid](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.UpcastOrForbid.html) * [prelude::WindowMapping](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.WindowMapping.html) * [prelude::\_csv\_read\_internal::CommentPrefix](https://docs.pola.rs/api/rust/dev/polars/prelude/_csv_read_internal/enum.CommentPrefix.html) * [prelude::\_csv\_read\_internal::NullValuesCompiled](https://docs.pola.rs/api/rust/dev/polars/prelude/_csv_read_internal/enum.NullValuesCompiled.html) * [prelude::\_internal::PrefilterMaskSetting](https://docs.pola.rs/api/rust/dev/polars/prelude/_internal/enum.PrefilterMaskSetting.html) * [prelude::buffer::Buffer](https://docs.pola.rs/api/rust/dev/polars/prelude/buffer/enum.Buffer.html) * [prelude::byte\_source::DynByteSource](https://docs.pola.rs/api/rust/dev/polars/prelude/byte_source/enum.DynByteSource.html) * [prelude::byte\_source::DynByteSourceBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/byte_source/enum.DynByteSourceBuilder.html) * [prelude::chunkedarray::string::Pattern](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/string/enum.Pattern.html) * [prelude::cloud::CloudType](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/enum.CloudType.html) * [prelude::cloud::credential\_provider::ObjectStoreCredential](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/credential_provider/enum.ObjectStoreCredential.html) * [prelude::cloud::credential\_provider::PlCredentialProvider](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/credential_provider/enum.PlCredentialProvider.html) * [prelude::cloud::options::CloudType](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/options/enum.CloudType.html) * [prelude::compression::CompressedReader](https://docs.pola.rs/api/rust/dev/polars/prelude/compression/enum.CompressedReader.html) * [prelude::compression::CompressedWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/compression/enum.CompressedWriter.html) * [prelude::compression::SupportedCompression](https://docs.pola.rs/api/rust/dev/polars/prelude/compression/enum.SupportedCompression.html) * [prelude::datatypes::AnyValue](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/enum.AnyValue.html) * [prelude::datatypes::ArrowDataType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/enum.ArrowDataType.html) * [prelude::datatypes::ArrowTimeUnit](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/enum.ArrowTimeUnit.html) * [prelude::datatypes::CategoricalPhysical](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/enum.CategoricalPhysical.html) * [prelude::datatypes::DataType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/enum.DataType.html) * [prelude::datatypes::ReshapeDimension](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/enum.ReshapeDimension.html) * [prelude::datatypes::TimeUnit](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/enum.TimeUnit.html) * [prelude::datatypes::UnknownKind](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/enum.UnknownKind.html) * [prelude::datatypes::time\_unit::TimeUnit](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/time_unit/enum.TimeUnit.html) * [prelude::default\_values::DefaultFieldValues](https://docs.pola.rs/api/rust/dev/polars/prelude/default_values/enum.DefaultFieldValues.html) * [prelude::deletion::DeletionFilesList](https://docs.pola.rs/api/rust/dev/polars/prelude/deletion/enum.DeletionFilesList.html) * [prelude::file::AsyncWriteable](https://docs.pola.rs/api/rust/dev/polars/prelude/file/enum.AsyncWriteable.html) * [prelude::file::BufferedWriteable](https://docs.pola.rs/api/rust/dev/polars/prelude/file/enum.BufferedWriteable.html) * [prelude::file::Writeable](https://docs.pola.rs/api/rust/dev/polars/prelude/file/enum.Writeable.html) * [prelude::file\_provider::FileProviderReturn](https://docs.pola.rs/api/rust/dev/polars/prelude/file_provider/enum.FileProviderReturn.html) * [prelude::file\_provider::FileProviderType](https://docs.pola.rs/api/rust/dev/polars/prelude/file_provider/enum.FileProviderType.html) * [prelude::function\_expr::ArrayFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.ArrayFunction.html) * [prelude::function\_expr::BinaryFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.BinaryFunction.html) * [prelude::function\_expr::BitwiseFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.BitwiseFunction.html) * [prelude::function\_expr::BooleanFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.BooleanFunction.html) * [prelude::function\_expr::CategoricalFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.CategoricalFunction.html) * [prelude::function\_expr::DateRangeArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.DateRangeArgs.html) * [prelude::function\_expr::FunctionExpr](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.FunctionExpr.html) * [prelude::function\_expr::ListFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.ListFunction.html) * [prelude::function\_expr::PowFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.PowFunction.html) * [prelude::function\_expr::RandomMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.RandomMethod.html) * [prelude::function\_expr::RangeFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.RangeFunction.html) * [prelude::function\_expr::ReshapeDimension](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.ReshapeDimension.html) * [prelude::function\_expr::RollingFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.RollingFunction.html) * [prelude::function\_expr::RollingFunctionBy](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.RollingFunctionBy.html) * [prelude::function\_expr::StringFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.StringFunction.html) * [prelude::function\_expr::StructFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.StructFunction.html) * [prelude::function\_expr::TemporalFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/enum.TemporalFunction.html) * [prelude::iceberg::IcebergColumnType](https://docs.pola.rs/api/rust/dev/polars/prelude/iceberg/enum.IcebergColumnType.html) * [prelude::interpolate::InterpolationMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/interpolate/enum.InterpolationMethod.html) * [prelude::round::RoundMode](https://docs.pola.rs/api/rust/dev/polars/prelude/round/enum.RoundMode.html) * [prelude::search\_sorted::SearchSortedSide](https://docs.pola.rs/api/rust/dev/polars/prelude/search_sorted/enum.SearchSortedSide.html) * [prelude::sink::PartitionStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/enum.PartitionStrategy.html) * [prelude::sink::PartitionStrategyIR](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/enum.PartitionStrategyIR.html) * [prelude::sink::SinkDestination](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/enum.SinkDestination.html) * [prelude::sink::SinkTarget](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/enum.SinkTarget.html) * [prelude::sink::SinkType](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/enum.SinkType.html) * [prelude::sink::SinkTypeIR](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/enum.SinkTypeIR.html) * [prelude::sync\_on\_close::SyncOnCloseType](https://docs.pola.rs/api/rust/dev/polars/prelude/sync_on_close/enum.SyncOnCloseType.html) * [series::BitRepr](https://docs.pola.rs/api/rust/dev/polars/series/enum.BitRepr.html) * [series::IsSorted](https://docs.pola.rs/api/rust/dev/polars/series/enum.IsSorted.html) * [series::categorical\_to\_arrow::CategoricalArrayToArrowConverter](https://docs.pola.rs/api/rust/dev/polars/series/categorical_to_arrow/enum.CategoricalArrayToArrowConverter.html) * [series::categorical\_to\_arrow::CategoricalKeyRemap](https://docs.pola.rs/api/rust/dev/polars/series/categorical_to_arrow/enum.CategoricalKeyRemap.html) * [series::ops::NullBehavior](https://docs.pola.rs/api/rust/dev/polars/series/ops/enum.NullBehavior.html) ### Traits * [chunked\_array::arithmetic::ArithmeticChunked](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arithmetic/trait.ArithmeticChunked.html) * [chunked\_array::builder::ChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/trait.ChunkedBuilder.html) * [chunked\_array::builder::ListBuilderTrait](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/trait.ListBuilderTrait.html) * [chunked\_array::builder::NewChunkedArray](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/trait.NewChunkedArray.html) * [chunked\_array::builder::list::ListBuilderTrait](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/list/trait.ListBuilderTrait.html) * [chunked\_array::collect::ChunkedCollectInferIterExt](https://docs.pola.rs/api/rust/dev/polars/chunked_array/collect/trait.ChunkedCollectInferIterExt.html) * [chunked\_array::collect::ChunkedCollectIterExt](https://docs.pola.rs/api/rust/dev/polars/chunked_array/collect/trait.ChunkedCollectIterExt.html) * [chunked\_array::float::Canonical](https://docs.pola.rs/api/rust/dev/polars/chunked_array/float/trait.Canonical.html) * [chunked\_array::from\_iterator\_par::ChunkedCollectParIterExt](https://docs.pola.rs/api/rust/dev/polars/chunked_array/from_iterator_par/trait.ChunkedCollectParIterExt.html) * [chunked\_array::from\_iterator\_par::FromParIterWithDtype](https://docs.pola.rs/api/rust/dev/polars/chunked_array/from_iterator_par/trait.FromParIterWithDtype.html) * [chunked\_array::iterator::PolarsIterator](https://docs.pola.rs/api/rust/dev/polars/chunked_array/iterator/trait.PolarsIterator.html) * [chunked\_array::object::PolarsObject](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/trait.PolarsObject.html) * [chunked\_array::object::PolarsObjectSafe](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/trait.PolarsObjectSafe.html) * [chunked\_array::object::registry::AnonymousObjectBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/trait.AnonymousObjectBuilder.html) * [chunked\_array::ops::ChunkAgg](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkAgg.html) * [chunked\_array::ops::ChunkAnyValue](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkAnyValue.html) * [chunked\_array::ops::ChunkAnyValueBypassValidity](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkAnyValueBypassValidity.html) * [chunked\_array::ops::ChunkApply](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkApply.html) * [chunked\_array::ops::ChunkApplyKernel](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkApplyKernel.html) * [chunked\_array::ops::ChunkApproxNUnique](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkApproxNUnique.html) * [chunked\_array::ops::ChunkBitwiseReduce](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkBitwiseReduce.html) * [chunked\_array::ops::ChunkBytes](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkBytes.html) * [chunked\_array::ops::ChunkCast](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkCast.html) * [chunked\_array::ops::ChunkCompareEq](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkCompareEq.html) * [chunked\_array::ops::ChunkCompareIneq](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkCompareIneq.html) * [chunked\_array::ops::ChunkExpandAtIndex](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkExpandAtIndex.html) * [chunked\_array::ops::ChunkExplode](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkExplode.html) * [chunked\_array::ops::ChunkFillNullValue](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkFillNullValue.html) * [chunked\_array::ops::ChunkFilter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkFilter.html) * [chunked\_array::ops::ChunkFull](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkFull.html) * [chunked\_array::ops::ChunkFullNull](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkFullNull.html) * [chunked\_array::ops::ChunkNestingUtils](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkNestingUtils.html) * [chunked\_array::ops::ChunkQuantile](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkQuantile.html) * [chunked\_array::ops::ChunkReverse](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkReverse.html) * [chunked\_array::ops::ChunkRollApply](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkRollApply.html) * [chunked\_array::ops::ChunkSet](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkSet.html) * [chunked\_array::ops::ChunkShift](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkShift.html) * [chunked\_array::ops::ChunkShiftFill](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkShiftFill.html) * [chunked\_array::ops::ChunkSort](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkSort.html) * [chunked\_array::ops::ChunkTake](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkTake.html) * [chunked\_array::ops::ChunkTakeUnchecked](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkTakeUnchecked.html) * [chunked\_array::ops::ChunkUnique](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkUnique.html) * [chunked\_array::ops::ChunkVar](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkVar.html) * [chunked\_array::ops::ChunkZip](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.ChunkZip.html) * [chunked\_array::ops::IsFirstDistinct](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.IsFirstDistinct.html) * [chunked\_array::ops::IsLastDistinct](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.IsLastDistinct.html) * [chunked\_array::ops::Reinterpret](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.Reinterpret.html) * [chunked\_array::ops::SlicedArray](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/trait.SlicedArray.html) * [chunked\_array::ops::arity::BinaryFnMut](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/trait.BinaryFnMut.html) * [chunked\_array::ops::arity::TernaryFnMut](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/trait.TernaryFnMut.html) * [chunked\_array::ops::arity::UnaryFnMut](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/trait.UnaryFnMut.html) * [chunked\_array::ops::sort::SlicedArray](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/sort/trait.SlicedArray.html) * [chunked\_array::ops::sort::options::SlicedArray](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/sort/options/trait.SlicedArray.html) * [datatypes::ArrayCollectIterExt](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.ArrayCollectIterExt.html) * [datatypes::ArrayFromIter](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.ArrayFromIter.html) * [datatypes::ArrayFromIterDtype](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.ArrayFromIterDtype.html) * [datatypes::AsRefDataType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.AsRefDataType.html) * [datatypes::CatNative](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.CatNative.html) * [datatypes::CategoricalPhysicalDtypeExt](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.CategoricalPhysicalDtypeExt.html) * [datatypes::GetAnyValue](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.GetAnyValue.html) * [datatypes::InitHashMaps](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.InitHashMaps.html) * [datatypes::InitHashMaps2](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.InitHashMaps2.html) * [datatypes::IntoMetadata](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.IntoMetadata.html) * [datatypes::IntoScalar](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.IntoScalar.html) * [datatypes::LogicalType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.LogicalType.html) * [datatypes::MetaDataExt](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.MetaDataExt.html) * [datatypes::NumericNative](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.NumericNative.html) * [datatypes::PolarsCategoricalType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsCategoricalType.html) * [datatypes::PolarsDataType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsDataType.html) * [datatypes::PolarsFloatType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsFloatType.html) * [datatypes::PolarsIntegerType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsIntegerType.html) * [datatypes::PolarsNumericType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsNumericType.html) * [datatypes::PolarsPhysicalType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsPhysicalType.html) * [datatypes::SchemaExtPl](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.SchemaExtPl.html) * [datatypes::StaticArray](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.StaticArray.html) * [datatypes::categorical::CategoricalPhysicalDtypeExt](https://docs.pola.rs/api/rust/dev/polars/datatypes/categorical/trait.CategoricalPhysicalDtypeExt.html) * [frame::column::IntoColumn](https://docs.pola.rs/api/rust/dev/polars/frame/column/trait.IntoColumn.html) * [frame::group\_by::IntoGroupsType](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/trait.IntoGroupsType.html) * [frame::group\_by::aggregations::AggList](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/aggregations/trait.AggList.html) * [frame::group\_by::expr::PhysicalAggExpr](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/expr/trait.PhysicalAggExpr.html) * [prelude::AnonymousColumnsUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AnonymousColumnsUdf.html) * [prelude::AnonymousScan](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AnonymousScan.html) * [prelude::AnonymousStreamingAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AnonymousStreamingAgg.html) * [prelude::ArgAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ArgAgg.html) * [prelude::ArithmeticChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ArithmeticChunked.html) * [prelude::ArrayCollectIterExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ArrayCollectIterExt.html) * [prelude::ArrayFromIter](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ArrayFromIter.html) * [prelude::ArrayFromIterDtype](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ArrayFromIterDtype.html) * [prelude::AsBinary](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsBinary.html) * [prelude::AsList](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsList.html) * [prelude::AsRefDataType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsRefDataType.html) * [prelude::AsString](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsString.html) * [prelude::AsofJoin](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsofJoin.html) * [prelude::AsofJoinBy](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsofJoinBy.html) * [prelude::BinaryNameSpaceImpl](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.BinaryNameSpaceImpl.html) * [prelude::CatNative](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.CatNative.html) * [prelude::CategoricalPhysicalDtypeExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.CategoricalPhysicalDtypeExt.html) * [prelude::ChunkAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkAgg.html) * [prelude::ChunkAggSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkAggSeries.html) * [prelude::ChunkAnyValue](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkAnyValue.html) * [prelude::ChunkAnyValueBypassValidity](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkAnyValueBypassValidity.html) * [prelude::ChunkApply](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkApply.html) * [prelude::ChunkApplyKernel](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkApplyKernel.html) * [prelude::ChunkApproxNUnique](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkApproxNUnique.html) * [prelude::ChunkBitwiseReduce](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkBitwiseReduce.html) * [prelude::ChunkBytes](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkBytes.html) * [prelude::ChunkCast](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkCast.html) * [prelude::ChunkCompareEq](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkCompareEq.html) * [prelude::ChunkCompareIneq](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkCompareIneq.html) * [prelude::ChunkExpandAtIndex](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkExpandAtIndex.html) * [prelude::ChunkExplode](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkExplode.html) * [prelude::ChunkFillNullValue](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkFillNullValue.html) * [prelude::ChunkFilter](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkFilter.html) * [prelude::ChunkFull](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkFull.html) * [prelude::ChunkFullNull](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkFullNull.html) * [prelude::ChunkNestingUtils](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkNestingUtils.html) * [prelude::ChunkQuantile](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkQuantile.html) * [prelude::ChunkReverse](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkReverse.html) * [prelude::ChunkRollApply](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkRollApply.html) * [prelude::ChunkSet](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkSet.html) * [prelude::ChunkShift](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkShift.html) * [prelude::ChunkShiftFill](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkShiftFill.html) * [prelude::ChunkSort](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkSort.html) * [prelude::ChunkTake](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkTake.html) * [prelude::ChunkTakeUnchecked](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkTakeUnchecked.html) * [prelude::ChunkUnique](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkUnique.html) * [prelude::ChunkVar](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkVar.html) * [prelude::ChunkZip](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkZip.html) * [prelude::ChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkedBuilder.html) * [prelude::ChunkedCollectInferIterExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkedCollectInferIterExt.html) * [prelude::ChunkedCollectIterExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkedCollectIterExt.html) * [prelude::ChunkedSet](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkedSet.html) * [prelude::ColumnsUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ColumnsUdf.html) * [prelude::CrossJoin](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.CrossJoin.html) * [prelude::CrossJoinFilter](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.CrossJoinFilter.html) * [prelude::DataFrameJoinOps](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html) * [prelude::DataFrameOps](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameOps.html) * [prelude::DateMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DateMethods.html) * [prelude::DatetimeMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DatetimeMethods.html) * [prelude::DurationMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DurationMethods.html) * [prelude::FromData](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.FromData.html) * [prelude::FromDataBinary](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.FromDataBinary.html) * [prelude::FromDataUtf8](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.FromDataUtf8.html) * [prelude::GetAnyValue](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.GetAnyValue.html) * [prelude::IndexToUsize](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IndexToUsize.html) * [prelude::InitHashMaps](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.InitHashMaps.html) * [prelude::InitHashMaps2](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.InitHashMaps2.html) * [prelude::IntoColumn](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoColumn.html) * [prelude::IntoGroupsType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoGroupsType.html) * [prelude::IntoLazy](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoLazy.html) * [prelude::IntoMetadata](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoMetadata.html) * [prelude::IntoScalar](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoScalar.html) * [prelude::IntoSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoSeries.html) * [prelude::IntoVec](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoVec.html) * [prelude::IsFirstDistinct](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IsFirstDistinct.html) * [prelude::IsLastDistinct](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IsLastDistinct.html) * [prelude::JoinDispatch](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.JoinDispatch.html) * [prelude::LazyFileListReader](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.LazyFileListReader.html) * [prelude::LhsNumOps](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.LhsNumOps.html) * [prelude::ListBuilderTrait](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ListBuilderTrait.html) * [prelude::ListFromIter](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ListFromIter.html) * [prelude::ListNameSpaceImpl](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ListNameSpaceImpl.html) * [prelude::Literal](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.Literal.html) * [prelude::LogicalType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.LogicalType.html) * [prelude::MetaDataExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.MetaDataExt.html) * [prelude::MinMaxHorizontal](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.MinMaxHorizontal.html) * [prelude::MomentSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.MomentSeries.html) * [prelude::NamedFrom](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NamedFrom.html) * [prelude::NamedFromOwned](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NamedFromOwned.html) * [prelude::NewChunkedArray](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NewChunkedArray.html) * [prelude::NumOpsDispatch](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NumOpsDispatch.html) * [prelude::NumOpsDispatchChecked](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NumOpsDispatchChecked.html) * [prelude::NumericNative](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NumericNative.html) * [prelude::PolarsCategoricalType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsCategoricalType.html) * [prelude::PolarsDataType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsDataType.html) * [prelude::PolarsFloatType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsFloatType.html) * [prelude::PolarsIntegerType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsIntegerType.html) * [prelude::PolarsIterator](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsIterator.html) * [prelude::PolarsNumericType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsNumericType.html) * [prelude::PolarsObject](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsObject.html) * [prelude::PolarsPhysicalType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsPhysicalType.html) * [prelude::PolarsRound](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsRound.html) * [prelude::PolarsTemporalGroupby](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsTemporalGroupby.html) * [prelude::PolarsTruncate](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsTruncate.html) * [prelude::PolarsUpsample](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsUpsample.html) * [prelude::QuantileAggSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.QuantileAggSeries.html) * [prelude::Reinterpret](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.Reinterpret.html) * [prelude::RoundSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.RoundSeries.html) * [prelude::SchemaExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SchemaExt.html) * [prelude::SchemaExtPl](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SchemaExtPl.html) * [prelude::SchemaNamesAndDtypes](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SchemaNamesAndDtypes.html) * [prelude::SeedableFromU64SeedExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeedableFromU64SeedExt.html) * [prelude::SerReader](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SerReader.html) * [prelude::SerWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SerWriter.html) * [prelude::SeriesJoin](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesJoin.html) * [prelude::SeriesMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesMethods.html) * [prelude::SeriesOpsTime](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesOpsTime.html) * [prelude::SeriesRank](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesRank.html) * [prelude::SeriesSealed](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesSealed.html) * [prelude::SeriesTrait](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesTrait.html) * [prelude::ShrinkType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ShrinkType.html) * [prelude::SlicedArray](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SlicedArray.html) * [prelude::StaticArray](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.StaticArray.html) * [prelude::StringMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.StringMethods.html) * [prelude::StringNameSpaceImpl](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.StringNameSpaceImpl.html) * [prelude::SumMeanHorizontal](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SumMeanHorizontal.html) * [prelude::TakeChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.TakeChunked.html) * [prelude::TakeChunkedHorPar](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.TakeChunkedHorPar.html) * [prelude::TemporalMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.TemporalMethods.html) * [prelude::TimeMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.TimeMethods.html) * [prelude::ToDummies](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ToDummies.html) * [prelude::UdfSchema](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.UdfSchema.html) * [prelude::VarAggSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.VarAggSeries.html) * [prelude::VecHash](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.VecHash.html) * [prelude::aggregations::AggList](https://docs.pola.rs/api/rust/dev/polars/prelude/aggregations/trait.AggList.html) * [prelude::anonymous::AnonymousColumnsUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/trait.AnonymousColumnsUdf.html) * [prelude::anonymous::AnonymousStreamingAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/trait.AnonymousStreamingAgg.html) * [prelude::anonymous::ColumnsUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/trait.ColumnsUdf.html) * [prelude::anonymous::named\_serde::ExprRegistry](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/named_serde/trait.ExprRegistry.html) * [prelude::arg\_min\_max::ArgAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/arg_min_max/trait.ArgAgg.html) * [prelude::arity::BinaryFnMut](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/trait.BinaryFnMut.html) * [prelude::arity::TernaryFnMut](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/trait.TernaryFnMut.html) * [prelude::arity::UnaryFnMut](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/trait.UnaryFnMut.html) * [prelude::array::ArrayNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/array/trait.ArrayNameSpace.html) * [prelude::array::AsArray](https://docs.pola.rs/api/rust/dev/polars/prelude/array/trait.AsArray.html) * [prelude::byte\_source::ByteSource](https://docs.pola.rs/api/rust/dev/polars/prelude/byte_source/trait.ByteSource.html) * [prelude::chunkedarray::DateMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/trait.DateMethods.html) * [prelude::chunkedarray::DatetimeMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/trait.DatetimeMethods.html) * [prelude::chunkedarray::DurationMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/trait.DurationMethods.html) * [prelude::chunkedarray::SeriesOpsTime](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/trait.SeriesOpsTime.html) * [prelude::chunkedarray::StringMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/trait.StringMethods.html) * [prelude::chunkedarray::TimeMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/trait.TimeMethods.html) * [prelude::chunkedarray::string::AsString](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/string/trait.AsString.html) * [prelude::chunkedarray::string::StringMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/string/trait.StringMethods.html) * [prelude::chunkedarray::string::infer::StrpTimeParser](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/string/infer/trait.StrpTimeParser.html) * [prelude::chunkedarray::string::infer::TryFromWithUnit](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/string/infer/trait.TryFromWithUnit.html) * [prelude::cloud::credential\_provider::IntoCredentialProvider](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/credential_provider/trait.IntoCredentialProvider.html) * [prelude::datatypes::ArrayCollectIterExt](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.ArrayCollectIterExt.html) * [prelude::datatypes::ArrayFromIter](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.ArrayFromIter.html) * [prelude::datatypes::ArrayFromIterDtype](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.ArrayFromIterDtype.html) * [prelude::datatypes::AsRefDataType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.AsRefDataType.html) * [prelude::datatypes::CatNative](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.CatNative.html) * [prelude::datatypes::CategoricalPhysicalDtypeExt](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.CategoricalPhysicalDtypeExt.html) * [prelude::datatypes::GetAnyValue](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.GetAnyValue.html) * [prelude::datatypes::InitHashMaps](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.InitHashMaps.html) * [prelude::datatypes::InitHashMaps2](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.InitHashMaps2.html) * [prelude::datatypes::IntoMetadata](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.IntoMetadata.html) * [prelude::datatypes::IntoScalar](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.IntoScalar.html) * [prelude::datatypes::LogicalType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.LogicalType.html) * [prelude::datatypes::MetaDataExt](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.MetaDataExt.html) * [prelude::datatypes::NumericNative](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.NumericNative.html) * [prelude::datatypes::PolarsCategoricalType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.PolarsCategoricalType.html) * [prelude::datatypes::PolarsDataType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.PolarsDataType.html) * [prelude::datatypes::PolarsFloatType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.PolarsFloatType.html) * [prelude::datatypes::PolarsIntegerType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.PolarsIntegerType.html) * [prelude::datatypes::PolarsNumericType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.PolarsNumericType.html) * [prelude::datatypes::PolarsPhysicalType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.PolarsPhysicalType.html) * [prelude::datatypes::SchemaExtPl](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.SchemaExtPl.html) * [prelude::datatypes::StaticArray](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/trait.StaticArray.html) * [prelude::datatypes::categorical::CategoricalPhysicalDtypeExt](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/categorical/trait.CategoricalPhysicalDtypeExt.html) * [prelude::default\_arrays::FromData](https://docs.pola.rs/api/rust/dev/polars/prelude/default_arrays/trait.FromData.html) * [prelude::default\_arrays::FromDataBinary](https://docs.pola.rs/api/rust/dev/polars/prelude/default_arrays/trait.FromDataBinary.html) * [prelude::default\_arrays::FromDataUtf8](https://docs.pola.rs/api/rust/dev/polars/prelude/default_arrays/trait.FromDataUtf8.html) * [prelude::expr::PhysicalAggExpr](https://docs.pola.rs/api/rust/dev/polars/prelude/expr/trait.PhysicalAggExpr.html) * [prelude::file::WriteableTrait](https://docs.pola.rs/api/rust/dev/polars/prelude/file/trait.WriteableTrait.html) * [prelude::round::RoundSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/round/trait.RoundSeries.html) * [prelude::series::AsSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/series/trait.AsSeries.html) * [prelude::series::TemporalMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/series/trait.TemporalMethods.html) * [prelude::sort::SlicedArray](https://docs.pola.rs/api/rust/dev/polars/prelude/sort/trait.SlicedArray.html) * [prelude::sort::options::SlicedArray](https://docs.pola.rs/api/rust/dev/polars/prelude/sort/options/trait.SlicedArray.html) * [prelude::strings::AsString](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/trait.AsString.html) * [prelude::strings::StringNameSpaceImpl](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/trait.StringNameSpaceImpl.html) * [prelude::utf8::BinaryFromIter](https://docs.pola.rs/api/rust/dev/polars/prelude/utf8/trait.BinaryFromIter.html) * [prelude::utf8::Utf8FromIter](https://docs.pola.rs/api/rust/dev/polars/prelude/utf8/trait.Utf8FromIter.html) * [series::ChunkCompareEq](https://docs.pola.rs/api/rust/dev/polars/series/trait.ChunkCompareEq.html) * [series::IntoSeries](https://docs.pola.rs/api/rust/dev/polars/series/trait.IntoSeries.html) * [series::SeriesTrait](https://docs.pola.rs/api/rust/dev/polars/series/trait.SeriesTrait.html) * [series::arithmetic::LhsNumOps](https://docs.pola.rs/api/rust/dev/polars/series/arithmetic/trait.LhsNumOps.html) * [series::arithmetic::NumOpsDispatch](https://docs.pola.rs/api/rust/dev/polars/series/arithmetic/trait.NumOpsDispatch.html) * [series::arithmetic::NumOpsDispatchInner](https://docs.pola.rs/api/rust/dev/polars/series/arithmetic/trait.NumOpsDispatchInner.html) * [series::arithmetic::checked::NumOpsDispatchChecked](https://docs.pola.rs/api/rust/dev/polars/series/arithmetic/checked/trait.NumOpsDispatchChecked.html) * [series::arithmetic::checked::NumOpsDispatchCheckedInner](https://docs.pola.rs/api/rust/dev/polars/series/arithmetic/checked/trait.NumOpsDispatchCheckedInner.html) ### Macros * [apply\_method\_all\_arrow\_series](https://docs.pola.rs/api/rust/dev/polars/macro.apply_method_all_arrow_series.html) * [df](https://docs.pola.rs/api/rust/dev/polars/macro.df.html) * [error::feature\_gated](https://docs.pola.rs/api/rust/dev/polars/error/macro.feature_gated.html) * [error::polars\_bail](https://docs.pola.rs/api/rust/dev/polars/error/macro.polars_bail.html) * [error::polars\_ensure](https://docs.pola.rs/api/rust/dev/polars/error/macro.polars_ensure.html) * [error::polars\_err](https://docs.pola.rs/api/rust/dev/polars/error/macro.polars_err.html) * [error::polars\_warn](https://docs.pola.rs/api/rust/dev/polars/error/macro.polars_warn.html) * [prelude::df](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.df.html) * [prelude::polars\_bail](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.polars_bail.html) * [prelude::polars\_ensure](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.polars_ensure.html) * [prelude::polars\_err](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.polars_err.html) * [prelude::polars\_warn](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.polars_warn.html) * [prelude::with\_match\_categorical\_physical\_type](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.with_match_categorical_physical_type.html) ### Functions * [chunked\_array::arg\_min\_max::arg\_max\_binary](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_max_binary.html) * [chunked\_array::arg\_min\_max::arg\_max\_bool](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_max_bool.html) * [chunked\_array::arg\_min\_max::arg\_max\_cat](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_max_cat.html) * [chunked\_array::arg\_min\_max::arg\_max\_numeric](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_max_numeric.html) * [chunked\_array::arg\_min\_max::arg\_max\_opt\_iter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_max_opt_iter.html) * [chunked\_array::arg\_min\_max::arg\_max\_str](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_max_str.html) * [chunked\_array::arg\_min\_max::arg\_min\_binary](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_min_binary.html) * [chunked\_array::arg\_min\_max::arg\_min\_bool](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_min_bool.html) * [chunked\_array::arg\_min\_max::arg\_min\_cat](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_min_cat.html) * [chunked\_array::arg\_min\_max::arg\_min\_numeric](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_min_numeric.html) * [chunked\_array::arg\_min\_max::arg\_min\_opt\_iter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_min_opt_iter.html) * [chunked\_array::arg\_min\_max::arg\_min\_str](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/fn.arg_min_str.html) * [chunked\_array::builder::get\_list\_builder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/fn.get_list_builder.html) * [chunked\_array::builder::list::get\_list\_builder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/list/fn.get_list_builder.html) * [chunked\_array::from\_iterator\_par::list\_from\_par\_iter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/from_iterator_par/fn.list_from_par_iter.html) * [chunked\_array::from\_iterator\_par::try\_list\_from\_par\_iter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/from_iterator_par/fn.try_list_from_par_iter.html) * [chunked\_array::object::registry::get\_object\_array\_getter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/fn.get_object_array_getter.html) * [chunked\_array::object::registry::get\_object\_builder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/fn.get_object_builder.html) * [chunked\_array::object::registry::get\_object\_converter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/fn.get_object_converter.html) * [chunked\_array::object::registry::get\_object\_physical\_type](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/fn.get_object_physical_type.html) * [chunked\_array::object::registry::get\_pyobject\_converter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/fn.get_pyobject_converter.html) * [chunked\_array::object::registry::register\_object\_builder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/fn.register_object_builder.html) * [chunked\_array::object::set\_polars\_allow\_extension](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/fn.set_polars_allow_extension.html) * [chunked\_array::ops::\_set\_check\_length](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/fn._set_check_length.html) * [chunked\_array::ops::arity::apply\_binary\_kernel\_broadcast](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.apply_binary_kernel_broadcast.html) * [chunked\_array::ops::arity::apply\_binary\_kernel\_broadcast\_owned](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.apply_binary_kernel_broadcast_owned.html) * [chunked\_array::ops::arity::binary](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.binary.html) * [chunked\_array::ops::arity::binary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.binary_elementwise.html) * [chunked\_array::ops::arity::binary\_elementwise\_for\_each](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.binary_elementwise_for_each.html) * [chunked\_array::ops::arity::binary\_elementwise\_into\_string\_amortized](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.binary_elementwise_into_string_amortized.html) * [chunked\_array::ops::arity::binary\_elementwise\_values](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.binary_elementwise_values.html) * [chunked\_array::ops::arity::binary\_mut\_values](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.binary_mut_values.html) * [chunked\_array::ops::arity::binary\_mut\_with\_options](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.binary_mut_with_options.html) * [chunked\_array::ops::arity::binary\_owned](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.binary_owned.html) * [chunked\_array::ops::arity::binary\_to\_series](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.binary_to_series.html) * [chunked\_array::ops::arity::binary\_unchecked\_same\_type](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.binary_unchecked_same_type.html) * [chunked\_array::ops::arity::broadcast\_binary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.broadcast_binary_elementwise.html) * [chunked\_array::ops::arity::broadcast\_binary\_elementwise\_values](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.broadcast_binary_elementwise_values.html) * [chunked\_array::ops::arity::broadcast\_try\_binary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.broadcast_try_binary_elementwise.html) * [chunked\_array::ops::arity::ternary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.ternary_elementwise.html) * [chunked\_array::ops::arity::try\_binary](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.try_binary.html) * [chunked\_array::ops::arity::try\_binary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.try_binary_elementwise.html) * [chunked\_array::ops::arity::try\_binary\_mut\_with\_options](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.try_binary_mut_with_options.html) * [chunked\_array::ops::arity::try\_binary\_unchecked\_same\_type](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.try_binary_unchecked_same_type.html) * [chunked\_array::ops::arity::try\_ternary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.try_ternary_elementwise.html) * [chunked\_array::ops::arity::try\_unary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.try_unary_elementwise.html) * [chunked\_array::ops::arity::try\_unary\_elementwise\_values](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.try_unary_elementwise_values.html) * [chunked\_array::ops::arity::try\_unary\_mut\_with\_options](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.try_unary_mut_with_options.html) * [chunked\_array::ops::arity::unary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.unary_elementwise.html) * [chunked\_array::ops::arity::unary\_elementwise\_values](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.unary_elementwise_values.html) * [chunked\_array::ops::arity::unary\_kernel](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.unary_kernel.html) * [chunked\_array::ops::arity::unary\_kernel\_owned](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.unary_kernel_owned.html) * [chunked\_array::ops::arity::unary\_mut\_values](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.unary_mut_values.html) * [chunked\_array::ops::arity::unary\_mut\_with\_options](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/arity/fn.unary_mut_with_options.html) * [chunked\_array::ops::float\_sorted\_arg\_max::float\_arg\_max\_sorted\_ascending](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/float_sorted_arg_max/fn.float_arg_max_sorted_ascending.html) * [chunked\_array::ops::float\_sorted\_arg\_max::float\_arg\_max\_sorted\_descending](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/float_sorted_arg_max/fn.float_arg_max_sorted_descending.html) * [chunked\_array::ops::gather::\_update\_gather\_sorted\_flag](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/gather/fn._update_gather_sorted_flag.html) * [chunked\_array::ops::gather::check\_bounds\_ca](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/gather/fn.check_bounds_ca.html) * [chunked\_array::ops::gather::check\_bounds\_nulls](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/gather/fn.check_bounds_nulls.html) * [chunked\_array::ops::row\_encode::\_get\_rows\_encoded](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/row_encode/fn._get_rows_encoded.html) * [chunked\_array::ops::row\_encode::\_get\_rows\_encoded\_arr](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/row_encode/fn._get_rows_encoded_arr.html) * [chunked\_array::ops::row\_encode::\_get\_rows\_encoded\_ca](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/row_encode/fn._get_rows_encoded_ca.html) * [chunked\_array::ops::row\_encode::\_get\_rows\_encoded\_ca\_unordered](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/row_encode/fn._get_rows_encoded_ca_unordered.html) * [chunked\_array::ops::row\_encode::\_get\_rows\_encoded\_unordered](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/row_encode/fn._get_rows_encoded_unordered.html) * [chunked\_array::ops::row\_encode::encode\_rows\_unordered](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/row_encode/fn.encode_rows_unordered.html) * [chunked\_array::ops::row\_encode::encode\_rows\_vertical\_par\_unordered](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/row_encode/fn.encode_rows_vertical_par_unordered.html) * [chunked\_array::ops::row\_encode::encode\_rows\_vertical\_par\_unordered\_broadcast\_nulls](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/row_encode/fn.encode_rows_vertical_par_unordered_broadcast_nulls.html) * [chunked\_array::ops::row\_encode::get\_row\_encoding\_context](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/row_encode/fn.get_row_encoding_context.html) * [chunked\_array::ops::row\_encode::row\_encoding\_decode](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/row_encode/fn.row_encoding_decode.html) * [chunked\_array::ops::search\_sorted::binary\_search\_ca](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/search_sorted/fn.binary_search_ca.html) * [chunked\_array::ops::search\_sorted::lower\_bound\_chunks](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/search_sorted/fn.lower_bound_chunks.html) * [chunked\_array::ops::sort::\_broadcast\_bools](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/sort/fn._broadcast_bools.html) * [chunked\_array::ops::sort::arg\_bottom\_k::\_arg\_bottom\_k](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/sort/arg_bottom_k/fn._arg_bottom_k.html) * [chunked\_array::ops::sort::arg\_sort](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/sort/fn.arg_sort.html) * [chunked\_array::ops::sort::perfect\_sort](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/sort/fn.perfect_sort.html) * [chunked\_array::temporal::conversion::datetime\_to\_timestamp\_ms](https://docs.pola.rs/api/rust/dev/polars/chunked_array/temporal/conversion/fn.datetime_to_timestamp_ms.html) * [chunked\_array::temporal::conversion::datetime\_to\_timestamp\_ns](https://docs.pola.rs/api/rust/dev/polars/chunked_array/temporal/conversion/fn.datetime_to_timestamp_ns.html) * [chunked\_array::temporal::conversion::datetime\_to\_timestamp\_us](https://docs.pola.rs/api/rust/dev/polars/chunked_array/temporal/conversion/fn.datetime_to_timestamp_us.html) * [chunked\_array::temporal::conversion::get\_strftime\_format](https://docs.pola.rs/api/rust/dev/polars/chunked_array/temporal/conversion/fn.get_strftime_format.html) * [chunked\_array::temporal::datetime\_to\_timestamp\_ms](https://docs.pola.rs/api/rust/dev/polars/chunked_array/temporal/fn.datetime_to_timestamp_ms.html) * [chunked\_array::temporal::datetime\_to\_timestamp\_ns](https://docs.pola.rs/api/rust/dev/polars/chunked_array/temporal/fn.datetime_to_timestamp_ns.html) * [chunked\_array::temporal::datetime\_to\_timestamp\_us](https://docs.pola.rs/api/rust/dev/polars/chunked_array/temporal/fn.datetime_to_timestamp_us.html) * [chunked\_array::temporal::get\_strftime\_format](https://docs.pola.rs/api/rust/dev/polars/chunked_array/temporal/fn.get_strftime_format.html) * [chunked\_array::temporal::time\_to\_time64ns](https://docs.pola.rs/api/rust/dev/polars/chunked_array/temporal/fn.time_to_time64ns.html) * [datatypes::ensure\_same\_categories](https://docs.pola.rs/api/rust/dev/polars/datatypes/fn.ensure_same_categories.html) * [datatypes::ensure\_same\_frozen\_categories](https://docs.pola.rs/api/rust/dev/polars/datatypes/fn.ensure_same_frozen_categories.html) * [datatypes::merge\_dtypes](https://docs.pola.rs/api/rust/dev/polars/datatypes/fn.merge_dtypes.html) * [datatypes::time\_unit::convert\_time\_units](https://docs.pola.rs/api/rust/dev/polars/datatypes/time_unit/fn.convert_time_units.html) * [datatypes::time\_zone::parse\_fixed\_offset](https://docs.pola.rs/api/rust/dev/polars/datatypes/time_zone/fn.parse_fixed_offset.html) * [datatypes::time\_zone::parse\_time\_zone](https://docs.pola.rs/api/rust/dev/polars/datatypes/time_zone/fn.parse_time_zone.html) * [datatypes::unpack\_dtypes](https://docs.pola.rs/api/rust/dev/polars/datatypes/fn.unpack_dtypes.html) * [error::get\_warning\_function](https://docs.pola.rs/api/rust/dev/polars/error/fn.get_warning_function.html) * [error::map\_err](https://docs.pola.rs/api/rust/dev/polars/error/fn.map_err.html) * [error::set\_warning\_function](https://docs.pola.rs/api/rust/dev/polars/error/fn.set_warning_function.html) * [error::signals::catch\_keyboard\_interrupt](https://docs.pola.rs/api/rust/dev/polars/error/signals/fn.catch_keyboard_interrupt.html) * [error::signals::register\_polars\_keyboard\_interrupt\_hook](https://docs.pola.rs/api/rust/dev/polars/error/signals/fn.register_polars_keyboard_interrupt_hook.html) * [error::signals::try\_raise\_keyboard\_interrupt](https://docs.pola.rs/api/rust/dev/polars/error/signals/fn.try_raise_keyboard_interrupt.html) * [error::to\_compute\_err](https://docs.pola.rs/api/rust/dev/polars/error/fn.to_compute_err.html) * [frame::chunk\_df\_for\_writing](https://docs.pola.rs/api/rust/dev/polars/frame/fn.chunk_df_for_writing.html) * [frame::group\_by::aggregations::\_agg\_helper\_idx](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/aggregations/fn._agg_helper_idx.html) * [frame::group\_by::aggregations::\_agg\_helper\_idx\_no\_null](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/aggregations/fn._agg_helper_idx_no_null.html) * [frame::group\_by::aggregations::\_agg\_helper\_slice](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/aggregations/fn._agg_helper_slice.html) * [frame::group\_by::aggregations::\_agg\_helper\_slice\_no\_null](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/aggregations/fn._agg_helper_slice_no_null.html) * [frame::group\_by::aggregations::\_rolling\_apply\_agg\_window\_no\_nulls](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/aggregations/fn._rolling_apply_agg_window_no_nulls.html) * [frame::group\_by::aggregations::\_rolling\_apply\_agg\_window\_nulls](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/aggregations/fn._rolling_apply_agg_window_nulls.html) * [frame::group\_by::aggregations::\_slice\_from\_offsets](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/aggregations/fn._slice_from_offsets.html) * [frame::group\_by::aggregations::\_use\_rolling\_kernels](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/aggregations/fn._use_rolling_kernels.html) * [frame::group\_by::fmt\_group\_by\_column](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/fn.fmt_group_by_column.html) * [frame::row::coerce\_dtype](https://docs.pola.rs/api/rust/dev/polars/frame/row/fn.coerce_dtype.html) * [frame::row::infer\_schema](https://docs.pola.rs/api/rust/dev/polars/frame/row/fn.infer_schema.html) * [frame::row::rows\_to\_schema\_first\_non\_null](https://docs.pola.rs/api/rust/dev/polars/frame/row/fn.rows_to_schema_first_non_null.html) * [frame::row::rows\_to\_schema\_supertypes](https://docs.pola.rs/api/rust/dev/polars/frame/row/fn.rows_to_schema_supertypes.html) * [frame::row::rows\_to\_supertypes](https://docs.pola.rs/api/rust/dev/polars/frame/row/fn.rows_to_supertypes.html) * [functions::concat\_df\_diagonal](https://docs.pola.rs/api/rust/dev/polars/functions/fn.concat_df_diagonal.html) * [functions::concat\_df\_horizontal](https://docs.pola.rs/api/rust/dev/polars/functions/fn.concat_df_horizontal.html) * [prelude::\_coalesce\_full\_join](https://docs.pola.rs/api/rust/dev/polars/prelude/fn._coalesce_full_join.html) * [prelude::\_csv\_read\_internal::cast\_columns](https://docs.pola.rs/api/rust/dev/polars/prelude/_csv_read_internal/fn.cast_columns.html) * [prelude::\_csv\_read\_internal::is\_comment\_line](https://docs.pola.rs/api/rust/dev/polars/prelude/_csv_read_internal/fn.is_comment_line.html) * [prelude::\_csv\_read\_internal::prepare\_csv\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/_csv_read_internal/fn.prepare_csv_schema.html) * [prelude::\_csv\_read\_internal::read\_chunk](https://docs.pola.rs/api/rust/dev/polars/prelude/_csv_read_internal/fn.read_chunk.html) * [prelude::\_csv\_read\_internal::validate\_utf8](https://docs.pola.rs/api/rust/dev/polars/prelude/_csv_read_internal/fn.validate_utf8.html) * [prelude::\_internal::calc\_prefilter\_cost](https://docs.pola.rs/api/rust/dev/polars/prelude/_internal/fn.calc_prefilter_cost.html) * [prelude::\_internal::ensure\_matching\_dtypes\_if\_found](https://docs.pola.rs/api/rust/dev/polars/prelude/_internal/fn.ensure_matching_dtypes_if_found.html) * [prelude::\_internal::to\_deserializer](https://docs.pola.rs/api/rust/dev/polars/prelude/_internal/fn.to_deserializer.html) * [prelude::\_join\_suffix\_name](https://docs.pola.rs/api/rust/dev/polars/prelude/fn._join_suffix_name.html) * [prelude::\_set\_check\_length](https://docs.pola.rs/api/rust/dev/polars/prelude/fn._set_check_length.html) * [prelude::abs](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.abs.html) * [prelude::aggregations::\_agg\_helper\_idx](https://docs.pola.rs/api/rust/dev/polars/prelude/aggregations/fn._agg_helper_idx.html) * [prelude::aggregations::\_agg\_helper\_idx\_no\_null](https://docs.pola.rs/api/rust/dev/polars/prelude/aggregations/fn._agg_helper_idx_no_null.html) * [prelude::aggregations::\_agg\_helper\_slice](https://docs.pola.rs/api/rust/dev/polars/prelude/aggregations/fn._agg_helper_slice.html) * [prelude::aggregations::\_agg\_helper\_slice\_no\_null](https://docs.pola.rs/api/rust/dev/polars/prelude/aggregations/fn._agg_helper_slice_no_null.html) * [prelude::aggregations::\_rolling\_apply\_agg\_window\_no\_nulls](https://docs.pola.rs/api/rust/dev/polars/prelude/aggregations/fn._rolling_apply_agg_window_no_nulls.html) * [prelude::aggregations::\_rolling\_apply\_agg\_window\_nulls](https://docs.pola.rs/api/rust/dev/polars/prelude/aggregations/fn._rolling_apply_agg_window_nulls.html) * [prelude::aggregations::\_slice\_from\_offsets](https://docs.pola.rs/api/rust/dev/polars/prelude/aggregations/fn._slice_from_offsets.html) * [prelude::aggregations::\_use\_rolling\_kernels](https://docs.pola.rs/api/rust/dev/polars/prelude/aggregations/fn._use_rolling_kernels.html) * [prelude::all](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.all.html) * [prelude::all\_horizontal](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.all_horizontal.html) * [prelude::anonymous::named\_serde::set\_named\_serde\_registry](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/named_serde/fn.set_named_serde_registry.html) * [prelude::anonymous::new\_column\_udf](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/fn.new_column_udf.html) * [prelude::any\_horizontal](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.any_horizontal.html) * [prelude::apply\_multiple](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.apply_multiple.html) * [prelude::apply\_projection](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.apply_projection.html) * [prelude::arange](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.arange.html) * [prelude::arg\_sort\_by](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.arg_sort_by.html) * [prelude::arg\_where](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.arg_where.html) * [prelude::arity::apply\_binary\_kernel\_broadcast](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.apply_binary_kernel_broadcast.html) * [prelude::arity::apply\_binary\_kernel\_broadcast\_owned](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.apply_binary_kernel_broadcast_owned.html) * [prelude::arity::binary](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.binary.html) * [prelude::arity::binary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.binary_elementwise.html) * [prelude::arity::binary\_elementwise\_for\_each](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.binary_elementwise_for_each.html) * [prelude::arity::binary\_elementwise\_into\_string\_amortized](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.binary_elementwise_into_string_amortized.html) * [prelude::arity::binary\_elementwise\_values](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.binary_elementwise_values.html) * [prelude::arity::binary\_mut\_values](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.binary_mut_values.html) * [prelude::arity::binary\_mut\_with\_options](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.binary_mut_with_options.html) * [prelude::arity::binary\_owned](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.binary_owned.html) * [prelude::arity::binary\_to\_series](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.binary_to_series.html) * [prelude::arity::binary\_unchecked\_same\_type](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.binary_unchecked_same_type.html) * [prelude::arity::broadcast\_binary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.broadcast_binary_elementwise.html) * [prelude::arity::broadcast\_binary\_elementwise\_values](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.broadcast_binary_elementwise_values.html) * [prelude::arity::broadcast\_try\_binary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.broadcast_try_binary_elementwise.html) * [prelude::arity::ternary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.ternary_elementwise.html) * [prelude::arity::try\_binary](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.try_binary.html) * [prelude::arity::try\_binary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.try_binary_elementwise.html) * [prelude::arity::try\_binary\_mut\_with\_options](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.try_binary_mut_with_options.html) * [prelude::arity::try\_binary\_unchecked\_same\_type](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.try_binary_unchecked_same_type.html) * [prelude::arity::try\_ternary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.try_ternary_elementwise.html) * [prelude::arity::try\_unary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.try_unary_elementwise.html) * [prelude::arity::try\_unary\_elementwise\_values](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.try_unary_elementwise_values.html) * [prelude::arity::try\_unary\_mut\_with\_options](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.try_unary_mut_with_options.html) * [prelude::arity::unary\_elementwise](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.unary_elementwise.html) * [prelude::arity::unary\_elementwise\_values](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.unary_elementwise_values.html) * [prelude::arity::unary\_kernel](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.unary_kernel.html) * [prelude::arity::unary\_kernel\_owned](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.unary_kernel_owned.html) * [prelude::arity::unary\_mut\_values](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.unary_mut_values.html) * [prelude::arity::unary\_mut\_with\_options](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/fn.unary_mut_with_options.html) * [prelude::as\_struct](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.as_struct.html) * [prelude::avg](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.avg.html) * [prelude::base\_utc\_offset](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.base_utc_offset.html) * [prelude::binary\_expr](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.binary_expr.html) * [prelude::buffer::init\_buffers](https://docs.pola.rs/api/rust/dev/polars/prelude/buffer/fn.init_buffers.html) * [prelude::buffer::validate\_utf8](https://docs.pola.rs/api/rust/dev/polars/prelude/buffer/fn.validate_utf8.html) * [prelude::by\_name](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.by_name.html) * [prelude::cast](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cast.html) * [prelude::chunkedarray::string::infer::infer\_pattern\_single](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/string/infer/fn.infer_pattern_single.html) * [prelude::chunkedarray::string::infer::to\_datetime](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/string/infer/fn.to_datetime.html) * [prelude::chunkedarray::string::infer::to\_datetime\_with\_inferred\_tz](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/string/infer/fn.to_datetime_with_inferred_tz.html) * [prelude::clip](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.clip.html) * [prelude::clip\_max](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.clip_max.html) * [prelude::clip\_min](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.clip_min.html) * [prelude::cloud::build\_object\_store](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/fn.build_object_store.html) * [prelude::cloud::glob](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/fn.glob.html) * [prelude::cloud::object\_path\_from\_str](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/fn.object_path_from_str.html) * [prelude::coalesce](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.coalesce.html) * [prelude::coalesce\_columns](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.coalesce_columns.html) * [prelude::col](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.col.html) * [prelude::cols](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cols.html) * [prelude::columns\_to\_projection](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.columns_to_projection.html) * [prelude::compression::maybe\_decompress\_bytes](https://docs.pola.rs/api/rust/dev/polars/prelude/compression/fn.maybe_decompress_bytes.html) * [prelude::concat](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat.html) * [prelude::concat\_arr](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_arr.html) * [prelude::concat\_arr::concat\_arr](https://docs.pola.rs/api/rust/dev/polars/prelude/concat_arr/fn.concat_arr.html) * [prelude::concat\_expr](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_expr.html) * [prelude::concat\_lf\_diagonal](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_lf_diagonal.html) * [prelude::concat\_lf\_horizontal](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_lf_horizontal.html) * [prelude::concat\_list](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_list.html) * [prelude::concat\_str](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_str.html) * [prelude::convert\_inner\_type](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.convert_inner_type.html) * [prelude::convert\_to\_unsigned\_index](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.convert_to_unsigned_index.html) * [prelude::count\_ones](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.count_ones.html) * [prelude::count\_rows](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.count_rows.html) * [prelude::count\_rows\_from\_slice\_par](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.count_rows_from_slice_par.html) * [prelude::count\_zeros](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.count_zeros.html) * [prelude::create\_sorting\_map](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.create_sorting_map.html) * [prelude::csv\_header](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.csv_header.html) * [prelude::cum\_count](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_count.html) * [prelude::cum\_count\_with\_init](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_count_with_init.html) * [prelude::cum\_fold\_exprs](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_fold_exprs.html) * [prelude::cum\_max](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_max.html) * [prelude::cum\_max\_with\_init](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_max_with_init.html) * [prelude::cum\_min](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_min.html) * [prelude::cum\_min\_with\_init](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_min_with_init.html) * [prelude::cum\_prod](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_prod.html) * [prelude::cum\_prod\_with\_init](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_prod_with_init.html) * [prelude::cum\_reduce\_exprs](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_reduce_exprs.html) * [prelude::cum\_sum](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_sum.html) * [prelude::cum\_sum\_with\_init](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_sum_with_init.html) * [prelude::datatypes::ensure\_same\_categories](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/fn.ensure_same_categories.html) * [prelude::datatypes::ensure\_same\_frozen\_categories](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/fn.ensure_same_frozen_categories.html) * [prelude::datatypes::merge\_dtypes](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/fn.merge_dtypes.html) * [prelude::datatypes::time\_unit::convert\_time\_units](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/time_unit/fn.convert_time_units.html) * [prelude::datatypes::time\_zone::parse\_fixed\_offset](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/time_zone/fn.parse_fixed_offset.html) * [prelude::datatypes::time\_zone::parse\_time\_zone](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/time_zone/fn.parse_time_zone.html) * [prelude::datatypes::unpack\_dtypes](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/fn.unpack_dtypes.html) * [prelude::date\_ranges](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.date_ranges.html) * [prelude::datetime](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime.html) * [prelude::datetime::impl\_replace\_time\_zone](https://docs.pola.rs/api/rust/dev/polars/prelude/datetime/fn.impl_replace_time_zone.html) * [prelude::datetime::impl\_replace\_time\_zone\_fast](https://docs.pola.rs/api/rust/dev/polars/prelude/datetime/fn.impl_replace_time_zone_fast.html) * [prelude::datetime::replace\_time\_zone](https://docs.pola.rs/api/rust/dev/polars/prelude/datetime/fn.replace_time_zone.html) * [prelude::datetime\_range](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime_range.html) * [prelude::datetime\_ranges](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime_ranges.html) * [prelude::datetime\_to\_timestamp\_ms](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime_to_timestamp_ms.html) * [prelude::datetime\_to\_timestamp\_ns](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime_to_timestamp_ns.html) * [prelude::datetime\_to\_timestamp\_us](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime_to_timestamp_us.html) * [prelude::decode\_json\_response](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.decode_json_response.html) * [prelude::default\_join\_ids](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.default_join_ids.html) * [prelude::deserialize](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.deserialize.html) * [prelude::diff](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.diff.html) * [prelude::dst\_offset](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.dst_offset.html) * [prelude::dtype\_col](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.dtype_col.html) * [prelude::dtype\_cols](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.dtype_cols.html) * [prelude::duration](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.duration.html) * [prelude::element](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.element.html) * [prelude::empty](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.empty.html) * [prelude::ensure\_duration\_matches\_dtype](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ensure_duration_matches_dtype.html) * [prelude::ensure\_is\_constant\_duration](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ensure_is_constant_duration.html) * [prelude::ensure\_matching\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ensure_matching_schema.html) * [prelude::ensure\_same\_categories](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ensure_same_categories.html) * [prelude::ensure\_same\_frozen\_categories](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ensure_same_frozen_categories.html) * [prelude::escape\_regex](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.escape_regex.html) * [prelude::escape\_regex\_str](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.escape_regex_str.html) * [prelude::estimate\_n\_lines\_in\_chunk](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.estimate_n_lines_in_chunk.html) * [prelude::estimate\_n\_lines\_in\_file](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.estimate_n_lines_in_file.html) * [prelude::expand\_paths](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.expand_paths.html) * [prelude::expand\_paths\_hive](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.expand_paths_hive.html) * [prelude::expanded\_from\_single\_directory](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.expanded_from_single_directory.html) * [prelude::first](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.first.html) * [prelude::float\_sorted\_arg\_max::float\_arg\_max\_sorted\_ascending](https://docs.pola.rs/api/rust/dev/polars/prelude/float_sorted_arg_max/fn.float_arg_max_sorted_ascending.html) * [prelude::float\_sorted\_arg\_max::float\_arg\_max\_sorted\_descending](https://docs.pola.rs/api/rust/dev/polars/prelude/float_sorted_arg_max/fn.float_arg_max_sorted_descending.html) * [prelude::floor\_div\_series](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.floor_div_series.html) * [prelude::fmt\_group\_by\_column](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.fmt_group_by_column.html) * [prelude::fold\_exprs](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.fold_exprs.html) * [prelude::format\_str](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.format_str.html) * [prelude::gather::\_update\_gather\_sorted\_flag](https://docs.pola.rs/api/rust/dev/polars/prelude/gather/fn._update_gather_sorted_flag.html) * [prelude::gather::check\_bounds\_ca](https://docs.pola.rs/api/rust/dev/polars/prelude/gather/fn.check_bounds_ca.html) * [prelude::gather::check\_bounds\_nulls](https://docs.pola.rs/api/rust/dev/polars/prelude/gather/fn.check_bounds_nulls.html) * [prelude::get\_column\_write\_options](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.get_column_write_options.html) * [prelude::get\_reader\_bytes](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.get_reader_bytes.html) * [prelude::get\_strftime\_format](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.get_strftime_format.html) * [prelude::group\_by\_values](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.group_by_values.html) * [prelude::group\_by\_windows](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.group_by_windows.html) * [prelude::hor\_str\_concat](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.hor_str_concat.html) * [prelude::impl\_duration](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.impl_duration.html) * [prelude::impl\_replace\_time\_zone](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.impl_replace_time_zone.html) * [prelude::impl\_replace\_time\_zone\_fast](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.impl_replace_time_zone_fast.html) * [prelude::in\_nanoseconds\_window](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.in_nanoseconds_window.html) * [prelude::index\_cols](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.index_cols.html) * [prelude::indexes\_to\_usizes](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.indexes_to_usizes.html) * [prelude::infer\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.infer_schema.html) * [prelude::int\_range](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.int_range.html) * [prelude::int\_ranges](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.int_ranges.html) * [prelude::interpolate](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.interpolate.html) * [prelude::interpolate::interpolate](https://docs.pola.rs/api/rust/dev/polars/prelude/interpolate/fn.interpolate.html) * [prelude::interpolate\_by](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.interpolate_by.html) * [prelude::interpolate\_by::interpolate\_by](https://docs.pola.rs/api/rust/dev/polars/prelude/interpolate_by/fn.interpolate_by.html) * [prelude::is\_between](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_between.html) * [prelude::is\_close](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_close.html) * [prelude::is\_first\_distinct](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_first_distinct.html) * [prelude::is\_in](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_in.html) * [prelude::is\_json\_line](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_json_line.html) * [prelude::is\_last\_distinct](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_last_distinct.html) * [prelude::is\_not\_null](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_not_null.html) * [prelude::is\_null](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_null.html) * [prelude::json\_lines](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.json_lines.html) * [prelude::known\_timezones](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.known_timezones.html) * [prelude::last](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.last.html) * [prelude::leading\_ones](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.leading_ones.html) * [prelude::leading\_zeros](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.leading_zeros.html) * [prelude::len](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.len.html) * [prelude::linear\_space](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.linear_space.html) * [prelude::linear\_spaces](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.linear_spaces.html) * [prelude::lit](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.lit.html) * [prelude::lst\_get](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.lst_get.html) * [prelude::map\_multiple](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.map_multiple.html) * [prelude::materialize\_empty\_df](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.materialize_empty_df.html) * [prelude::materialize\_projection](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.materialize_projection.html) * [prelude::max](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.max.html) * [prelude::mean](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.mean.html) * [prelude::median](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.median.html) * [prelude::merge\_dtypes](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.merge_dtypes.html) * [prelude::merge\_join::gather\_and\_postprocess](https://docs.pola.rs/api/rust/dev/polars/prelude/merge_join/fn.gather_and_postprocess.html) * [prelude::merge\_join::match\_keys](https://docs.pola.rs/api/rust/dev/polars/prelude/merge_join/fn.match_keys.html) * [prelude::min](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.min.html) * [prelude::mkdir::mkdir\_recursive](https://docs.pola.rs/api/rust/dev/polars/prelude/mkdir/fn.mkdir_recursive.html) * [prelude::mkdir::tokio\_mkdir\_recursive](https://docs.pola.rs/api/rust/dev/polars/prelude/mkdir/fn.tokio_mkdir_recursive.html) * [prelude::mode::mode](https://docs.pola.rs/api/rust/dev/polars/prelude/mode/fn.mode.html) * [prelude::nan\_propagating\_aggregate::ca\_nan\_agg](https://docs.pola.rs/api/rust/dev/polars/prelude/nan_propagating_aggregate/fn.ca_nan_agg.html) * [prelude::nan\_propagating\_aggregate::group\_agg\_nan\_max\_s](https://docs.pola.rs/api/rust/dev/polars/prelude/nan_propagating_aggregate/fn.group_agg_nan_max_s.html) * [prelude::nan\_propagating\_aggregate::group\_agg\_nan\_min\_s](https://docs.pola.rs/api/rust/dev/polars/prelude/nan_propagating_aggregate/fn.group_agg_nan_min_s.html) * [prelude::nan\_propagating\_aggregate::nan\_max\_s](https://docs.pola.rs/api/rust/dev/polars/prelude/nan_propagating_aggregate/fn.nan_max_s.html) * [prelude::nan\_propagating\_aggregate::nan\_min\_s](https://docs.pola.rs/api/rust/dev/polars/prelude/nan_propagating_aggregate/fn.nan_min_s.html) * [prelude::negate](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.negate.html) * [prelude::negate\_bitwise](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.negate_bitwise.html) * [prelude::new\_column\_udf](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.new_column_udf.html) * [prelude::new\_int\_range](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.new_int_range.html) * [prelude::new\_linear\_space\_f32](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.new_linear_space_f32.html) * [prelude::new\_linear\_space\_f64](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.new_linear_space_f64.html) * [prelude::not](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.not.html) * [prelude::nth](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.nth.html) * [prelude::overwrite\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.overwrite_schema.html) * [prelude::parse\_ndjson](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.parse_ndjson.html) * [prelude::peaks::peak\_max\_with\_start\_end](https://docs.pola.rs/api/rust/dev/polars/prelude/peaks/fn.peak_max_with_start_end.html) * [prelude::peaks::peak\_min\_max](https://docs.pola.rs/api/rust/dev/polars/prelude/peaks/fn.peak_min_max.html) * [prelude::peaks::peak\_min\_with\_start\_end](https://docs.pola.rs/api/rust/dev/polars/prelude/peaks/fn.peak_min_with_start_end.html) * [prelude::prepare\_cloud\_plan](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.prepare_cloud_plan.html) * [prelude::private\_left\_join\_multiple\_keys](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.private_left_join_multiple_keys.html) * [prelude::quantile](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.quantile.html) * [prelude::read\_until\_start\_and\_infer\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.read_until_start_and_infer_schema.html) * [prelude::reduce\_exprs](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.reduce_exprs.html) * [prelude::remove\_bom](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.remove_bom.html) * [prelude::repeat](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.repeat.html) * [prelude::repeat\_by](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.repeat_by.html) * [prelude::replace](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace.html) * [prelude::replace::replace\_date](https://docs.pola.rs/api/rust/dev/polars/prelude/replace/fn.replace_date.html) * [prelude::replace::replace\_datetime](https://docs.pola.rs/api/rust/dev/polars/prelude/replace/fn.replace_datetime.html) * [prelude::replace\_date](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace_date.html) * [prelude::replace\_datetime](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace_datetime.html) * [prelude::replace\_or\_default](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace_or_default.html) * [prelude::replace\_strict](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace_strict.html) * [prelude::replace\_time\_zone](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace_time_zone.html) * [prelude::resolve\_homedir](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.resolve_homedir.html) * [prelude::rle](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.rle.html) * [prelude::rle\_id](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.rle_id.html) * [prelude::rle\_lengths](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.rle_lengths.html) * [prelude::rolling\_kurtosis](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.rolling_kurtosis.html) * [prelude::rolling\_skew](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.rolling_skew.html) * [prelude::row\_encode::\_get\_rows\_encoded](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/fn._get_rows_encoded.html) * [prelude::row\_encode::\_get\_rows\_encoded\_arr](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/fn._get_rows_encoded_arr.html) * [prelude::row\_encode::\_get\_rows\_encoded\_ca](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/fn._get_rows_encoded_ca.html) * [prelude::row\_encode::\_get\_rows\_encoded\_ca\_unordered](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/fn._get_rows_encoded_ca_unordered.html) * [prelude::row\_encode::\_get\_rows\_encoded\_unordered](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/fn._get_rows_encoded_unordered.html) * [prelude::row\_encode::encode\_rows\_unordered](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/fn.encode_rows_unordered.html) * [prelude::row\_encode::encode\_rows\_vertical\_par\_unordered](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/fn.encode_rows_vertical_par_unordered.html) * [prelude::row\_encode::encode\_rows\_vertical\_par\_unordered\_broadcast\_nulls](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/fn.encode_rows_vertical_par_unordered_broadcast_nulls.html) * [prelude::row\_encode::get\_row\_encoding\_context](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/fn.get_row_encoding_context.html) * [prelude::row\_encode::row\_encoding\_decode](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/fn.row_encoding_decode.html) * [prelude::schema\_inference::finish\_infer\_field\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/schema_inference/fn.finish_infer_field_schema.html) * [prelude::schema\_inference::infer\_field\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/schema_inference/fn.infer_field_schema.html) * [prelude::search\_sorted](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.search_sorted.html) * [prelude::search\_sorted::binary\_search\_ca](https://docs.pola.rs/api/rust/dev/polars/prelude/search_sorted/fn.binary_search_ca.html) * [prelude::search\_sorted::lower\_bound\_chunks](https://docs.pola.rs/api/rust/dev/polars/prelude/search_sorted/fn.lower_bound_chunks.html) * [prelude::sort::\_broadcast\_bools](https://docs.pola.rs/api/rust/dev/polars/prelude/sort/fn._broadcast_bools.html) * [prelude::sort::arg\_bottom\_k::\_arg\_bottom\_k](https://docs.pola.rs/api/rust/dev/polars/prelude/sort/arg_bottom_k/fn._arg_bottom_k.html) * [prelude::sort::arg\_sort](https://docs.pola.rs/api/rust/dev/polars/prelude/sort/fn.arg_sort.html) * [prelude::sort::perfect\_sort](https://docs.pola.rs/api/rust/dev/polars/prelude/sort/fn.perfect_sort.html) * [prelude::split\_helper](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.split_helper.html) * [prelude::split\_regex\_helper](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.split_regex_helper.html) * [prelude::split\_to\_struct](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.split_to_struct.html) * [prelude::str\_format](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.str_format.html) * [prelude::str\_join](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.str_join.html) * [prelude::streaming::read\_until\_start\_and\_infer\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/streaming/fn.read_until_start_and_infer_schema.html) * [prelude::strings::escape\_regex](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.escape_regex.html) * [prelude::strings::escape\_regex\_str](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.escape_regex_str.html) * [prelude::strings::hor\_str\_concat](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.hor_str_concat.html) * [prelude::strings::split\_helper](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.split_helper.html) * [prelude::strings::split\_regex\_helper](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.split_regex_helper.html) * [prelude::strings::split\_to\_struct](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.split_to_struct.html) * [prelude::strings::str\_join](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.str_join.html) * [prelude::strings::strip\_chars](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.strip_chars.html) * [prelude::strings::strip\_chars\_end](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.strip_chars_end.html) * [prelude::strings::strip\_chars\_start](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.strip_chars_start.html) * [prelude::strings::strip\_prefix](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.strip_prefix.html) * [prelude::strings::strip\_suffix](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.strip_suffix.html) * [prelude::strings::substring\_ternary\_offsets\_value](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.substring_ternary_offsets_value.html) * [prelude::strings::update\_view](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/fn.update_view.html) * [prelude::strip\_chars](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.strip_chars.html) * [prelude::strip\_chars\_end](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.strip_chars_end.html) * [prelude::strip\_chars\_start](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.strip_chars_start.html) * [prelude::strip\_prefix](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.strip_prefix.html) * [prelude::strip\_suffix](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.strip_suffix.html) * [prelude::substring\_ternary\_offsets\_value](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.substring_ternary_offsets_value.html) * [prelude::sum](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.sum.html) * [prelude::ternary\_expr](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ternary_expr.html) * [prelude::time\_ranges](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.time_ranges.html) * [prelude::trailing\_ones](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.trailing_ones.html) * [prelude::trailing\_zeros](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.trailing_zeros.html) * [prelude::try\_raise\_keyboard\_interrupt](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.try_raise_keyboard_interrupt.html) * [prelude::try\_set\_sorted\_flag](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.try_set_sorted_flag.html) * [prelude::udf::infer\_udf\_output\_dtype](https://docs.pola.rs/api/rust/dev/polars/prelude/udf/fn.infer_udf_output_dtype.html) * [prelude::udf::try\_infer\_udf\_output\_dtype](https://docs.pola.rs/api/rust/dev/polars/prelude/udf/fn.try_infer_udf_output_dtype.html) * [prelude::unique\_counts](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.unique_counts.html) * [prelude::unpack\_dtypes](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.unpack_dtypes.html) * [prelude::update\_view](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.update_view.html) * [prelude::when](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.when.html) * [series::arithmetic::\_struct\_arithmetic](https://docs.pola.rs/api/rust/dev/polars/series/arithmetic/fn._struct_arithmetic.html) * [series::arithmetic::coerce\_lhs\_rhs](https://docs.pola.rs/api/rust/dev/polars/series/arithmetic/fn.coerce_lhs_rhs.html) ### Type Aliases * [chunked\_array::ChunkLenIter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/type.ChunkLenIter.html) * [chunked\_array::StructChunked](https://docs.pola.rs/api/rust/dev/polars/chunked_array/type.StructChunked.html) * [chunked\_array::builder::BinaryChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/type.BinaryChunkedBuilder.html) * [chunked\_array::builder::StringChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/type.StringChunkedBuilder.html) * [chunked\_array::object::ObjectValueIter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/type.ObjectValueIter.html) * [chunked\_array::object::registry::BuilderConstructor](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/type.BuilderConstructor.html) * [chunked\_array::object::registry::ObjectArrayGetter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/type.ObjectArrayGetter.html) * [chunked\_array::object::registry::ObjectConverter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/type.ObjectConverter.html) * [chunked\_array::object::registry::PyObjectConverter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/registry/type.PyObjectConverter.html) * [chunked\_array::ops::FillNullLimit](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/type.FillNullLimit.html) * [datatypes::ArrayChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.ArrayChunked.html) * [datatypes::BinaryChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.BinaryChunked.html) * [datatypes::BinaryOffsetChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.BinaryOffsetChunked.html) * [datatypes::BooleanChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.BooleanChunked.html) * [datatypes::CatSize](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.CatSize.html) * [datatypes::Categorical16Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Categorical16Chunked.html) * [datatypes::Categorical32Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Categorical32Chunked.html) * [datatypes::Categorical8Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Categorical8Chunked.html) * [datatypes::CategoricalChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.CategoricalChunked.html) * [datatypes::DateChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.DateChunked.html) * [datatypes::DatetimeChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.DatetimeChunked.html) * [datatypes::DecimalChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.DecimalChunked.html) * [datatypes::DurationChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.DurationChunked.html) * [datatypes::FieldRef](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.FieldRef.html) * [datatypes::Float16Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Float16Chunked.html) * [datatypes::Float32Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Float32Chunked.html) * [datatypes::Float64Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Float64Chunked.html) * [datatypes::IdxArr](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.IdxArr.html) * [datatypes::IdxCa](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.IdxCa.html) * [datatypes::IdxType](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.IdxType.html) * [datatypes::Int128Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Int128Chunked.html) * [datatypes::Int16Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Int16Chunked.html) * [datatypes::Int32Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Int32Chunked.html) * [datatypes::Int64Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Int64Chunked.html) * [datatypes::Int8Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Int8Chunked.html) * [datatypes::ListChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.ListChunked.html) * [datatypes::ObjectChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.ObjectChunked.html) * [datatypes::PlHashMap](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlHashMap.html) * [datatypes::PlHashSet](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlHashSet.html) * [datatypes::PlIdHashMap](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlIdHashMap.html) * [datatypes::PlIndexMap](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlIndexMap.html) * [datatypes::PlIndexSet](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlIndexSet.html) * [datatypes::PlRandomState](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlRandomState.html) * [datatypes::StringChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.StringChunked.html) * [datatypes::TimeChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.TimeChunked.html) * [datatypes::UInt128Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.UInt128Chunked.html) * [datatypes::UInt16Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.UInt16Chunked.html) * [datatypes::UInt32Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.UInt32Chunked.html) * [datatypes::UInt64Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.UInt64Chunked.html) * [datatypes::UInt8Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.UInt8Chunked.html) * [datatypes::categorical::Categorical16Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/categorical/type.Categorical16Chunked.html) * [datatypes::categorical::Categorical32Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/categorical/type.Categorical32Chunked.html) * [datatypes::categorical::Categorical8Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/categorical/type.Categorical8Chunked.html) * [datatypes::categorical::CategoricalChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/categorical/type.CategoricalChunked.html) * [error::PolarsResult](https://docs.pola.rs/api/rust/dev/polars/error/type.PolarsResult.html) * [frame::group\_by::BorrowIdxItem](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/type.BorrowIdxItem.html) * [frame::group\_by::GroupsSlice](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/type.GroupsSlice.html) * [frame::group\_by::IdxItem](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/type.IdxItem.html) * [prelude::AllowedOptimizations](https://docs.pola.rs/api/rust/dev/polars/prelude/type.AllowedOptimizations.html) * [prelude::ArrayChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ArrayChunked.html) * [prelude::ArrayRef](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ArrayRef.html) * [prelude::ArrowSchema](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ArrowSchema.html) * [prelude::BinaryChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.BinaryChunked.html) * [prelude::BinaryChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/type.BinaryChunkedBuilder.html) * [prelude::BinaryOffsetChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.BinaryOffsetChunked.html) * [prelude::BooleanChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.BooleanChunked.html) * [prelude::BorrowIdxItem](https://docs.pola.rs/api/rust/dev/polars/prelude/type.BorrowIdxItem.html) * [prelude::CatSize](https://docs.pola.rs/api/rust/dev/polars/prelude/type.CatSize.html) * [prelude::Categorical16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Categorical16Chunked.html) * [prelude::Categorical32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Categorical32Chunked.html) * [prelude::Categorical8Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Categorical8Chunked.html) * [prelude::CategoricalChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.CategoricalChunked.html) * [prelude::ChunkJoinOptIds](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ChunkJoinOptIds.html) * [prelude::DateChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.DateChunked.html) * [prelude::DatetimeChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.DatetimeChunked.html) * [prelude::DecimalChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.DecimalChunked.html) * [prelude::DurationChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.DurationChunked.html) * [prelude::FieldRef](https://docs.pola.rs/api/rust/dev/polars/prelude/type.FieldRef.html) * [prelude::FieldsNameMapper](https://docs.pola.rs/api/rust/dev/polars/prelude/type.FieldsNameMapper.html) * [prelude::FileMetadataRef](https://docs.pola.rs/api/rust/dev/polars/prelude/type.FileMetadataRef.html) * [prelude::FillNullLimit](https://docs.pola.rs/api/rust/dev/polars/prelude/type.FillNullLimit.html) * [prelude::Float16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Float16Chunked.html) * [prelude::Float32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Float32Chunked.html) * [prelude::Float64Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Float64Chunked.html) * [prelude::GroupsSlice](https://docs.pola.rs/api/rust/dev/polars/prelude/type.GroupsSlice.html) * [prelude::IdxArr](https://docs.pola.rs/api/rust/dev/polars/prelude/type.IdxArr.html) * [prelude::IdxCa](https://docs.pola.rs/api/rust/dev/polars/prelude/type.IdxCa.html) * [prelude::IdxItem](https://docs.pola.rs/api/rust/dev/polars/prelude/type.IdxItem.html) * [prelude::IdxSize](https://docs.pola.rs/api/rust/dev/polars/prelude/type.IdxSize.html) * [prelude::IdxType](https://docs.pola.rs/api/rust/dev/polars/prelude/type.IdxType.html) * [prelude::InnerJoinIds](https://docs.pola.rs/api/rust/dev/polars/prelude/type.InnerJoinIds.html) * [prelude::Int128Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Int128Chunked.html) * [prelude::Int16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Int16Chunked.html) * [prelude::Int32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Int32Chunked.html) * [prelude::Int64Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Int64Chunked.html) * [prelude::Int8Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Int8Chunked.html) * [prelude::LargeBinaryArray](https://docs.pola.rs/api/rust/dev/polars/prelude/type.LargeBinaryArray.html) * [prelude::LargeListArray](https://docs.pola.rs/api/rust/dev/polars/prelude/type.LargeListArray.html) * [prelude::LargeStringArray](https://docs.pola.rs/api/rust/dev/polars/prelude/type.LargeStringArray.html) * [prelude::LeftJoinIds](https://docs.pola.rs/api/rust/dev/polars/prelude/type.LeftJoinIds.html) * [prelude::ListChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ListChunked.html) * [prelude::ObjectChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ObjectChunked.html) * [prelude::OpaqueColumnUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/type.OpaqueColumnUdf.html) * [prelude::OpaqueStreamingAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/type.OpaqueStreamingAgg.html) * [prelude::PlFixedStateQuality](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlFixedStateQuality.html) * [prelude::PlHashMap](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlHashMap.html) * [prelude::PlHashSet](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlHashSet.html) * [prelude::PlIdHashMap](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlIdHashMap.html) * [prelude::PlIndexMap](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlIndexMap.html) * [prelude::PlIndexSet](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlIndexSet.html) * [prelude::PlRandomState](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlRandomState.html) * [prelude::PlRandomStateQuality](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlRandomStateQuality.html) * [prelude::PlSeedableRandomStateQuality](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlSeedableRandomStateQuality.html) * [prelude::PolarsResult](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PolarsResult.html) * [prelude::RenameAliasRustFn](https://docs.pola.rs/api/rust/dev/polars/prelude/type.RenameAliasRustFn.html) * [prelude::RowGroupIterColumns](https://docs.pola.rs/api/rust/dev/polars/prelude/type.RowGroupIterColumns.html) * [prelude::Schema](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Schema.html) * [prelude::SchemaRef](https://docs.pola.rs/api/rust/dev/polars/prelude/type.SchemaRef.html) * [prelude::StringChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.StringChunked.html) * [prelude::StringChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/type.StringChunkedBuilder.html) * [prelude::StructChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.StructChunked.html) * [prelude::TimeChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.TimeChunked.html) * [prelude::UInt128Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt128Chunked.html) * [prelude::UInt16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt16Chunked.html) * [prelude::UInt32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt32Chunked.html) * [prelude::UInt64Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt64Chunked.html) * [prelude::UInt8Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt8Chunked.html) * [prelude::anonymous::OpaqueColumnUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/type.OpaqueColumnUdf.html) * [prelude::anonymous::OpaqueStreamingAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/type.OpaqueStreamingAgg.html) * [prelude::cloud::ObjectStorePath](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/type.ObjectStorePath.html) * [prelude::datatypes::ArrayChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.ArrayChunked.html) * [prelude::datatypes::BinaryChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.BinaryChunked.html) * [prelude::datatypes::BinaryOffsetChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.BinaryOffsetChunked.html) * [prelude::datatypes::BooleanChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.BooleanChunked.html) * [prelude::datatypes::CatSize](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.CatSize.html) * [prelude::datatypes::Categorical16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Categorical16Chunked.html) * [prelude::datatypes::Categorical32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Categorical32Chunked.html) * [prelude::datatypes::Categorical8Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Categorical8Chunked.html) * [prelude::datatypes::CategoricalChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.CategoricalChunked.html) * [prelude::datatypes::DateChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.DateChunked.html) * [prelude::datatypes::DatetimeChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.DatetimeChunked.html) * [prelude::datatypes::DecimalChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.DecimalChunked.html) * [prelude::datatypes::DurationChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.DurationChunked.html) * [prelude::datatypes::FieldRef](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.FieldRef.html) * [prelude::datatypes::Float16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Float16Chunked.html) * [prelude::datatypes::Float32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Float32Chunked.html) * [prelude::datatypes::Float64Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Float64Chunked.html) * [prelude::datatypes::IdxArr](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.IdxArr.html) * [prelude::datatypes::IdxCa](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.IdxCa.html) * [prelude::datatypes::IdxType](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.IdxType.html) * [prelude::datatypes::Int128Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Int128Chunked.html) * [prelude::datatypes::Int16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Int16Chunked.html) * [prelude::datatypes::Int32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Int32Chunked.html) * [prelude::datatypes::Int64Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Int64Chunked.html) * [prelude::datatypes::Int8Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.Int8Chunked.html) * [prelude::datatypes::ListChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.ListChunked.html) * [prelude::datatypes::ObjectChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.ObjectChunked.html) * [prelude::datatypes::PlHashMap](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.PlHashMap.html) * [prelude::datatypes::PlHashSet](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.PlHashSet.html) * [prelude::datatypes::PlIdHashMap](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.PlIdHashMap.html) * [prelude::datatypes::PlIndexMap](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.PlIndexMap.html) * [prelude::datatypes::PlIndexSet](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.PlIndexSet.html) * [prelude::datatypes::PlRandomState](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.PlRandomState.html) * [prelude::datatypes::StringChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.StringChunked.html) * [prelude::datatypes::TimeChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.TimeChunked.html) * [prelude::datatypes::UInt128Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.UInt128Chunked.html) * [prelude::datatypes::UInt16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.UInt16Chunked.html) * [prelude::datatypes::UInt32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.UInt32Chunked.html) * [prelude::datatypes::UInt64Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.UInt64Chunked.html) * [prelude::datatypes::UInt8Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/type.UInt8Chunked.html) * [prelude::datatypes::categorical::Categorical16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/categorical/type.Categorical16Chunked.html) * [prelude::datatypes::categorical::Categorical32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/categorical/type.Categorical32Chunked.html) * [prelude::datatypes::categorical::Categorical8Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/categorical/type.Categorical8Chunked.html) * [prelude::datatypes::categorical::CategoricalChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/categorical/type.CategoricalChunked.html) * [prelude::file\_provider::FileProviderFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/file_provider/type.FileProviderFunction.html) * [prelude::iceberg::IcebergSchemaRef](https://docs.pola.rs/api/rust/dev/polars/prelude/iceberg/type.IcebergSchemaRef.html) * [prelude::streaming::InspectContentFn](https://docs.pola.rs/api/rust/dev/polars/prelude/streaming/type.InspectContentFn.html) * [series::SeriesPhysIter](https://docs.pola.rs/api/rust/dev/polars/series/type.SeriesPhysIter.html) * [series::amortized\_iter::ArrayBox](https://docs.pola.rs/api/rust/dev/polars/series/amortized_iter/type.ArrayBox.html) ### Statics * [datatypes::POLARS\_OBJECT\_EXTENSION\_NAME](https://docs.pola.rs/api/rust/dev/polars/datatypes/static.POLARS_OBJECT_EXTENSION_NAME.html) * [error::constants::FALSE](https://docs.pola.rs/api/rust/dev/polars/error/constants/static.FALSE.html) * [error::constants::LENGTH\_LIMIT\_MSG](https://docs.pola.rs/api/rust/dev/polars/error/constants/static.LENGTH_LIMIT_MSG.html) * [error::constants::TRUE](https://docs.pola.rs/api/rust/dev/polars/error/constants/static.TRUE.html) * [prelude::BOOLEAN\_RE](https://docs.pola.rs/api/rust/dev/polars/prelude/static.BOOLEAN_RE.html) * [prelude::FLOAT\_RE](https://docs.pola.rs/api/rust/dev/polars/prelude/static.FLOAT_RE.html) * [prelude::FLOAT\_RE\_DECIMAL](https://docs.pola.rs/api/rust/dev/polars/prelude/static.FLOAT_RE_DECIMAL.html) * [prelude::INTEGER\_RE](https://docs.pola.rs/api/rust/dev/polars/prelude/static.INTEGER_RE.html) * [prelude::POLARS\_OBJECT\_EXTENSION\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/static.POLARS_OBJECT_EXTENSION_NAME.html) * [prelude::POLARS\_TEMP\_DIR\_BASE\_PATH](https://docs.pola.rs/api/rust/dev/polars/prelude/static.POLARS_TEMP_DIR_BASE_PATH.html) * [prelude::RLE\_LENGTH\_COLUMN\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/static.RLE_LENGTH_COLUMN_NAME.html) * [prelude::RLE\_VALUE\_COLUMN\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/static.RLE_VALUE_COLUMN_NAME.html) * [prelude::cloud::USER\_AGENT](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/static.USER_AGENT.html) * [prelude::cloud::options::USER\_AGENT](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/options/static.USER_AGENT.html) * [prelude::datatypes::POLARS\_OBJECT\_EXTENSION\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/static.POLARS_OBJECT_EXTENSION_NAME.html) ### Constants * [VERSION](https://docs.pola.rs/api/rust/dev/polars/constant.VERSION.html) * [datatypes::IDX\_DTYPE](https://docs.pola.rs/api/rust/dev/polars/datatypes/constant.IDX_DTYPE.html) * [prelude::BUILD\_STREAMING\_EXECUTOR](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.BUILD_STREAMING_EXECUTOR.html) * [prelude::DSL\_VERSION](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.DSL_VERSION.html) * [prelude::HIVE\_VALUE\_ENCODE\_CHARSET](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.HIVE_VALUE_ENCODE_CHARSET.html) * [prelude::IDX\_DTYPE](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.IDX_DTYPE.html) * [prelude::LB\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.LB_NAME.html) * [prelude::NULL](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.NULL.html) * [prelude::UB\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.UB_NAME.html) * [prelude::URL\_ENCODE\_CHARSET](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.URL_ENCODE_CHARSET.html) * [prelude::UTF8\_BOM](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.UTF8_BOM.html) * [prelude::datatypes::IDX\_DTYPE](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/constant.IDX_DTYPE.html) * [prelude::iceberg::LIST\_ELEMENT\_DEFAULT\_ID](https://docs.pola.rs/api/rust/dev/polars/prelude/iceberg/constant.LIST_ELEMENT_DEFAULT_ID.html) --- # Expressions — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/expressions/index.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Expressions[#](https://docs.pola.rs/api/python/stable/reference/expressions/index.html#expressions "Link to this heading") =========================================================================================================================== This page gives an overview of all public Polars expressions. _class_ polars.Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L132-L11798) Expressions that can be used in various contexts. **Methods:** | | | | --- | --- | | [`abs`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.abs.html#polars.Expr.abs "polars.Expr.abs") | Compute absolute values. | | [`add`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.add.html#polars.Expr.add "polars.Expr.add") | Method equivalent of addition operator `expr + other`. | | [`agg_groups`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.agg_groups.html#polars.Expr.agg_groups "polars.Expr.agg_groups") | Get the group indexes of the group by operation. | | [`alias`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.alias.html#polars.Expr.alias "polars.Expr.alias") | Rename the expression. | | [`all`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.all.html#polars.Expr.all "polars.Expr.all") | Return whether all values in the column are `True`. | | [`and_`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.and_.html#polars.Expr.and_ "polars.Expr.and_") | Method equivalent of bitwise "and" operator `expr & other & ...`. | | [`any`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.any.html#polars.Expr.any "polars.Expr.any") | Return whether any of the values in the column are `True`. | | [`append`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.append.html#polars.Expr.append "polars.Expr.append") | Append expressions. | | [`approx_n_unique`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.approx_n_unique.html#polars.Expr.approx_n_unique "polars.Expr.approx_n_unique") | Approximate count of unique values. | | [`arccos`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arccos.html#polars.Expr.arccos "polars.Expr.arccos") | Compute the element-wise value for the inverse cosine. | | [`arccosh`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arccosh.html#polars.Expr.arccosh "polars.Expr.arccosh") | Compute the element-wise value for the inverse hyperbolic cosine. | | [`arcsin`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arcsin.html#polars.Expr.arcsin "polars.Expr.arcsin") | Compute the element-wise value for the inverse sine. | | [`arcsinh`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arcsinh.html#polars.Expr.arcsinh "polars.Expr.arcsinh") | Compute the element-wise value for the inverse hyperbolic sine. | | [`arctan`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arctan.html#polars.Expr.arctan "polars.Expr.arctan") | Compute the element-wise value for the inverse tangent. | | [`arctanh`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arctanh.html#polars.Expr.arctanh "polars.Expr.arctanh") | Compute the element-wise value for the inverse hyperbolic tangent. | | [`arg_max`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arg_max.html#polars.Expr.arg_max "polars.Expr.arg_max") | Get the index of the maximal value. | | [`arg_min`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arg_min.html#polars.Expr.arg_min "polars.Expr.arg_min") | Get the index of the minimal value. | | [`arg_sort`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arg_sort.html#polars.Expr.arg_sort "polars.Expr.arg_sort") | Get the index values that would sort this column. | | [`arg_true`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arg_true.html#polars.Expr.arg_true "polars.Expr.arg_true") | Return indices where expression evaluates `True`. | | [`arg_unique`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.arg_unique.html#polars.Expr.arg_unique "polars.Expr.arg_unique") | Get index of first unique value. | | [`backward_fill`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.backward_fill.html#polars.Expr.backward_fill "polars.Expr.backward_fill") | Fill missing values with the next non-null value. | | [`bitwise_and`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bitwise_and.html#polars.Expr.bitwise_and "polars.Expr.bitwise_and") | Perform an aggregation of bitwise ANDs. | | [`bitwise_count_ones`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bitwise_count_ones.html#polars.Expr.bitwise_count_ones "polars.Expr.bitwise_count_ones") | Evaluate the number of set bits. | | [`bitwise_count_zeros`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bitwise_count_zeros.html#polars.Expr.bitwise_count_zeros "polars.Expr.bitwise_count_zeros") | Evaluate the number of unset bits. | | [`bitwise_leading_ones`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bitwise_leading_ones.html#polars.Expr.bitwise_leading_ones "polars.Expr.bitwise_leading_ones") | Evaluate the number most-significant set bits before seeing an unset bit. | | [`bitwise_leading_zeros`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bitwise_leading_zeros.html#polars.Expr.bitwise_leading_zeros "polars.Expr.bitwise_leading_zeros") | Evaluate the number most-significant unset bits before seeing a set bit. | | [`bitwise_or`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bitwise_or.html#polars.Expr.bitwise_or "polars.Expr.bitwise_or") | Perform an aggregation of bitwise ORs. | | [`bitwise_trailing_ones`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bitwise_trailing_ones.html#polars.Expr.bitwise_trailing_ones "polars.Expr.bitwise_trailing_ones") | Evaluate the number least-significant set bits before seeing an unset bit. | | [`bitwise_trailing_zeros`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bitwise_trailing_zeros.html#polars.Expr.bitwise_trailing_zeros "polars.Expr.bitwise_trailing_zeros") | Evaluate the number least-significant unset bits before seeing a set bit. | | [`bitwise_xor`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bitwise_xor.html#polars.Expr.bitwise_xor "polars.Expr.bitwise_xor") | Perform an aggregation of bitwise XORs. | | [`bottom_k`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bottom_k.html#polars.Expr.bottom_k "polars.Expr.bottom_k") | Return the `k` smallest elements. | | [`bottom_k_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bottom_k_by.html#polars.Expr.bottom_k_by "polars.Expr.bottom_k_by") | Return the elements corresponding to the `k` smallest elements of the `by` column(s). | | [`cast`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html#polars.Expr.cast "polars.Expr.cast") | Cast between data types. | | [`cbrt`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cbrt.html#polars.Expr.cbrt "polars.Expr.cbrt") | Compute the cube root of the elements. | | [`ceil`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.ceil.html#polars.Expr.ceil "polars.Expr.ceil") | Rounds up to the nearest integer value. | | [`clip`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.clip.html#polars.Expr.clip "polars.Expr.clip") | Set values outside the given boundaries to the boundary value. | | [`cos`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cos.html#polars.Expr.cos "polars.Expr.cos") | Compute the element-wise value for the cosine. | | [`cosh`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cosh.html#polars.Expr.cosh "polars.Expr.cosh") | Compute the element-wise value for the hyperbolic cosine. | | [`cot`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cot.html#polars.Expr.cot "polars.Expr.cot") | Compute the element-wise value for the cotangent. | | [`count`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.count.html#polars.Expr.count "polars.Expr.count") | Return the number of non-null elements in the column. | | [`cum_count`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cum_count.html#polars.Expr.cum_count "polars.Expr.cum_count") | Return the cumulative count of the non-null values in the column. | | [`cum_max`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cum_max.html#polars.Expr.cum_max "polars.Expr.cum_max") | Get an array with the cumulative max computed at every element. | | [`cum_min`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cum_min.html#polars.Expr.cum_min "polars.Expr.cum_min") | Get an array with the cumulative min computed at every element. | | [`cum_prod`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cum_prod.html#polars.Expr.cum_prod "polars.Expr.cum_prod") | Get an array with the cumulative product computed at every element. | | [`cum_sum`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cum_sum.html#polars.Expr.cum_sum "polars.Expr.cum_sum") | Get an array with the cumulative sum computed at every element. | | [`cumulative_eval`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cumulative_eval.html#polars.Expr.cumulative_eval "polars.Expr.cumulative_eval") | Run an expression over a sliding window that increases `1` slot every iteration. | | [`cut`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cut.html#polars.Expr.cut "polars.Expr.cut") | Bin continuous values into discrete categories. | | [`degrees`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.degrees.html#polars.Expr.degrees "polars.Expr.degrees") | Convert from radians to degrees. | | [`deserialize`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.deserialize.html#polars.Expr.deserialize "polars.Expr.deserialize") | Read a serialized expression from a file. | | [`diff`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.diff.html#polars.Expr.diff "polars.Expr.diff") | Calculate the first discrete difference between shifted items. | | [`dot`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.dot.html#polars.Expr.dot "polars.Expr.dot") | Compute the dot/inner product between two Expressions. | | [`drop_nans`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.drop_nans.html#polars.Expr.drop_nans "polars.Expr.drop_nans") | Drop all floating point NaN values. | | [`drop_nulls`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.drop_nulls.html#polars.Expr.drop_nulls "polars.Expr.drop_nulls") | Drop all null values. | | [`entropy`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.entropy.html#polars.Expr.entropy "polars.Expr.entropy") | Computes the entropy. | | [`eq`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.eq.html#polars.Expr.eq "polars.Expr.eq") | Method equivalent of equality operator `expr == other`. | | [`eq_missing`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.eq_missing.html#polars.Expr.eq_missing "polars.Expr.eq_missing") | Method equivalent of equality operator `expr == other` where `None == None`. | | [`ewm_mean`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.ewm_mean.html#polars.Expr.ewm_mean "polars.Expr.ewm_mean") | Compute exponentially-weighted moving average. | | [`ewm_mean_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.ewm_mean_by.html#polars.Expr.ewm_mean_by "polars.Expr.ewm_mean_by") | Compute time-based exponentially weighted moving average. | | [`ewm_std`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.ewm_std.html#polars.Expr.ewm_std "polars.Expr.ewm_std") | Compute exponentially-weighted moving standard deviation. | | [`ewm_var`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.ewm_var.html#polars.Expr.ewm_var "polars.Expr.ewm_var") | Compute exponentially-weighted moving variance. | | [`exclude`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.exclude.html#polars.Expr.exclude "polars.Expr.exclude") | Exclude columns from a multi-column expression. | | [`exp`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.exp.html#polars.Expr.exp "polars.Expr.exp") | Compute the exponential, element-wise. | | [`explode`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.explode.html#polars.Expr.explode "polars.Expr.explode") | Explode a list expression. | | [`extend_constant`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.extend_constant.html#polars.Expr.extend_constant "polars.Expr.extend_constant") | Extremely fast method for extending the Series with 'n' copies of a value. | | [`fill_nan`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_nan.html#polars.Expr.fill_nan "polars.Expr.fill_nan") | Fill floating point NaN value with a fill value. | | [`fill_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_null.html#polars.Expr.fill_null "polars.Expr.fill_null") | Fill null values using the specified value or strategy. | | [`filter`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.filter.html#polars.Expr.filter "polars.Expr.filter") | Filter the expression based on one or more predicate expressions. | | [`first`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.first.html#polars.Expr.first "polars.Expr.first") | Get the first value. | | [`flatten`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.flatten.html#polars.Expr.flatten "polars.Expr.flatten") | Flatten a list or string column. | | [`floor`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.floor.html#polars.Expr.floor "polars.Expr.floor") | Rounds down to the nearest integer value. | | [`floordiv`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.floordiv.html#polars.Expr.floordiv "polars.Expr.floordiv") | Method equivalent of integer division operator `expr // other`. | | [`forward_fill`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.forward_fill.html#polars.Expr.forward_fill "polars.Expr.forward_fill") | Fill missing values with the last non-null value. | | [`from_json`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.from_json.html#polars.Expr.from_json "polars.Expr.from_json") | Read an expression from a JSON encoded string to construct an Expression. | | [`gather`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.gather.html#polars.Expr.gather "polars.Expr.gather") | Take values by index. | | [`gather_every`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.gather_every.html#polars.Expr.gather_every "polars.Expr.gather_every") | Take every nth value in the Series and return as a new Series. | | [`ge`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.ge.html#polars.Expr.ge "polars.Expr.ge") | Method equivalent of "greater than or equal" operator `expr >= other`. | | [`get`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.get.html#polars.Expr.get "polars.Expr.get") | Return a single value by index. | | [`gt`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.gt.html#polars.Expr.gt "polars.Expr.gt") | Method equivalent of "greater than" operator `expr > other`. | | [`has_nulls`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.has_nulls.html#polars.Expr.has_nulls "polars.Expr.has_nulls") | Check whether the expression contains one or more null values. | | [`hash`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.hash.html#polars.Expr.hash "polars.Expr.hash") | Hash the elements in the selection. | | [`head`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.head.html#polars.Expr.head "polars.Expr.head") | Get the first `n` rows. | | [`hist`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.hist.html#polars.Expr.hist "polars.Expr.hist") | Bin values into buckets and count their occurrences. | | [`implode`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.implode.html#polars.Expr.implode "polars.Expr.implode") | Aggregate values into a list. | | [`index_of`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.index_of.html#polars.Expr.index_of "polars.Expr.index_of") | Get the index of the first occurrence of a value, or `None` if it's not found. | | [`inspect`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.inspect.html#polars.Expr.inspect "polars.Expr.inspect") | Print the value that this expression evaluates to and pass on the value. | | [`interpolate`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.interpolate.html#polars.Expr.interpolate "polars.Expr.interpolate") | Interpolate intermediate values. | | [`interpolate_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.interpolate_by.html#polars.Expr.interpolate_by "polars.Expr.interpolate_by") | Fill null values using interpolation based on another column. | | [`is_between`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_between.html#polars.Expr.is_between "polars.Expr.is_between") | Check if this expression is between the given lower and upper bounds. | | [`is_close`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_close.html#polars.Expr.is_close "polars.Expr.is_close") | Check if this expression is close, i.e. almost equal, to the other expression. | | [`is_duplicated`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_duplicated.html#polars.Expr.is_duplicated "polars.Expr.is_duplicated") | Return a boolean mask indicating duplicated values. | | [`is_finite`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_finite.html#polars.Expr.is_finite "polars.Expr.is_finite") | Returns a boolean Series indicating which values are finite. | | [`is_first_distinct`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_first_distinct.html#polars.Expr.is_first_distinct "polars.Expr.is_first_distinct") | Return a boolean mask indicating the first occurrence of each distinct value. | | [`is_in`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_in.html#polars.Expr.is_in "polars.Expr.is_in") | Check if elements of this expression are present in the other Series. | | [`is_infinite`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_infinite.html#polars.Expr.is_infinite "polars.Expr.is_infinite") | Returns a boolean Series indicating which values are infinite. | | [`is_last_distinct`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_last_distinct.html#polars.Expr.is_last_distinct "polars.Expr.is_last_distinct") | Return a boolean mask indicating the last occurrence of each distinct value. | | [`is_nan`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_nan.html#polars.Expr.is_nan "polars.Expr.is_nan") | Returns a boolean Series indicating which values are NaN. | | [`is_not_nan`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_not_nan.html#polars.Expr.is_not_nan "polars.Expr.is_not_nan") | Returns a boolean Series indicating which values are not NaN. | | [`is_not_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_not_null.html#polars.Expr.is_not_null "polars.Expr.is_not_null") | Returns a boolean Series indicating which values are not null. | | [`is_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_null.html#polars.Expr.is_null "polars.Expr.is_null") | Returns a boolean Series indicating which values are null. | | [`is_unique`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.is_unique.html#polars.Expr.is_unique "polars.Expr.is_unique") | Get mask of unique values. | | [`item`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.item.html#polars.Expr.item "polars.Expr.item") | Get the single value. | | [`kurtosis`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.kurtosis.html#polars.Expr.kurtosis "polars.Expr.kurtosis") | Compute the kurtosis (Fisher or Pearson) of a dataset. | | [`last`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.last.html#polars.Expr.last "polars.Expr.last") | Get the last value. | | [`le`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.le.html#polars.Expr.le "polars.Expr.le") | Method equivalent of "less than or equal" operator `expr <= other`. | | [`len`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.len.html#polars.Expr.len "polars.Expr.len") | Return the number of elements in the column. | | [`limit`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.limit.html#polars.Expr.limit "polars.Expr.limit") | Get the first `n` rows (alias for [`Expr.head()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.head.html#polars.Expr.head "polars.Expr.head")
). | | [`log`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.log.html#polars.Expr.log "polars.Expr.log") | Compute the logarithm to a given base. | | [`log10`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.log10.html#polars.Expr.log10 "polars.Expr.log10") | Compute the base 10 logarithm of the input array, element-wise. | | [`log1p`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.log1p.html#polars.Expr.log1p "polars.Expr.log1p") | Compute the natural logarithm of each element plus one. | | [`lower_bound`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.lower_bound.html#polars.Expr.lower_bound "polars.Expr.lower_bound") | Calculate the lower bound. | | [`lt`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.lt.html#polars.Expr.lt "polars.Expr.lt") | Method equivalent of "less than" operator `expr < other`. | | [`map_batches`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.map_batches.html#polars.Expr.map_batches "polars.Expr.map_batches") | Apply a custom python function to a whole Series or sequence of Series. | | [`map_elements`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.map_elements.html#polars.Expr.map_elements "polars.Expr.map_elements") | Map a custom/user-defined function (UDF) to each element of a column. | | [`max`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.max.html#polars.Expr.max "polars.Expr.max") | Get maximum value. | | [`max_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.max_by.html#polars.Expr.max_by "polars.Expr.max_by") | Get maximum value, ordered by another expression. | | [`mean`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.mean.html#polars.Expr.mean "polars.Expr.mean") | Get mean value. | | [`median`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.median.html#polars.Expr.median "polars.Expr.median") | Get median value using linear interpolation. | | [`min`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.min.html#polars.Expr.min "polars.Expr.min") | Get minimum value. | | [`min_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.min_by.html#polars.Expr.min_by "polars.Expr.min_by") | Get minimum value, ordered by another expression. | | [`mod`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.mod.html#polars.Expr.mod "polars.Expr.mod") | Method equivalent of modulus operator `expr % other`. | | [`mode`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.mode.html#polars.Expr.mode "polars.Expr.mode") | Compute the most occurring value(s). | | [`mul`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.mul.html#polars.Expr.mul "polars.Expr.mul") | Method equivalent of multiplication operator `expr * other`. | | [`n_unique`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.n_unique.html#polars.Expr.n_unique "polars.Expr.n_unique") | Count unique values. | | [`nan_max`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.nan_max.html#polars.Expr.nan_max "polars.Expr.nan_max") | Get maximum value, but propagate/poison encountered NaN values. | | [`nan_min`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.nan_min.html#polars.Expr.nan_min "polars.Expr.nan_min") | Get minimum value, but propagate/poison encountered NaN values. | | [`ne`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.ne.html#polars.Expr.ne "polars.Expr.ne") | Method equivalent of inequality operator `expr != other`. | | [`ne_missing`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.ne_missing.html#polars.Expr.ne_missing "polars.Expr.ne_missing") | Method equivalent of equality operator `expr != other` where `None == None`. | | [`neg`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.neg.html#polars.Expr.neg "polars.Expr.neg") | Method equivalent of unary minus operator `-expr`. | | [`not_`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.not_.html#polars.Expr.not_ "polars.Expr.not_") | Method equivalent of bitwise "not" operator `~expr`. | | [`null_count`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.null_count.html#polars.Expr.null_count "polars.Expr.null_count") | Count null values. | | [`or_`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.or_.html#polars.Expr.or_ "polars.Expr.or_") | Method equivalent of bitwise "or" operator `expr \| other \| ...`. | | [`over`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.over.html#polars.Expr.over "polars.Expr.over") | Compute expressions over the given groups. | | [`pct_change`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.pct_change.html#polars.Expr.pct_change "polars.Expr.pct_change") | Computes percentage change between values. | | [`peak_max`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.peak_max.html#polars.Expr.peak_max "polars.Expr.peak_max") | Get a boolean mask of the local maximum peaks. | | [`peak_min`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.peak_min.html#polars.Expr.peak_min "polars.Expr.peak_min") | Get a boolean mask of the local minimum peaks. | | [`pipe`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.pipe.html#polars.Expr.pipe "polars.Expr.pipe") | Offers a structured way to apply a sequence of user-defined functions (UDFs). | | [`pow`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.pow.html#polars.Expr.pow "polars.Expr.pow") | Method equivalent of exponentiation operator `expr ** exponent`. | | [`product`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.product.html#polars.Expr.product "polars.Expr.product") | Compute the product of an expression. | | [`qcut`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.qcut.html#polars.Expr.qcut "polars.Expr.qcut") | Bin continuous values into discrete categories based on their quantiles. | | [`quantile`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.quantile.html#polars.Expr.quantile "polars.Expr.quantile") | Get quantile value. | | [`radians`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.radians.html#polars.Expr.radians "polars.Expr.radians") | Convert from degrees to radians. | | [`rank`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rank.html#polars.Expr.rank "polars.Expr.rank") | Assign ranks to data, dealing with ties appropriately. | | [`rechunk`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rechunk.html#polars.Expr.rechunk "polars.Expr.rechunk") | Create a single chunk of memory for this Series. | | `register_plugin` | Register a plugin function. | | [`reinterpret`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.reinterpret.html#polars.Expr.reinterpret "polars.Expr.reinterpret") | Reinterpret the underlying bits as a signed/unsigned integer. | | [`repeat_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.repeat_by.html#polars.Expr.repeat_by "polars.Expr.repeat_by") | Repeat the elements in this Series as specified in the given expression. | | [`replace`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.replace.html#polars.Expr.replace "polars.Expr.replace") | Replace the given values by different values of the same data type. | | [`replace_strict`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.replace_strict.html#polars.Expr.replace_strict "polars.Expr.replace_strict") | Replace all values by different values. | | [`reshape`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.reshape.html#polars.Expr.reshape "polars.Expr.reshape") | Reshape this Expr to a flat column or an Array column. | | [`reverse`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.reverse.html#polars.Expr.reverse "polars.Expr.reverse") | Reverse the selection. | | [`rle`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rle.html#polars.Expr.rle "polars.Expr.rle") | Compress the column data using run-length encoding. | | [`rle_id`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rle_id.html#polars.Expr.rle_id "polars.Expr.rle_id") | Get a distinct integer ID for each run of identical values. | | [`rolling`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling.html#polars.Expr.rolling "polars.Expr.rolling") | Create rolling groups based on a temporal or integer column. | | [`rolling_kurtosis`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_kurtosis.html#polars.Expr.rolling_kurtosis "polars.Expr.rolling_kurtosis") | Compute a rolling kurtosis. | | [`rolling_map`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_map.html#polars.Expr.rolling_map "polars.Expr.rolling_map") | Compute a custom rolling window function. | | [`rolling_max`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_max.html#polars.Expr.rolling_max "polars.Expr.rolling_max") | Apply a rolling max (moving max) over the values in this array. | | [`rolling_max_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_max_by.html#polars.Expr.rolling_max_by "polars.Expr.rolling_max_by") | Apply a rolling max based on another column. | | [`rolling_mean`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_mean.html#polars.Expr.rolling_mean "polars.Expr.rolling_mean") | Apply a rolling mean (moving mean) over the values in this array. | | [`rolling_mean_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_mean_by.html#polars.Expr.rolling_mean_by "polars.Expr.rolling_mean_by") | Apply a rolling mean based on another column. | | [`rolling_median`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_median.html#polars.Expr.rolling_median "polars.Expr.rolling_median") | Compute a rolling median. | | [`rolling_median_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_median_by.html#polars.Expr.rolling_median_by "polars.Expr.rolling_median_by") | Compute a rolling median based on another column. | | [`rolling_min`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_min.html#polars.Expr.rolling_min "polars.Expr.rolling_min") | Apply a rolling min (moving min) over the values in this array. | | [`rolling_min_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_min_by.html#polars.Expr.rolling_min_by "polars.Expr.rolling_min_by") | Apply a rolling min based on another column. | | [`rolling_quantile`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_quantile.html#polars.Expr.rolling_quantile "polars.Expr.rolling_quantile") | Compute a rolling quantile. | | [`rolling_quantile_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_quantile_by.html#polars.Expr.rolling_quantile_by "polars.Expr.rolling_quantile_by") | Compute a rolling quantile based on another column. | | [`rolling_rank`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_rank.html#polars.Expr.rolling_rank "polars.Expr.rolling_rank") | Compute a rolling rank. | | [`rolling_rank_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_rank_by.html#polars.Expr.rolling_rank_by "polars.Expr.rolling_rank_by") | Compute a rolling rank based on another column. | | [`rolling_skew`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_skew.html#polars.Expr.rolling_skew "polars.Expr.rolling_skew") | Compute a rolling skew. | | [`rolling_std`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_std.html#polars.Expr.rolling_std "polars.Expr.rolling_std") | Compute a rolling standard deviation. | | [`rolling_std_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_std_by.html#polars.Expr.rolling_std_by "polars.Expr.rolling_std_by") | Compute a rolling standard deviation based on another column. | | [`rolling_sum`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_sum.html#polars.Expr.rolling_sum "polars.Expr.rolling_sum") | Apply a rolling sum (moving sum) over the values in this array. | | [`rolling_sum_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_sum_by.html#polars.Expr.rolling_sum_by "polars.Expr.rolling_sum_by") | Apply a rolling sum based on another column. | | [`rolling_var`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_var.html#polars.Expr.rolling_var "polars.Expr.rolling_var") | Compute a rolling variance. | | [`rolling_var_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_var_by.html#polars.Expr.rolling_var_by "polars.Expr.rolling_var_by") | Compute a rolling variance based on another column. | | [`round`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.round.html#polars.Expr.round "polars.Expr.round") | Round underlying floating point data by `decimals` digits. | | [`round_sig_figs`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.round_sig_figs.html#polars.Expr.round_sig_figs "polars.Expr.round_sig_figs") | Round to a number of significant figures. | | [`sample`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sample.html#polars.Expr.sample "polars.Expr.sample") | Sample from this expression. | | [`search_sorted`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.search_sorted.html#polars.Expr.search_sorted "polars.Expr.search_sorted") | Find indices where elements should be inserted to maintain order. | | [`set_sorted`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.set_sorted.html#polars.Expr.set_sorted "polars.Expr.set_sorted") | Flags the expression as 'sorted'. | | [`shift`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.shift.html#polars.Expr.shift "polars.Expr.shift") | Shift values by the given number of indices. | | [`shrink_dtype`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.shrink_dtype.html#polars.Expr.shrink_dtype "polars.Expr.shrink_dtype") | Shrink numeric columns to the minimal required datatype. | | [`shuffle`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.shuffle.html#polars.Expr.shuffle "polars.Expr.shuffle") | Shuffle the contents of this expression. | | [`sign`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sign.html#polars.Expr.sign "polars.Expr.sign") | Compute the element-wise sign function on numeric types. | | [`sin`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sin.html#polars.Expr.sin "polars.Expr.sin") | Compute the element-wise value for the sine. | | [`sinh`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sinh.html#polars.Expr.sinh "polars.Expr.sinh") | Compute the element-wise value for the hyperbolic sine. | | [`skew`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.skew.html#polars.Expr.skew "polars.Expr.skew") | Compute the sample skewness of a data set. | | [`slice`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.slice.html#polars.Expr.slice "polars.Expr.slice") | Get a slice of this expression. | | [`sort`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sort.html#polars.Expr.sort "polars.Expr.sort") | Sort this column. | | [`sort_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sort_by.html#polars.Expr.sort_by "polars.Expr.sort_by") | Sort this column by the ordering of other columns. | | [`sqrt`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sqrt.html#polars.Expr.sqrt "polars.Expr.sqrt") | Compute the square root of the elements. | | [`std`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.std.html#polars.Expr.std "polars.Expr.std") | Get standard deviation. | | [`sub`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sub.html#polars.Expr.sub "polars.Expr.sub") | Method equivalent of subtraction operator `expr - other`. | | [`sum`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sum.html#polars.Expr.sum "polars.Expr.sum") | Get sum value. | | [`tail`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.tail.html#polars.Expr.tail "polars.Expr.tail") | Get the last `n` rows. | | [`tan`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.tan.html#polars.Expr.tan "polars.Expr.tan") | Compute the element-wise value for the tangent. | | [`tanh`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.tanh.html#polars.Expr.tanh "polars.Expr.tanh") | Compute the element-wise value for the hyperbolic tangent. | | [`to_physical`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.to_physical.html#polars.Expr.to_physical "polars.Expr.to_physical") | Cast to physical representation of the logical dtype. | | [`top_k`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.top_k.html#polars.Expr.top_k "polars.Expr.top_k") | Return the `k` largest elements. | | [`top_k_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.top_k_by.html#polars.Expr.top_k_by "polars.Expr.top_k_by") | Return the elements corresponding to the `k` largest elements of the `by` column(s). | | [`truediv`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.truediv.html#polars.Expr.truediv "polars.Expr.truediv") | Method equivalent of float division operator `expr / other`. | | [`unique`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.unique.html#polars.Expr.unique "polars.Expr.unique") | Get unique values of this expression. | | [`unique_counts`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.unique_counts.html#polars.Expr.unique_counts "polars.Expr.unique_counts") | Return a count of the unique values in the order of appearance. | | [`upper_bound`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.upper_bound.html#polars.Expr.upper_bound "polars.Expr.upper_bound") | Calculate the upper bound. | | [`value_counts`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.value_counts.html#polars.Expr.value_counts "polars.Expr.value_counts") | Count the occurrence of unique values. | | [`var`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.var.html#polars.Expr.var "polars.Expr.var") | Get variance. | | [`where`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.where.html#polars.Expr.where "polars.Expr.where") | Filter a single column. | | [`xor`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.xor.html#polars.Expr.xor "polars.Expr.xor") | Method equivalent of bitwise exclusive-or operator `expr ^ other`. | abs() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9080-L9106) Compute absolute values. Same as `abs(expr)`. Examples \>>> df \= pl.DataFrame( ... { ... "A": \[\-1.0, 0.0, 1.0, 2.0\], ... } ... ) \>>> df.select(pl.col("A").abs()) shape: (4, 1) ┌─────┐ │ A │ │ --- │ │ f64 │ ╞═════╡ │ 1.0 │ │ 0.0 │ │ 1.0 │ │ 2.0 │ └─────┘ add(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5671-L5715) Method equivalent of addition operator `expr + other`. Parameters: **other** numeric or string value; accepts expression input. Examples \>>> df \= pl.DataFrame({"x": \[1, 2, 3, 4, 5\]}) \>>> df.with\_columns( ... pl.col("x").add(2).alias("x+int"), ... pl.col("x").add(pl.col("x").cum\_prod()).alias("x+expr"), ... ) shape: (5, 3) ┌─────┬───────┬────────┐ │ x ┆ x+int ┆ x+expr │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═══════╪════════╡ │ 1 ┆ 3 ┆ 2 │ │ 2 ┆ 4 ┆ 4 │ │ 3 ┆ 5 ┆ 9 │ │ 4 ┆ 6 ┆ 28 │ │ 5 ┆ 7 ┆ 125 │ └─────┴───────┴────────┘ \>>> df \= pl.DataFrame( ... {"x": \["a", "d", "g"\], "y": \["b", "e", "h"\], "z": \["c", "f", "i"\]} ... ) \>>> df.with\_columns(pl.col("x").add(pl.col("y")).add(pl.col("z")).alias("xyz")) shape: (3, 4) ┌─────┬─────┬─────┬─────┐ │ x ┆ y ┆ z ┆ xyz │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ str │ ╞═════╪═════╪═════╪═════╡ │ a ┆ b ┆ c ┆ abc │ │ d ┆ e ┆ f ┆ def │ │ g ┆ h ┆ i ┆ ghi │ └─────┴─────┴─────┴─────┘ agg\_groups() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1141-L1201) Get the group indexes of the group by operation. Deprecated since version 1.35: use `df.with_row_index().group_by(...).agg(pl.col('index'))` instead. This method will be removed in Polars 2.0. Should be used in aggregation context only. Examples \>>> import warnings \>>> warnings.filterwarnings("ignore", category\=DeprecationWarning) \>>> df \= pl.DataFrame( ... { ... "group": \[\ ... "one",\ ... "one",\ ... "one",\ ... "two",\ ... "two",\ ... "two",\ ... \], ... "value": \[94, 95, 96, 97, 97, 99\], ... } ... ) \>>> df.group\_by("group", maintain\_order\=True).agg(pl.col("value").agg\_groups()) shape: (2, 2) ┌───────┬───────────┐ │ group ┆ value │ │ --- ┆ --- │ │ str ┆ list\[u32\] │ ╞═══════╪═══════════╡ │ one ┆ \[0, 1, 2\] │ │ two ┆ \[3, 4, 5\] │ └───────┴───────────┘ New recommended approach: >>> ( … df.with\_row\_index() … .group\_by(“group”, maintain\_order=True) … .agg(pl.col(“index”)) … ) shape: (2, 2) ┌───────┬───────────┐ │ group ┆ index │ │ — ┆ — │ │ str ┆ list\[u32\] │ ╞═══════╪═══════════╡ │ one ┆ \[0, 1, 2\] │ │ two ┆ \[3, 4, 5\] │ └───────┴───────────┘ alias(_name: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L723-L781) Rename the expression. Parameters: **name** The new name. See also [`name.map`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.name.map.html#polars.Expr.name.map "polars.Expr.name.map") [`name.prefix`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.name.prefix.html#polars.Expr.name.prefix "polars.Expr.name.prefix") [`name.suffix`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.name.suffix.html#polars.Expr.name.suffix "polars.Expr.name.suffix") Examples Rename an expression to avoid overwriting an existing column. \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, 3\], ... "b": \["x", "y", "z"\], ... } ... ) \>>> df.with\_columns( ... pl.col("a") + 10, ... pl.col("b").str.to\_uppercase().alias("c"), ... ) shape: (3, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str │ ╞═════╪═════╪═════╡ │ 11 ┆ x ┆ X │ │ 12 ┆ y ┆ Y │ │ 13 ┆ z ┆ Z │ └─────┴─────┴─────┘ Overwrite the default name of literal columns to prevent errors due to duplicate column names. \>>> df.with\_columns( ... pl.lit(True).alias("c"), ... pl.lit(4.0).alias("d"), ... ) shape: (3, 4) ┌─────┬─────┬──────┬─────┐ │ a ┆ b ┆ c ┆ d │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ bool ┆ f64 │ ╞═════╪═════╪══════╪═════╡ │ 1 ┆ x ┆ true ┆ 4.0 │ │ 2 ┆ y ┆ true ┆ 4.0 │ │ 3 ┆ z ┆ true ┆ 4.0 │ └─────┴─────┴──────┴─────┘ all(_\*_, _ignore\_nulls: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L550-L607) Return whether all values in the column are `True`. Only works on columns of data type `Boolean`. Note This method is not to be confused with the function [`polars.all()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.all.html#polars.all "polars.all") , which can be used to select all columns. Parameters: **ignore\_nulls** * If set to `True` (default), null values are ignored. If there are no non-null values, the output is `True`. * If set to `False`, [Kleene logic](https://en.wikipedia.org/wiki/Three-valued_logic) is used to deal with nulls: if the column contains any null values and no `False` values, the output is null. Returns: Expr Expression of data type `Boolean`. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[True, True\], ... "b": \[False, True\], ... "c": \[None, True\], ... } ... ) \>>> df.select(pl.col("\*").all()) shape: (1, 3) ┌──────┬───────┬──────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ bool ┆ bool ┆ bool │ ╞══════╪═══════╪══════╡ │ true ┆ false ┆ true │ └──────┴───────┴──────┘ Enable Kleene logic by setting `ignore_nulls=False`. \>>> df.select(pl.col("\*").all(ignore\_nulls\=False)) shape: (1, 3) ┌──────┬───────┬──────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ bool ┆ bool ┆ bool │ ╞══════╪═══════╪══════╡ │ true ┆ false ┆ null │ └──────┴───────┴──────┘ and\_(_\*others: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5258-L5321) Method equivalent of bitwise “and” operator `expr & other & ...`. This has the effect of combining logical boolean expressions, but operates bitwise on integers. Parameters: **\*others** One or more integer or boolean expressions to evaluate/combine. Examples \>>> df \= pl.DataFrame( ... data\={ ... "x": \[5, 6, 7, 4, 8\], ... "y": \[1.5, 2.5, 1.0, 4.0, \-5.75\], ... "z": \[\-9, 2, \-1, 4, 8\], ... } ... ) Combine logical “and” conditions: \>>> df.select( ... (pl.col("x") \>= pl.col("z")) ... .and\_( ... pl.col("y") \>= pl.col("z"), ... pl.col("y") \== pl.col("y"), ... pl.col("z") <= pl.col("x"), ... pl.col("y") != pl.col("x"), ... ) ... .alias("all") ... ) shape: (5, 1) ┌───────┐ │ all │ │ --- │ │ bool │ ╞═══════╡ │ true │ │ true │ │ true │ │ false │ │ false │ └───────┘ Bitwise “and” operation on integer columns: \>>> df.select("x", "z", x\_and\_z\=pl.col("x").and\_(pl.col("z"))) shape: (5, 3) ┌─────┬─────┬─────────┐ │ x ┆ z ┆ x\_and\_z │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════════╡ │ 5 ┆ -9 ┆ 5 │ │ 6 ┆ 2 ┆ 2 │ │ 7 ┆ -1 ┆ 7 │ │ 4 ┆ 4 ┆ 4 │ │ 8 ┆ 8 ┆ 8 │ └─────┴─────┴─────────┘ any(_\*_, _ignore\_nulls: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L495-L548) Return whether any of the values in the column are `True`. Only works on columns of data type `Boolean`. Parameters: **ignore\_nulls** * If set to `True` (default), null values are ignored. If there are no non-null values, the output is `False`. * If set to `False`, [Kleene logic](https://en.wikipedia.org/wiki/Three-valued_logic) is used to deal with nulls: if the column contains any null values and no `True` values, the output is null. Returns: Expr Expression of data type `Boolean`. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[True, False\], ... "b": \[False, False\], ... "c": \[None, False\], ... } ... ) \>>> df.select(pl.col("\*").any()) shape: (1, 3) ┌──────┬───────┬───────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ bool ┆ bool ┆ bool │ ╞══════╪═══════╪═══════╡ │ true ┆ false ┆ false │ └──────┴───────┴───────┘ Enable Kleene logic by setting `ignore_nulls=False`. \>>> df.select(pl.col("\*").any(ignore\_nulls\=False)) shape: (1, 3) ┌──────┬───────┬──────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ bool ┆ bool ┆ bool │ ╞══════╪═══════╪══════╡ │ true ┆ false ┆ null │ └──────┴───────┴──────┘ append(_other: IntoExpr_, _\*_, _upcast: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1298-L1331) Append expressions. This is done by adding the chunks of `other` to this `Series`. Parameters: **other** Expression to append. **upcast** Cast both `Series` to the same supertype. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[8, 9, 10\], ... "b": \[None, 4, 4\], ... } ... ) \>>> df.select(pl.all().head(1).append(pl.all().tail(1))) shape: (2, 2) ┌─────┬──────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪══════╡ │ 8 ┆ null │ │ 10 ┆ 4 │ └─────┴──────┘ approx\_n\_unique() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3385-L3417) Approximate count of unique values. This is done using the HyperLogLog++ algorithm for cardinality estimation. Examples \>>> df \= pl.DataFrame({"n": \[1, 1, 2\]}) \>>> df.select(pl.col("n").approx\_n\_unique()) shape: (1, 1) ┌─────┐ │ n │ │ --- │ │ u32 │ ╞═════╡ │ 2 │ └─────┘ \>>> df \= pl.DataFrame({"n": range(1000)}) \>>> df.select( ... exact\=pl.col("n").n\_unique(), ... approx\=pl.col("n").approx\_n\_unique(), ... ) shape: (1, 2) ┌───────┬────────┐ │ exact ┆ approx │ │ --- ┆ --- │ │ u32 ┆ u32 │ ╞═══════╪════════╡ │ 1000 ┆ 1005 │ └───────┴────────┘ arccos() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9698-L9720) Compute the element-wise value for the inverse cosine. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[0.0\]}) \>>> df.select(pl.col("a").arccos()) shape: (1, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 1.570796 │ └──────────┘ arccosh() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9842-L9864) Compute the element-wise value for the inverse hyperbolic cosine. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[1.0\]}) \>>> df.select(pl.col("a").arccosh()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 0.0 │ └─────┘ arcsin() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9674-L9696) Compute the element-wise value for the inverse sine. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[1.0\]}) \>>> df.select(pl.col("a").arcsin()) shape: (1, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 1.570796 │ └──────────┘ arcsinh() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9818-L9840) Compute the element-wise value for the inverse hyperbolic sine. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[1.0\]}) \>>> df.select(pl.col("a").arcsinh()) shape: (1, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 0.881374 │ └──────────┘ arctan() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9722-L9744) Compute the element-wise value for the inverse tangent. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[1.0\]}) \>>> df.select(pl.col("a").arctan()) shape: (1, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 0.785398 │ └──────────┘ arctanh() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9866-L9888) Compute the element-wise value for the inverse hyperbolic tangent. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[1.0\]}) \>>> df.select(pl.col("a").arctanh()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ inf │ └─────┘ arg\_max() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2374-L2395) Get the index of the maximal value. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[20, 10, 30\], ... } ... ) \>>> df.select(pl.col("a").arg\_max()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ u32 │ ╞═════╡ │ 2 │ └─────┘ arg\_min() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2397-L2418) Get the index of the minimal value. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[20, 10, 30\], ... } ... ) \>>> df.select(pl.col("a").arg\_min()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ u32 │ ╞═════╡ │ 1 │ └─────┘ arg\_sort( _\*_, _descending: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _nulls\_last: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2317-L2372) Get the index values that would sort this column. Parameters: **descending** Sort in descending (descending) order. **nulls\_last** Place null values last instead of first. Returns: Expr Expression of data type `UInt32`. See also [`Expr.gather`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.gather.html#polars.Expr.gather "polars.Expr.gather") Take values by index. [`Expr.rank`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rank.html#polars.Expr.rank "polars.Expr.rank") Get the rank of each row. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[20, 10, 30\], ... "b": \[1, 2, 3\], ... } ... ) \>>> df.select(pl.col("a").arg\_sort()) shape: (3, 1) ┌─────┐ │ a │ │ --- │ │ u32 │ ╞═════╡ │ 1 │ │ 0 │ │ 2 │ └─────┘ Use gather to apply the arg sort to other columns. \>>> df.select(pl.col("b").gather(pl.col("a").arg\_sort())) shape: (3, 1) ┌─────┐ │ b │ │ --- │ │ i64 │ ╞═════╡ │ 2 │ │ 1 │ │ 3 │ └─────┘ arg\_true() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L609-L637) Return indices where expression evaluates `True`. Warning Modifies number of rows returned, so will fail in combination with other expressions. Use as only expression in `select` / `with_columns`. See also [`Series.arg_true`](https://docs.pola.rs/api/python/stable/reference/series/api/polars.Series.arg_true.html#polars.Series.arg_true "polars.Series.arg_true") Return indices where Series is True [`polars.arg_where`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.arg_where.html#polars.arg_where "polars.arg_where") Examples \>>> df \= pl.DataFrame({"a": \[1, 1, 2, 1\]}) \>>> df.select((pl.col("a") \== 1).arg\_true()) shape: (3, 1) ┌─────┐ │ a │ │ --- │ │ u32 │ ╞═════╡ │ 0 │ │ 1 │ │ 3 │ └─────┘ arg\_unique() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3469-L3503) Get index of first unique value. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[8, 9, 10\], ... "b": \[None, 4, 4\], ... } ... ) \>>> df.select(pl.col("a").arg\_unique()) shape: (3, 1) ┌─────┐ │ a │ │ --- │ │ u32 │ ╞═════╡ │ 0 │ │ 1 │ │ 2 │ └─────┘ \>>> df.select(pl.col("b").arg\_unique()) shape: (2, 1) ┌─────┐ │ b │ │ --- │ │ u32 │ ╞═════╡ │ 0 │ │ 1 │ └─────┘ backward\_fill(_limit: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3011-L3028) Fill missing values with the next non-null value. This is an alias of `.fill_null(strategy="backward")`. Parameters: **limit** The number of consecutive null values to backward fill. See also [`fill_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_null.html#polars.Expr.fill_null "polars.Expr.fill_null") [`forward_fill`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.forward_fill.html#polars.Expr.forward_fill "polars.Expr.forward_fill") [`shift`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.shift.html#polars.Expr.shift "polars.Expr.shift") bitwise\_and() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11410-L11439) Perform an aggregation of bitwise ANDs. Examples \>>> df \= pl.DataFrame({"n": \[\-1, 0, 1\]}) \>>> df.select(pl.col("n").bitwise\_and()) shape: (1, 1) ┌─────┐ │ n │ │ --- │ │ i64 │ ╞═════╡ │ 0 │ └─────┘ \>>> df \= pl.DataFrame( ... {"grouper": \["a", "a", "a", "b", "b"\], "n": \[\-1, 0, 1, \-1, 1\]} ... ) \>>> df.group\_by("grouper", maintain\_order\=True).agg(pl.col("n").bitwise\_and()) shape: (2, 2) ┌─────────┬─────┐ │ grouper ┆ n │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════════╪═════╡ │ a ┆ 0 │ │ b ┆ 1 │ └─────────┴─────┘ bitwise\_count\_ones() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11386-L11388) Evaluate the number of set bits. bitwise\_count\_zeros() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11390-L11392) Evaluate the number of unset bits. bitwise\_leading\_ones() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11394-L11396) Evaluate the number most-significant set bits before seeing an unset bit. bitwise\_leading\_zeros() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11398-L11400) Evaluate the number most-significant unset bits before seeing a set bit. bitwise\_or() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11441-L11470) Perform an aggregation of bitwise ORs. Examples \>>> df \= pl.DataFrame({"n": \[\-1, 0, 1\]}) \>>> df.select(pl.col("n").bitwise\_or()) shape: (1, 1) ┌─────┐ │ n │ │ --- │ │ i64 │ ╞═════╡ │ -1 │ └─────┘ \>>> df \= pl.DataFrame( ... {"grouper": \["a", "a", "a", "b", "b"\], "n": \[\-1, 0, 1, \-1, 1\]} ... ) \>>> df.group\_by("grouper", maintain\_order\=True).agg(pl.col("n").bitwise\_or()) shape: (2, 2) ┌─────────┬─────┐ │ grouper ┆ n │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════════╪═════╡ │ a ┆ -1 │ │ b ┆ -1 │ └─────────┴─────┘ bitwise\_trailing\_ones() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11402-L11404) Evaluate the number least-significant set bits before seeing an unset bit. bitwise\_trailing\_zeros() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11406-L11408) Evaluate the number least-significant unset bits before seeing a set bit. bitwise\_xor() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11472-L11501) Perform an aggregation of bitwise XORs. Examples \>>> df \= pl.DataFrame({"n": \[\-1, 0, 1\]}) \>>> df.select(pl.col("n").bitwise\_xor()) shape: (1, 1) ┌─────┐ │ n │ │ --- │ │ i64 │ ╞═════╡ │ -2 │ └─────┘ \>>> df \= pl.DataFrame( ... {"grouper": \["a", "a", "a", "b", "b"\], "n": \[\-1, 0, 1, \-1, 1\]} ... ) \>>> df.group\_by("grouper", maintain\_order\=True).agg(pl.col("n").bitwise\_xor()) shape: (2, 2) ┌─────────┬─────┐ │ grouper ┆ n │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════════╪═════╡ │ a ┆ -2 │ │ b ┆ -2 │ └─────────┴─────┘ bottom\_k(_k: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | IntoExprColumn \= 5_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2139-L2187) Return the `k` smallest elements. Non-null elements are always preferred over null elements. The output is not guaranteed to be in any particular order, call [`sort()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sort.html#polars.Expr.sort "polars.Expr.sort") after this function if you wish the output to be sorted. This has time complexity: \\\[O(n)\\\] Parameters: **k** Number of elements to return. See also [`top_k`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.top_k.html#polars.Expr.top_k "polars.Expr.top_k") [`top_k_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.top_k_by.html#polars.Expr.top_k_by "polars.Expr.top_k_by") [`bottom_k_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bottom_k_by.html#polars.Expr.bottom_k_by "polars.Expr.bottom_k_by") Examples \>>> df \= pl.DataFrame( ... { ... "value": \[1, 98, 2, 3, 99, 4\], ... } ... ) \>>> df.select( ... pl.col("value").top\_k().alias("top\_k"), ... pl.col("value").bottom\_k().alias("bottom\_k"), ... ) shape: (5, 2) ┌───────┬──────────┐ │ top\_k ┆ bottom\_k │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═══════╪══════════╡ │ 4 ┆ 1 │ │ 98 ┆ 98 │ │ 2 ┆ 2 │ │ 3 ┆ 3 │ │ 99 ┆ 4 │ └───────┴──────────┘ bottom\_k\_by( _by: IntoExpr | Iterable\[IntoExpr\]_, _k: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | IntoExprColumn \= 5_, _\*_, _reverse: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") | Sequence\[[bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \] \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2189-L2315) Return the elements corresponding to the `k` smallest elements of the `by` column(s). Non-null elements are always preferred over null elements, regardless of the value of `reverse`. The output is not guaranteed to be in any particular order, call [`sort()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sort.html#polars.Expr.sort "polars.Expr.sort") after this function if you wish the output to be sorted. This has time complexity: \\\[O(n \\log{n})\\\] Changed in version 1.0.0: The `descending` parameter was renamed `reverse`. Parameters: **by** Column(s) used to determine the smallest elements. Accepts expression input. Strings are parsed as column names. **k** Number of elements to return. **reverse** Consider the `k` largest elements of the `by` column(s) (instead of the `k` smallest). This can be specified per column by passing a sequence of booleans. See also [`top_k`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.top_k.html#polars.Expr.top_k "polars.Expr.top_k") [`top_k_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.top_k_by.html#polars.Expr.top_k_by "polars.Expr.top_k_by") [`bottom_k`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bottom_k.html#polars.Expr.bottom_k "polars.Expr.bottom_k") Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, 3, 4, 5, 6\], ... "b": \[6, 5, 4, 3, 2, 1\], ... "c": \["Apple", "Orange", "Apple", "Apple", "Banana", "Banana"\], ... } ... ) \>>> df shape: (6, 3) ┌─────┬─────┬────────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪════════╡ │ 1 ┆ 6 ┆ Apple │ │ 2 ┆ 5 ┆ Orange │ │ 3 ┆ 4 ┆ Apple │ │ 4 ┆ 3 ┆ Apple │ │ 5 ┆ 2 ┆ Banana │ │ 6 ┆ 1 ┆ Banana │ └─────┴─────┴────────┘ Get the bottom 2 rows by column `a` or `b`. \>>> df.select( ... pl.all().bottom\_k\_by("a", 2).name.suffix("\_btm\_by\_a"), ... pl.all().bottom\_k\_by("b", 2).name.suffix("\_btm\_by\_b"), ... ) shape: (2, 6) ┌────────────┬────────────┬────────────┬────────────┬────────────┬────────────┐ │ a\_btm\_by\_a ┆ b\_btm\_by\_a ┆ c\_btm\_by\_a ┆ a\_btm\_by\_b ┆ b\_btm\_by\_b ┆ c\_btm\_by\_b │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str ┆ i64 ┆ i64 ┆ str │ ╞════════════╪════════════╪════════════╪════════════╪════════════╪════════════╡ │ 1 ┆ 6 ┆ Apple ┆ 6 ┆ 1 ┆ Banana │ │ 2 ┆ 5 ┆ Orange ┆ 5 ┆ 2 ┆ Banana │ └────────────┴────────────┴────────────┴────────────┴────────────┴────────────┘ Get the bottom 2 rows by multiple columns with given order. \>>> df.select( ... pl.all() ... .bottom\_k\_by(\["c", "a"\], 2, reverse\=\[False, True\]) ... .name.suffix("\_by\_ca"), ... pl.all() ... .bottom\_k\_by(\["c", "b"\], 2, reverse\=\[False, True\]) ... .name.suffix("\_by\_cb"), ... ) shape: (2, 6) ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐ │ a\_by\_ca ┆ b\_by\_ca ┆ c\_by\_ca ┆ a\_by\_cb ┆ b\_by\_cb ┆ c\_by\_cb │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str ┆ i64 ┆ i64 ┆ str │ ╞═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡ │ 4 ┆ 3 ┆ Apple ┆ 1 ┆ 6 ┆ Apple │ │ 3 ┆ 4 ┆ Apple ┆ 3 ┆ 4 ┆ Apple │ └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘ Get the bottom 2 rows by column `a` in each group. \>>> ( ... df.group\_by("c", maintain\_order\=True) ... .agg(pl.all().bottom\_k\_by("a", 2)) ... .explode(pl.all().exclude("c")) ... ) shape: (5, 3) ┌────────┬─────┬─────┐ │ c ┆ a ┆ b │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞════════╪═════╪═════╡ │ Apple ┆ 1 ┆ 6 │ │ Apple ┆ 3 ┆ 4 │ │ Orange ┆ 2 ┆ 5 │ │ Banana ┆ 5 ┆ 2 │ │ Banana ┆ 6 ┆ 1 │ └────────┴─────┴─────┘ cast( _dtype: PolarsDataType | DataTypeExpr | [type](https://docs.python.org/3/library/functions.html#type "(in Python v3.14)") \[Any\]_, _\*_, _strict: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_, _wrap\_numerical: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1835-L1882) Cast between data types. Parameters: **dtype** DataType to cast to. **strict** Raise if cast is invalid on rows after predicates are pushed down. If `False`, invalid casts will produce null values. **wrap\_numerical** If True numeric casts wrap overflowing values instead of marking the cast as invalid. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, 3\], ... "b": \["4", "5", "6"\], ... } ... ) \>>> df.with\_columns( ... pl.col("a").cast(pl.Float64), ... pl.col("b").cast(pl.Int32), ... ) shape: (3, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ f64 ┆ i32 │ ╞═════╪═════╡ │ 1.0 ┆ 4 │ │ 2.0 ┆ 5 │ │ 3.0 ┆ 6 │ └─────┴─────┘ cbrt() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L660-L679) Compute the cube root of the elements. Examples \>>> df \= pl.DataFrame({"values": \[1.0, 2.0, 4.0\]}) \>>> df.select(pl.col("values").cbrt()) shape: (3, 1) ┌──────────┐ │ values │ │ --- │ │ f64 │ ╞══════════╡ │ 1.0 │ │ 1.259921 │ │ 1.587401 │ └──────────┘ ceil() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1661-L1683) Rounds up to the nearest integer value. Only works on floating point Series. Examples \>>> df \= pl.DataFrame({"a": \[0.3, 0.5, 1.0, 1.1\]}) \>>> df.select(pl.col("a").ceil()) shape: (4, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 1.0 │ │ 1.0 │ │ 1.0 │ │ 2.0 │ └─────┘ clip( _lower\_bound: NumericLiteral | TemporalLiteral | IntoExprColumn | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _upper\_bound: NumericLiteral | TemporalLiteral | IntoExprColumn | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9415-L9500) Set values outside the given boundaries to the boundary value. Parameters: **lower\_bound** Lower bound. Accepts expression input. Non-expression inputs are parsed as literals. Strings are parsed as column names. **upper\_bound** Upper bound. Accepts expression input. Non-expression inputs are parsed as literals. Strings are parsed as column names. See also [`when`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.when.html#polars.when "polars.when") Notes This method only works for numeric and temporal columns. To clip other data types, consider writing a `when-then-otherwise` expression. See [`when()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.when.html#polars.when "polars.when") . Examples Specifying both a lower and upper bound: \>>> df \= pl.DataFrame({"a": \[\-50, 5, 50, None\]}) \>>> df.with\_columns(clip\=pl.col("a").clip(1, 10)) shape: (4, 2) ┌──────┬──────┐ │ a ┆ clip │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞══════╪══════╡ │ -50 ┆ 1 │ │ 5 ┆ 5 │ │ 50 ┆ 10 │ │ null ┆ null │ └──────┴──────┘ Specifying only a single bound: \>>> df.with\_columns(clip\=pl.col("a").clip(upper\_bound\=10)) shape: (4, 2) ┌──────┬──────┐ │ a ┆ clip │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞══════╪══════╡ │ -50 ┆ -50 │ │ 5 ┆ 5 │ │ 50 ┆ 10 │ │ null ┆ null │ └──────┴──────┘ Using columns as bounds: \>>> df \= pl.DataFrame( ... {"a": \[\-50, 5, 50, None\], "low": \[10, 1, 0, 0\], "up": \[20, 4, 3, 2\]} ... ) \>>> df.with\_columns(clip\=pl.col("a").clip("low", "up")) shape: (4, 4) ┌──────┬─────┬─────┬──────┐ │ a ┆ low ┆ up ┆ clip │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞══════╪═════╪═════╪══════╡ │ -50 ┆ 10 ┆ 20 ┆ 10 │ │ 5 ┆ 1 ┆ 4 ┆ 4 │ │ 50 ┆ 0 ┆ 3 ┆ 3 │ │ null ┆ 0 ┆ 2 ┆ null │ └──────┴─────┴─────┴──────┘ cos() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9602-L9624) Compute the element-wise value for the cosine. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[0.0\]}) \>>> df.select(pl.col("a").cos()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 1.0 │ └─────┘ cosh() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9770-L9792) Compute the element-wise value for the hyperbolic cosine. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[1.0\]}) \>>> df.select(pl.col("a").cosh()) shape: (1, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 1.543081 │ └──────────┘ cot() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9650-L9672) Compute the element-wise value for the cotangent. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[1.0\]}) \>>> df.select(pl.col("a").cot().round(2)) shape: (1, 1) ┌──────┐ │ a │ │ --- │ │ f64 │ ╞══════╡ │ 0.64 │ └──────┘ count() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1203-L1229) Return the number of non-null elements in the column. Returns: Expr Expression of data type `UInt32`. See also [`len`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.len.html#polars.len "polars.len") Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3\], "b": \[None, 4, 4\]}) \>>> df.select(pl.all().count()) shape: (1, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ u32 ┆ u32 │ ╞═════╪═════╡ │ 3 ┆ 2 │ └─────┴─────┘ cum\_count(_\*_, _reverse: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1607-L1635) Return the cumulative count of the non-null values in the column. Parameters: **reverse** Reverse the operation. Examples \>>> df \= pl.DataFrame({"a": \["x", "k", None, "d"\]}) \>>> df.with\_columns( ... pl.col("a").cum\_count().alias("cum\_count"), ... pl.col("a").cum\_count(reverse\=True).alias("cum\_count\_reverse"), ... ) shape: (4, 3) ┌──────┬───────────┬───────────────────┐ │ a ┆ cum\_count ┆ cum\_count\_reverse │ │ --- ┆ --- ┆ --- │ │ str ┆ u32 ┆ u32 │ ╞══════╪═══════════╪═══════════════════╡ │ x ┆ 1 ┆ 3 │ │ k ┆ 2 ┆ 2 │ │ null ┆ 2 ┆ 1 │ │ d ┆ 3 ┆ 1 │ └──────┴───────────┴───────────────────┘ cum\_max(_\*_, _reverse: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1550-L1605) Get an array with the cumulative max computed at every element. Parameters: **reverse** Reverse the operation. Examples \>>> df \= pl.DataFrame({"a": \[1, 3, 2\]}) \>>> df.with\_columns( ... pl.col("a").cum\_max().alias("cum\_max"), ... pl.col("a").cum\_max(reverse\=True).alias("cum\_max\_reverse"), ... ) shape: (3, 3) ┌─────┬─────────┬─────────────────┐ │ a ┆ cum\_max ┆ cum\_max\_reverse │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════════╪═════════════════╡ │ 1 ┆ 1 ┆ 3 │ │ 3 ┆ 3 ┆ 3 │ │ 2 ┆ 3 ┆ 2 │ └─────┴─────────┴─────────────────┘ Null values are excluded, but can also be filled by calling `fill_null(strategy="forward")`. \>>> df \= pl.DataFrame({"values": \[None, 10, None, 8, 9, None, 16, None\]}) \>>> df.with\_columns( ... pl.col("values").cum\_max().alias("cum\_max"), ... pl.col("values") ... .cum\_max() ... .fill\_null(strategy\="forward") ... .alias("cum\_max\_all\_filled"), ... ) shape: (8, 3) ┌────────┬─────────┬────────────────────┐ │ values ┆ cum\_max ┆ cum\_max\_all\_filled │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞════════╪═════════╪════════════════════╡ │ null ┆ null ┆ null │ │ 10 ┆ 10 ┆ 10 │ │ null ┆ null ┆ 10 │ │ 8 ┆ 10 ┆ 10 │ │ 9 ┆ 10 ┆ 10 │ │ null ┆ null ┆ 10 │ │ 16 ┆ 16 ┆ 16 │ │ null ┆ null ┆ 16 │ └────────┴─────────┴────────────────────┘ cum\_min(_\*_, _reverse: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1521-L1548) Get an array with the cumulative min computed at every element. Parameters: **reverse** Reverse the operation. Examples \>>> df \= pl.DataFrame({"a": \[3, 1, 2\]}) \>>> df.with\_columns( ... pl.col("a").cum\_min().alias("cum\_min"), ... pl.col("a").cum\_min(reverse\=True).alias("cum\_min\_reverse"), ... ) shape: (3, 3) ┌─────┬─────────┬─────────────────┐ │ a ┆ cum\_min ┆ cum\_min\_reverse │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════════╪═════════════════╡ │ 3 ┆ 3 ┆ 1 │ │ 1 ┆ 1 ┆ 1 │ │ 2 ┆ 1 ┆ 2 │ └─────┴─────────┴─────────────────┘ cum\_prod(_\*_, _reverse: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1486-L1519) Get an array with the cumulative product computed at every element. Parameters: **reverse** Reverse the operation. Notes Dtypes in {Int8, UInt8, Int16, UInt16} are cast to Int64 before summing to prevent overflow issues. Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3, 4\]}) \>>> df.with\_columns( ... pl.col("a").cum\_prod().alias("cum\_prod"), ... pl.col("a").cum\_prod(reverse\=True).alias("cum\_prod\_reverse"), ... ) shape: (4, 3) ┌─────┬──────────┬──────────────────┐ │ a ┆ cum\_prod ┆ cum\_prod\_reverse │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪══════════╪══════════════════╡ │ 1 ┆ 1 ┆ 24 │ │ 2 ┆ 2 ┆ 24 │ │ 3 ┆ 6 ┆ 12 │ │ 4 ┆ 24 ┆ 4 │ └─────┴──────────┴──────────────────┘ cum\_sum(_\*_, _reverse: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1424-L1484) Get an array with the cumulative sum computed at every element. Parameters: **reverse** Reverse the operation. Notes Dtypes in {Int8, UInt8, Int16, UInt16} are cast to Int64 before summing to prevent overflow issues. Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3, 4\]}) \>>> df.with\_columns( ... pl.col("a").cum\_sum().alias("cum\_sum"), ... pl.col("a").cum\_sum(reverse\=True).alias("cum\_sum\_reverse"), ... ) shape: (4, 3) ┌─────┬─────────┬─────────────────┐ │ a ┆ cum\_sum ┆ cum\_sum\_reverse │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════════╪═════════════════╡ │ 1 ┆ 1 ┆ 10 │ │ 2 ┆ 3 ┆ 9 │ │ 3 ┆ 6 ┆ 7 │ │ 4 ┆ 10 ┆ 4 │ └─────┴─────────┴─────────────────┘ Null values are excluded, but can also be filled by calling `fill_null(strategy="forward")`. \>>> df \= pl.DataFrame({"values": \[None, 10, None, 8, 9, None, 16, None\]}) \>>> df.with\_columns( ... pl.col("values").cum\_sum().alias("value\_cum\_sum"), ... pl.col("values") ... .cum\_sum() ... .fill\_null(strategy\="forward") ... .alias("value\_cum\_sum\_all\_filled"), ... ) shape: (8, 3) ┌────────┬───────────────┬──────────────────────────┐ │ values ┆ value\_cum\_sum ┆ value\_cum\_sum\_all\_filled │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞════════╪═══════════════╪══════════════════════════╡ │ null ┆ null ┆ null │ │ 10 ┆ 10 ┆ 10 │ │ null ┆ null ┆ 10 │ │ 8 ┆ 18 ┆ 18 │ │ 9 ┆ 27 ┆ 27 │ │ null ┆ null ┆ 27 │ │ 16 ┆ 43 ┆ 43 │ │ null ┆ null ┆ 43 │ └────────┴───────────────┴──────────────────────────┘ cumulative\_eval( _expr: Expr_, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10806-L10855) Run an expression over a sliding window that increases `1` slot every iteration. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **expr** Expression to evaluate **min\_samples** Number of valid values there should be in the window before the expression is evaluated. valid values = `length - null_count` Warning This can be really slow as it can have `O(n^2)` complexity. Don’t use this for operations that visit all elements. Examples \>>> df \= pl.DataFrame({"values": \[1, 2, 3, 4, 5\]}) \>>> df.select( ... \[\ ... pl.col("values").cumulative\_eval(\ ... pl.element().first() \- pl.element().last() \*\* 2\ ... )\ ... \] ... ) shape: (5, 1) ┌────────┐ │ values │ │ --- │ │ i64 │ ╞════════╡ │ 0 │ │ -3 │ │ -8 │ │ -15 │ │ -24 │ └────────┘ cut( _breaks: [Sequence](https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \]_, _\*_, _labels: [Sequence](https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence "(in Python v3.14)") \[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _left\_closed: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _include\_breaks: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4200-L4279) Bin continuous values into discrete categories. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Parameters: **breaks** List of unique cut points. **labels** Names of the categories. The number of labels must be equal to the number of cut points plus one. **left\_closed** Set the intervals to be left-closed instead of right-closed. **include\_breaks** Include a column with the right endpoint of the bin each observation falls in. This will change the data type of the output from a `Categorical` to a `Struct`. Returns: Expr Expression of data type `Categorical` if `include_breaks` is set to `False` (default), otherwise an expression of data type `Struct`. See also [`qcut`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.qcut.html#polars.Expr.qcut "polars.Expr.qcut") Examples Divide a column into three categories. \>>> df \= pl.DataFrame({"foo": \[\-2, \-1, 0, 1, 2\]}) \>>> df.with\_columns( ... pl.col("foo").cut(\[\-1, 1\], labels\=\["a", "b", "c"\]).alias("cut") ... ) shape: (5, 2) ┌─────┬─────┐ │ foo ┆ cut │ │ --- ┆ --- │ │ i64 ┆ cat │ ╞═════╪═════╡ │ -2 ┆ a │ │ -1 ┆ a │ │ 0 ┆ b │ │ 1 ┆ b │ │ 2 ┆ c │ └─────┴─────┘ Add both the category and the breakpoint. \>>> df.with\_columns( ... pl.col("foo").cut(\[\-1, 1\], include\_breaks\=True).alias("cut") ... ).unnest("cut") shape: (5, 3) ┌─────┬────────────┬────────────┐ │ foo ┆ breakpoint ┆ category │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ cat │ ╞═════╪════════════╪════════════╡ │ -2 ┆ -1.0 ┆ (-inf, -1\] │ │ -1 ┆ -1.0 ┆ (-inf, -1\] │ │ 0 ┆ 1.0 ┆ (-1, 1\] │ │ 1 ┆ 1.0 ┆ (-1, 1\] │ │ 2 ┆ inf ┆ (1, inf\] │ └─────┴────────────┴────────────┘ degrees() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9890-L9921) Convert from radians to degrees. Returns: Expr Expression of data type `Float64`. Examples \>>> import math \>>> df \= pl.DataFrame({"a": \[x \* math.pi for x in range(\-4, 5)\]}) \>>> df.select(pl.col("a").degrees()) shape: (9, 1) ┌────────┐ │ a │ │ --- │ │ f64 │ ╞════════╡ │ -720.0 │ │ -540.0 │ │ -360.0 │ │ -180.0 │ │ 0.0 │ │ 180.0 │ │ 360.0 │ │ 540.0 │ │ 720.0 │ └────────┘ _classmethod_ deserialize( _source: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") | Path | IOBase | [bytes](https://docs.python.org/3/library/stdtypes.html#bytes "(in Python v3.14)") _, _\*_, _format: SerializationFormat \= 'binary'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L385-L445) Read a serialized expression from a file. Parameters: **source** Path to a file or a file-like object (by file-like object, we refer to objects that have a `read()` method, such as a file handler (e.g. via builtin `open` function) or `BytesIO`). **format** The format with which the Expr was serialized. Options: * `"binary"`: Deserialize from binary format (bytes). This is the default. * `"json"`: Deserialize from JSON format (string). Warning This function uses [`pickle`](https://docs.python.org/3/library/pickle.html#module-pickle "(in Python v3.14)") if the logical plan contains Python UDFs, and as such inherits the security implications. Deserializing can execute arbitrary code, so it should only be attempted on trusted data. See also [`Expr.meta.serialize`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.meta.serialize.html#polars.Expr.meta.serialize "polars.Expr.meta.serialize") Notes Serialization is not stable across Polars versions: a LazyFrame serialized in one Polars version may not be deserializable in another Polars version. Examples \>>> import io \>>> expr \= pl.col("foo").sum().over("bar") \>>> bytes \= expr.meta.serialize() \>>> pl.Expr.deserialize(io.BytesIO(bytes)) \ \ diff(_n: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | IntoExpr \= 1_, _null\_behavior: NullBehavior \= 'ignore'_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9225-L9282)\ \ Calculate the first discrete difference between shifted items.\ \ Parameters:\ \ **n**\ \ Number of slots to shift.\ \ **null\_behavior**{‘ignore’, ‘drop’}\ \ How to handle null values.\ \ Examples\ \ \>>> df \= pl.DataFrame({"int": \[20, 10, 30, 25, 35\]})\ \>>> df.with\_columns(change\=pl.col("int").diff())\ shape: (5, 2)\ ┌─────┬────────┐\ │ int ┆ change │\ │ --- ┆ --- │\ │ i64 ┆ i64 │\ ╞═════╪════════╡\ │ 20 ┆ null │\ │ 10 ┆ -10 │\ │ 30 ┆ 20 │\ │ 25 ┆ -5 │\ │ 35 ┆ 10 │\ └─────┴────────┘\ \ \>>> df.with\_columns(change\=pl.col("int").diff(n\=2))\ shape: (5, 2)\ ┌─────┬────────┐\ │ int ┆ change │\ │ --- ┆ --- │\ │ i64 ┆ i64 │\ ╞═════╪════════╡\ │ 20 ┆ null │\ │ 10 ┆ null │\ │ 30 ┆ 10 │\ │ 25 ┆ 15 │\ │ 35 ┆ 5 │\ └─────┴────────┘\ \ \>>> df.select(pl.col("int").diff(n\=2, null\_behavior\="drop").alias("diff"))\ shape: (3, 1)\ ┌──────┐\ │ diff │\ │ --- │\ │ i64 │\ ╞══════╡\ │ 10 │\ │ 15 │\ │ 5 │\ └──────┘\ \ dot(_other: Expr | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1774-L1802)\ \ Compute the dot/inner product between two Expressions.\ \ Parameters:\ \ **other**\ \ Expression to compute dot product with.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "a": \[1, 3, 5\],\ ... "b": \[2, 4, 6\],\ ... }\ ... )\ \>>> df.select(pl.col("a").dot(pl.col("b")))\ shape: (1, 1)\ ┌─────┐\ │ a │\ │ --- │\ │ i64 │\ ╞═════╡\ │ 44 │\ └─────┘\ \ drop\_nans() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1392-L1422)\ \ Drop all floating point NaN values.\ \ The original order of the remaining elements is preserved.\ \ See also\ \ [`drop_nulls`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.drop_nulls.html#polars.Expr.drop_nulls "polars.Expr.drop_nulls")\ \ Notes\ \ A NaN value is not the same as a null value. To drop null values, use [`drop_nulls()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.drop_nulls.html#polars.Expr.drop_nulls "polars.Expr.drop_nulls")\ .\ \ Examples\ \ \>>> df \= pl.DataFrame({"a": \[1.0, None, 3.0, float("nan")\]})\ \>>> df.select(pl.col("a").drop\_nans())\ shape: (3, 1)\ ┌──────┐\ │ a │\ │ --- │\ │ f64 │\ ╞══════╡\ │ 1.0 │\ │ null │\ │ 3.0 │\ └──────┘\ \ drop\_nulls() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1360-L1390)\ \ Drop all null values.\ \ The original order of the remaining elements is preserved.\ \ See also\ \ [`drop_nans`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.drop_nans.html#polars.Expr.drop_nans "polars.Expr.drop_nans")\ \ Notes\ \ A null value is not the same as a NaN value. To drop NaN values, use [`drop_nans()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.drop_nans.html#polars.Expr.drop_nans "polars.Expr.drop_nans")\ .\ \ Examples\ \ \>>> df \= pl.DataFrame({"a": \[1.0, None, 3.0, float("nan")\]})\ \>>> df.select(pl.col("a").drop\_nulls())\ shape: (3, 1)\ ┌─────┐\ │ a │\ │ --- │\ │ f64 │\ ╞═════╡\ │ 1.0 │\ │ 3.0 │\ │ NaN │\ └─────┘\ \ entropy(\ \ _base: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \= 2.718281828459045_,\ \ _\*_,\ \ _normalize: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= True_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10769-L10804)\ \ Computes the entropy.\ \ Uses the formula `-sum(pk * log(pk))` where `pk` are discrete probabilities.\ \ Parameters:\ \ **base**\ \ Given base, defaults to `e`\ \ **normalize**\ \ Normalize pk if it doesn’t sum to 1.\ \ Examples\ \ \>>> df \= pl.DataFrame({"a": \[1, 2, 3\]})\ \>>> df.select(pl.col("a").entropy(base\=2))\ shape: (1, 1)\ ┌──────────┐\ │ a │\ │ --- │\ │ f64 │\ ╞══════════╡\ │ 1.459148 │\ └──────────┘\ \>>> df.select(pl.col("a").entropy(base\=2, normalize\=False))\ shape: (1, 1)\ ┌───────────┐\ │ a │\ │ --- │\ │ f64 │\ ╞═══════════╡\ │ -6.754888 │\ └───────────┘\ \ eq(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)")\ _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5387-L5419)\ \ Method equivalent of equality operator `expr == other`.\ \ Parameters:\ \ **other**\ \ A literal or expression value to compare with.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... data\={\ ... "x": \[1.0, 2.0, float("nan"), 4.0\],\ ... "y": \[2.0, 2.0, float("nan"), 4.0\],\ ... }\ ... )\ \>>> df.with\_columns(\ ... pl.col("x").eq(pl.col("y")).alias("x == y"),\ ... )\ shape: (4, 3)\ ┌─────┬─────┬────────┐\ │ x ┆ y ┆ x == y │\ │ --- ┆ --- ┆ --- │\ │ f64 ┆ f64 ┆ bool │\ ╞═════╪═════╪════════╡\ │ 1.0 ┆ 2.0 ┆ false │\ │ 2.0 ┆ 2.0 ┆ true │\ │ NaN ┆ NaN ┆ true │\ │ 4.0 ┆ 4.0 ┆ true │\ └─────┴─────┴────────┘\ \ eq\_missing(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)")\ _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5421-L5459)\ \ Method equivalent of equality operator `expr == other` where `None == None`.\ \ This differs from default `eq` where null values are propagated.\ \ Parameters:\ \ **other**\ \ A literal or expression value to compare with.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... data\={\ ... "x": \[1.0, 2.0, float("nan"), 4.0, None, None\],\ ... "y": \[2.0, 2.0, float("nan"), 4.0, 5.0, None\],\ ... }\ ... )\ \>>> df.with\_columns(\ ... pl.col("x").eq(pl.col("y")).alias("x eq y"),\ ... pl.col("x").eq\_missing(pl.col("y")).alias("x eq\_missing y"),\ ... )\ shape: (6, 4)\ ┌──────┬──────┬────────┬────────────────┐\ │ x ┆ y ┆ x eq y ┆ x eq\_missing y │\ │ --- ┆ --- ┆ --- ┆ --- │\ │ f64 ┆ f64 ┆ bool ┆ bool │\ ╞══════╪══════╪════════╪════════════════╡\ │ 1.0 ┆ 2.0 ┆ false ┆ false │\ │ 2.0 ┆ 2.0 ┆ true ┆ true │\ │ NaN ┆ NaN ┆ true ┆ true │\ │ 4.0 ┆ 4.0 ┆ true ┆ true │\ │ null ┆ 5.0 ┆ null ┆ false │\ │ null ┆ null ┆ null ┆ true │\ └──────┴──────┴────────┴────────────────┘\ \ ewm\_mean(\ \ _\*_,\ \ _com: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _span: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _half\_life: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _alpha: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _adjust: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= True_,\ \ _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ \= 1_,\ \ _ignore\_nulls: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= False_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10105-L10194)\ \ Compute exponentially-weighted moving average.\ \ Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`.\ \ Parameters:\ \ **com**\ \ Specify decay in terms of center of mass, \\(\\gamma\\), with\ \ > \\\[\\alpha = \\frac{1}{1 + \\gamma} \\; \\forall \\; \\gamma \\geq 0\\\]\ \ **span**\ \ Specify decay in terms of span, \\(\\theta\\), with\ \ > \\\[\\alpha = \\frac{2}{\\theta + 1} \\; \\forall \\; \\theta \\geq 1\\\]\ \ **half\_life**\ \ Specify decay in terms of half-life, \\(\\tau\\), with\ \ > \\\[\\alpha = 1 - \\exp \\left\\{ \\frac{ -\\ln(2) }{ \\tau } \\right\\} \\; \\forall \\; \\tau > 0\\\]\ \ **alpha**\ \ Specify smoothing factor alpha directly, \\(0 < \\alpha \\leq 1\\).\ \ **adjust**\ \ Divide by decaying adjustment factor in beginning periods to account for imbalance in relative weightings\ \ > * When `adjust=True` (the default) the EW function is calculated using weights \\(w\_i = (1 - \\alpha)^i\\)\ > \ > * When `adjust=False` the EW function is calculated recursively by\ > \ > \\\[\\begin{split}y\_0 &= x\_0 \\\\ y\_t &= (1 - \\alpha)y\_{t - 1} + \\alpha x\_t\\end{split}\\\]\ > \ \ **min\_samples**\ \ Minimum number of observations in window required to have a value (otherwise result is null).\ \ **ignore\_nulls**\ \ Ignore missing values when calculating weights.\ \ > * When `ignore_nulls=False` (default), weights are based on absolute positions. For example, the weights of \\(x\_0\\) and \\(x\_2\\) used in calculating the final weighted average of \[\\(x\_0\\), None, \\(x\_2\\)\] are \\((1-\\alpha)^2\\) and \\(1\\) if `adjust=True`, and \\((1-\\alpha)^2\\) and \\(\\alpha\\) if `adjust=False`.\ > \ > * When `ignore_nulls=True`, weights are based on relative positions. For example, the weights of \\(x\_0\\) and \\(x\_2\\) used in calculating the final weighted average of \[\\(x\_0\\), None, \\(x\_2\\)\] are \\(1-\\alpha\\) and \\(1\\) if `adjust=True`, and \\(1-\\alpha\\) and \\(\\alpha\\) if `adjust=False`.\ > \ \ Examples\ \ \>>> df \= pl.DataFrame({"a": \[1, 2, 3\]})\ \>>> df.select(pl.col("a").ewm\_mean(com\=1, ignore\_nulls\=False))\ shape: (3, 1)\ ┌──────────┐\ │ a │\ │ --- │\ │ f64 │\ ╞══════════╡\ │ 1.0 │\ │ 1.666667 │\ │ 2.428571 │\ └──────────┘\ \ ewm\_mean\_by(_by: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ | IntoExpr_, _\*_, _half\_life: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ | timedelta_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10196-L10287)\ \ Compute time-based exponentially weighted moving average.\ \ Given observations \\(x\_0, x\_1, \\ldots, x\_{n-1}\\) at times \\(t\_0, t\_1, \\ldots, t\_{n-1}\\), the EWMA is calculated as\ \ > \\\[ \\begin{align}\\begin{aligned}y\_0 &= x\_0\\\\\\alpha\_i &= 1 - \\exp \\left\\{ \\frac{ -\\ln(2)(t\_i-t\_{i-1}) } { \\tau } \\right\\}\\\\y\_i &= \\alpha\_i x\_i + (1 - \\alpha\_i) y\_{i-1}; \\quad i > 0\\end{aligned}\\end{align} \\\]\ \ where \\(\\tau\\) is the `half_life`.\ \ Parameters:\ \ **by**\ \ Times to calculate average by. Should be `DateTime`, `Date`, `UInt64`, `UInt32`, `Int64`, or `Int32` data type.\ \ **half\_life**\ \ Unit over which observation decays to half its value.\ \ Can be created either from a timedelta, or by using the following string language:\ \ * 1ns (1 nanosecond)\ \ * 1us (1 microsecond)\ \ * 1ms (1 millisecond)\ \ * 1s (1 second)\ \ * 1m (1 minute)\ \ * 1h (1 hour)\ \ * 1d (1 day)\ \ * 1w (1 week)\ \ * 1i (1 index count)\ \ \ Or combine them: “3d12h4m25s” # 3 days, 12 hours, 4 minutes, and 25 seconds\ \ Note that `half_life` is treated as a constant duration - calendar durations such as months (or even days in the time-zone-aware case) are not supported, please express your duration in an approximately equivalent number of hours (e.g. ‘370h’ instead of ‘1mo’).\ \ Returns:\ \ Expr\ \ [`Float16`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Float16.html#polars.datatypes.Float16 "polars.datatypes.Float16")\ if input is `Float16`, class:`.Float32` if input is `Float32`, otherwise class:`.Float64`.\ \ Examples\ \ \>>> from datetime import date, timedelta\ \>>> df \= pl.DataFrame(\ ... {\ ... "values": \[0, 1, 2, None, 4\],\ ... "times": \[\ ... date(2020, 1, 1),\ ... date(2020, 1, 3),\ ... date(2020, 1, 10),\ ... date(2020, 1, 15),\ ... date(2020, 1, 17),\ ... \],\ ... }\ ... ).sort("times")\ \>>> df.with\_columns(\ ... result\=pl.col("values").ewm\_mean\_by("times", half\_life\="4d"),\ ... )\ shape: (5, 3)\ ┌────────┬────────────┬──────────┐\ │ values ┆ times ┆ result │\ │ --- ┆ --- ┆ --- │\ │ i64 ┆ date ┆ f64 │\ ╞════════╪════════════╪══════════╡\ │ 0 ┆ 2020-01-01 ┆ 0.0 │\ │ 1 ┆ 2020-01-03 ┆ 0.292893 │\ │ 2 ┆ 2020-01-10 ┆ 1.492474 │\ │ null ┆ 2020-01-15 ┆ null │\ │ 4 ┆ 2020-01-17 ┆ 3.254508 │\ └────────┴────────────┴──────────┘\ \ ewm\_std(\ \ _\*_,\ \ _com: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _span: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _half\_life: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _alpha: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _adjust: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= True_,\ \ _bias: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= False_,\ \ _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ \= 1_,\ \ _ignore\_nulls: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= False_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10289-L10382)\ \ Compute exponentially-weighted moving standard deviation.\ \ Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`.\ \ Parameters:\ \ **com**\ \ Specify decay in terms of center of mass, \\(\\gamma\\), with\ \ > \\\[\\alpha = \\frac{1}{1 + \\gamma} \\; \\forall \\; \\gamma \\geq 0\\\]\ \ **span**\ \ Specify decay in terms of span, \\(\\theta\\), with\ \ > \\\[\\alpha = \\frac{2}{\\theta + 1} \\; \\forall \\; \\theta \\geq 1\\\]\ \ **half\_life**\ \ Specify decay in terms of half-life, \\(\\lambda\\), with\ \ > \\\[\\alpha = 1 - \\exp \\left\\{ \\frac{ -\\ln(2) }{ \\lambda } \\right\\} \\; \\forall \\; \\lambda > 0\\\]\ \ **alpha**\ \ Specify smoothing factor alpha directly, \\(0 < \\alpha \\leq 1\\).\ \ **adjust**\ \ Divide by decaying adjustment factor in beginning periods to account for imbalance in relative weightings\ \ > * When `adjust=True` (the default) the EW function is calculated using weights \\(w\_i = (1 - \\alpha)^i\\)\ > \ > * When `adjust=False` the EW function is calculated recursively by\ > \ > \\\[\\begin{split}y\_0 &= x\_0 \\\\ y\_t &= (1 - \\alpha)y\_{t - 1} + \\alpha x\_t\\end{split}\\\]\ > \ \ **bias**\ \ When `bias=False`, apply a correction to make the estimate statistically unbiased.\ \ **min\_samples**\ \ Minimum number of observations in window required to have a value (otherwise result is null).\ \ **ignore\_nulls**\ \ Ignore missing values when calculating weights.\ \ > * When `ignore_nulls=False` (default), weights are based on absolute positions. For example, the weights of \\(x\_0\\) and \\(x\_2\\) used in calculating the final weighted average of \[\\(x\_0\\), None, \\(x\_2\\)\] are \\((1-\\alpha)^2\\) and \\(1\\) if `adjust=True`, and \\((1-\\alpha)^2\\) and \\(\\alpha\\) if `adjust=False`.\ > \ > * When `ignore_nulls=True`, weights are based on relative positions. For example, the weights of \\(x\_0\\) and \\(x\_2\\) used in calculating the final weighted average of \[\\(x\_0\\), None, \\(x\_2\\)\] are \\(1-\\alpha\\) and \\(1\\) if `adjust=True`, and \\(1-\\alpha\\) and \\(\\alpha\\) if `adjust=False`.\ > \ \ Examples\ \ \>>> df \= pl.DataFrame({"a": \[1, 2, 3\]})\ \>>> df.select(pl.col("a").ewm\_std(com\=1, ignore\_nulls\=False))\ shape: (3, 1)\ ┌──────────┐\ │ a │\ │ --- │\ │ f64 │\ ╞══════════╡\ │ 0.0 │\ │ 0.707107 │\ │ 0.963624 │\ └──────────┘\ \ ewm\_var(\ \ _\*_,\ \ _com: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _span: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _half\_life: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _alpha: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _adjust: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= True_,\ \ _bias: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= False_,\ \ _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ \= 1_,\ \ _ignore\_nulls: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= False_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10384-L10477)\ \ Compute exponentially-weighted moving variance.\ \ Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`.\ \ Parameters:\ \ **com**\ \ Specify decay in terms of center of mass, \\(\\gamma\\), with\ \ > \\\[\\alpha = \\frac{1}{1 + \\gamma} \\; \\forall \\; \\gamma \\geq 0\\\]\ \ **span**\ \ Specify decay in terms of span, \\(\\theta\\), with\ \ > \\\[\\alpha = \\frac{2}{\\theta + 1} \\; \\forall \\; \\theta \\geq 1\\\]\ \ **half\_life**\ \ Specify decay in terms of half-life, \\(\\lambda\\), with\ \ > \\\[\\alpha = 1 - \\exp \\left\\{ \\frac{ -\\ln(2) }{ \\lambda } \\right\\} \\; \\forall \\; \\lambda > 0\\\]\ \ **alpha**\ \ Specify smoothing factor alpha directly, \\(0 < \\alpha \\leq 1\\).\ \ **adjust**\ \ Divide by decaying adjustment factor in beginning periods to account for imbalance in relative weightings\ \ > * When `adjust=True` (the default) the EW function is calculated using weights \\(w\_i = (1 - \\alpha)^i\\)\ > \ > * When `adjust=False` the EW function is calculated recursively by\ > \ > \\\[\\begin{split}y\_0 &= x\_0 \\\\ y\_t &= (1 - \\alpha)y\_{t - 1} + \\alpha x\_t\\end{split}\\\]\ > \ \ **bias**\ \ When `bias=False`, apply a correction to make the estimate statistically unbiased.\ \ **min\_samples**\ \ Minimum number of observations in window required to have a value (otherwise result is null).\ \ **ignore\_nulls**\ \ Ignore missing values when calculating weights.\ \ > * When `ignore_nulls=False` (default), weights are based on absolute positions. For example, the weights of \\(x\_0\\) and \\(x\_2\\) used in calculating the final weighted average of \[\\(x\_0\\), None, \\(x\_2\\)\] are \\((1-\\alpha)^2\\) and \\(1\\) if `adjust=True`, and \\((1-\\alpha)^2\\) and \\(\\alpha\\) if `adjust=False`.\ > \ > * When `ignore_nulls=True`, weights are based on relative positions. For example, the weights of \\(x\_0\\) and \\(x\_2\\) used in calculating the final weighted average of \[\\(x\_0\\), None, \\(x\_2\\)\] are \\(1-\\alpha\\) and \\(1\\) if `adjust=True`, and \\(1-\\alpha\\) and \\(\\alpha\\) if `adjust=False`.\ > \ \ Examples\ \ \>>> df \= pl.DataFrame({"a": \[1, 2, 3\]})\ \>>> df.select(pl.col("a").ewm\_var(com\=1, ignore\_nulls\=False))\ shape: (3, 1)\ ┌──────────┐\ │ a │\ │ --- │\ │ f64 │\ ╞══════════╡\ │ 0.0 │\ │ 0.5 │\ │ 0.928571 │\ └──────────┘\ \ exclude(\ \ _columns: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ | PolarsDataType | Collection\[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ \] | Collection\[PolarsDataType\]_,\ \ _\*more\_columns: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ | PolarsDataType_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L783-L866)\ \ Exclude columns from a multi-column expression.\ \ Only works after a wildcard or regex column selection, and you cannot provide both string column names _and_ dtypes (you may prefer to use selectors instead).\ \ Parameters:\ \ **columns**\ \ The name or datatype of the column(s) to exclude. Accepts regular expression input. Regular expressions should start with `^` and end with `$`.\ \ **\*more\_columns**\ \ Additional names or datatypes of columns to exclude, specified as positional arguments.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "aa": \[1, 2, 3\],\ ... "ba": \["a", "b", None\],\ ... "cc": \[None, 2.5, 1.5\],\ ... }\ ... )\ \>>> df\ shape: (3, 3)\ ┌─────┬──────┬──────┐\ │ aa ┆ ba ┆ cc │\ │ --- ┆ --- ┆ --- │\ │ i64 ┆ str ┆ f64 │\ ╞═════╪══════╪══════╡\ │ 1 ┆ a ┆ null │\ │ 2 ┆ b ┆ 2.5 │\ │ 3 ┆ null ┆ 1.5 │\ └─────┴──────┴──────┘\ \ Exclude by column name(s):\ \ \>>> df.select(pl.all().exclude("ba"))\ shape: (3, 2)\ ┌─────┬──────┐\ │ aa ┆ cc │\ │ --- ┆ --- │\ │ i64 ┆ f64 │\ ╞═════╪══════╡\ │ 1 ┆ null │\ │ 2 ┆ 2.5 │\ │ 3 ┆ 1.5 │\ └─────┴──────┘\ \ Exclude by regex, e.g. removing all columns whose names end with the letter “a”:\ \ \>>> df.select(pl.all().exclude("^.\*a$"))\ shape: (3, 1)\ ┌──────┐\ │ cc │\ │ --- │\ │ f64 │\ ╞══════╡\ │ null │\ │ 2.5 │\ │ 1.5 │\ └──────┘\ \ Exclude by dtype(s), e.g. removing all columns of type Int64 or Float64:\ \ \>>> df.select(pl.all().exclude(\[pl.Int64, pl.Float64\]))\ shape: (3, 1)\ ┌──────┐\ │ ba │\ │ --- │\ │ str │\ ╞══════╡\ │ a │\ │ b │\ │ null │\ └──────┘\ \ exp() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L702-L721)\ \ Compute the exponential, element-wise.\ \ Examples\ \ \>>> df \= pl.DataFrame({"values": \[1.0, 2.0, 4.0\]})\ \>>> df.select(pl.col("values").exp())\ shape: (3, 1)\ ┌──────────┐\ │ values │\ │ --- │\ │ f64 │\ ╞══════════╡\ │ 2.718282 │\ │ 7.389056 │\ │ 54.59815 │\ └──────────┘\ \ explode(\ \ _\*_,\ \ _empty\_as\_null: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= True_,\ \ _keep\_nulls: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= True_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5057-L5105)\ \ Explode a list expression.\ \ This means that every item is expanded to a new row.\ \ Parameters:\ \ **empty\_as\_null**\ \ Explode an empty list/array into a `null`.\ \ **keep\_nulls**\ \ Explode a `null` list/array into a `null`.\ \ Returns:\ \ Expr\ \ Expression with the data type of the list elements.\ \ See also\ \ [`Expr.list.explode`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.list.explode.html#polars.Expr.list.explode "polars.Expr.list.explode")\ \ Explode a list column.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "group": \["a", "b"\],\ ... "values": \[\ ... \[1, 2\],\ ... \[3, 4\],\ ... \],\ ... }\ ... )\ \>>> df.select(pl.col("values").explode())\ shape: (4, 1)\ ┌────────┐\ │ values │\ │ --- │\ │ i64 │\ ╞════════╡\ │ 1 │\ │ 2 │\ │ 3 │\ │ 4 │\ └────────┘\ \ extend\_constant(_value: IntoExpr_, _n: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | IntoExprColumn_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10479-L10510)\ \ Extremely fast method for extending the Series with ‘n’ copies of a value.\ \ Parameters:\ \ **value**\ \ A constant literal value or a unit expression with which to extend the expression result Series; can pass None to extend with nulls.\ \ **n**\ \ The number of additional values that will be added.\ \ Examples\ \ \>>> df \= pl.DataFrame({"values": \[1, 2, 3\]})\ \>>> df.select((pl.col("values") \- 1).extend\_constant(99, n\=2))\ shape: (5, 1)\ ┌────────┐\ │ values │\ │ --- │\ │ i64 │\ ╞════════╡\ │ 0 │\ │ 1 │\ │ 2 │\ │ 99 │\ │ 99 │\ └────────┘\ \ fill\_nan(\ \ _value: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ | Expr | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ _,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2951-L2990)\ \ Fill floating point NaN value with a fill value.\ \ Parameters:\ \ **value**\ \ Value used to fill NaN values.\ \ See also\ \ [`fill_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_null.html#polars.Expr.fill_null "polars.Expr.fill_null")\ \ Notes\ \ A NaN value is not the same as a null value. To fill null values, use [`fill_null()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_null.html#polars.Expr.fill_null "polars.Expr.fill_null")\ .\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "a": \[1.0, None, float("nan")\],\ ... "b": \[4.0, float("nan"), 6\],\ ... }\ ... )\ \>>> df.with\_columns(pl.col("b").fill\_nan(0))\ shape: (3, 2)\ ┌──────┬─────┐\ │ a ┆ b │\ │ --- ┆ --- │\ │ f64 ┆ f64 │\ ╞══════╪═════╡\ │ 1.0 ┆ 4.0 │\ │ null ┆ 0.0 │\ │ NaN ┆ 6.0 │\ └──────┴─────┘\ \ fill\_null(\ \ _value: Any | Expr | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _strategy: FillNullStrategy | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _limit: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2837-L2949)\ \ Fill null values using the specified value or strategy.\ \ To interpolate over null values see interpolate. See the examples below to fill nulls with an expression.\ \ Parameters:\ \ **value**\ \ Value used to fill null values.\ \ **strategy**{None, ‘forward’, ‘backward’, ‘min’, ‘max’, ‘mean’, ‘zero’, ‘one’}\ \ Strategy used to fill null values.\ \ **limit**\ \ Number of consecutive null values to fill when using the ‘forward’ or ‘backward’ strategy.\ \ See also\ \ [`backward_fill`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.backward_fill.html#polars.Expr.backward_fill "polars.Expr.backward_fill")\ \ [`fill_nan`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_nan.html#polars.Expr.fill_nan "polars.Expr.fill_nan")\ \ [`forward_fill`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.forward_fill.html#polars.Expr.forward_fill "polars.Expr.forward_fill")\ \ Notes\ \ A null value is not the same as a NaN value. To fill NaN values, use [`fill_nan()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_nan.html#polars.Expr.fill_nan "polars.Expr.fill_nan")\ .\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "a": \[1, 2, None\],\ ... "b": \[4, None, 6\],\ ... }\ ... )\ \>>> df.with\_columns(pl.col("b").fill\_null(strategy\="zero"))\ shape: (3, 2)\ ┌──────┬─────┐\ │ a ┆ b │\ │ --- ┆ --- │\ │ i64 ┆ i64 │\ ╞══════╪═════╡\ │ 1 ┆ 4 │\ │ 2 ┆ 0 │\ │ null ┆ 6 │\ └──────┴─────┘\ \>>> df.with\_columns(pl.col("b").fill\_null(99))\ shape: (3, 2)\ ┌──────┬─────┐\ │ a ┆ b │\ │ --- ┆ --- │\ │ i64 ┆ i64 │\ ╞══════╪═════╡\ │ 1 ┆ 4 │\ │ 2 ┆ 99 │\ │ null ┆ 6 │\ └──────┴─────┘\ \>>> df.with\_columns(pl.col("b").fill\_null(strategy\="forward"))\ shape: (3, 2)\ ┌──────┬─────┐\ │ a ┆ b │\ │ --- ┆ --- │\ │ i64 ┆ i64 │\ ╞══════╪═════╡\ │ 1 ┆ 4 │\ │ 2 ┆ 4 │\ │ null ┆ 6 │\ └──────┴─────┘\ \>>> df.with\_columns(pl.col("b").fill\_null(pl.col("b").median()))\ shape: (3, 2)\ ┌──────┬─────┐\ │ a ┆ b │\ │ --- ┆ --- │\ │ i64 ┆ f64 │\ ╞══════╪═════╡\ │ 1 ┆ 4.0 │\ │ 2 ┆ 5.0 │\ │ null ┆ 6.0 │\ └──────┴─────┘\ \>>> df.with\_columns(pl.all().fill\_null(pl.all().median()))\ shape: (3, 2)\ ┌─────┬─────┐\ │ a ┆ b │\ │ --- ┆ --- │\ │ f64 ┆ f64 │\ ╞═════╪═════╡\ │ 1.0 ┆ 4.0 │\ │ 2.0 ┆ 5.0 │\ │ 1.5 ┆ 6.0 │\ └─────┴─────┘\ \ filter(\ \ _\*predicates: IntoExprColumn | Iterable\[IntoExprColumn\]_,\ \ _\*\*constraints: Any_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4483-L4556)\ \ Filter the expression based on one or more predicate expressions.\ \ The original order of the remaining elements is preserved.\ \ Elements where the filter does not evaluate to True are discarded, including nulls.\ \ Mostly useful in an aggregation context. If you want to filter on a DataFrame level, use `LazyFrame.filter`.\ \ Parameters:\ \ **predicates**\ \ Expression(s) that evaluates to a boolean Series.\ \ **constraints**\ \ Column filters; use `name = value` to filter columns by the supplied value. Each constraint will behave the same as `pl.col(name).eq(value)`, and be implicitly joined with the other filter conditions using `&`.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "group\_col": \["g1", "g1", "g2"\],\ ... "b": \[1, 2, 3\],\ ... }\ ... )\ \>>> df.group\_by("group\_col").agg(\ ... lt\=pl.col("b").filter(pl.col("b") < 2).sum(),\ ... gte\=pl.col("b").filter(pl.col("b") \>= 2).sum(),\ ... ).sort("group\_col")\ shape: (2, 3)\ ┌───────────┬─────┬─────┐\ │ group\_col ┆ lt ┆ gte │\ │ --- ┆ --- ┆ --- │\ │ str ┆ i64 ┆ i64 │\ ╞═══════════╪═════╪═════╡\ │ g1 ┆ 1 ┆ 2 │\ │ g2 ┆ 0 ┆ 3 │\ └───────────┴─────┴─────┘\ \ Filter expressions can also take constraints as keyword arguments.\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "key": \["a", "a", "a", "a", "b", "b", "b", "b", "b"\],\ ... "n": \[1, 2, 2, 3, 1, 3, 3, 2, 3\],\ ... },\ ... )\ \>>> df.group\_by("key").agg(\ ... n\_1\=pl.col("n").filter(n\=1).sum(),\ ... n\_2\=pl.col("n").filter(n\=2).sum(),\ ... n\_3\=pl.col("n").filter(n\=3).sum(),\ ... ).sort(by\="key")\ shape: (2, 4)\ ┌─────┬─────┬─────┬─────┐\ │ key ┆ n\_1 ┆ n\_2 ┆ n\_3 │\ │ --- ┆ --- ┆ --- ┆ --- │\ │ str ┆ i64 ┆ i64 ┆ i64 │\ ╞═════╪═════╪═════╪═════╡\ │ a ┆ 1 ┆ 4 ┆ 3 │\ │ b ┆ 1 ┆ 2 ┆ 9 │\ └─────┴─────┴─────┴─────┘\ \ first(_\*_, _ignore\_nulls: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3542-L3575)\ \ Get the first value.\ \ Parameters:\ \ **ignore\_nulls**\ \ Ignore null values (default `False`). If set to `True`, the first non-null value is returned, otherwise `None` is returned if no non-null value exists.\ \ Examples\ \ \>>> df \= pl.DataFrame({"a": \[None, 1, 2\]})\ \>>> df.select(pl.col("a").first())\ shape: (1, 1)\ ┌──────┐\ │ a │\ │ --- │\ │ i64 │\ ╞══════╡\ │ null │\ └──────┘\ \>>> df.select(pl.col("a").first(ignore\_nulls\=True))\ shape: (1, 1)\ ┌─────┐\ │ a │\ │ --- │\ │ i64 │\ ╞═════╡\ │ 1 │\ └─────┘\ \ flatten() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5030-L5055)\ \ Flatten a list or string column.\ \ Alias for [`Expr.list.explode()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.list.explode.html#polars.Expr.list.explode "polars.Expr.list.explode")\ .\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "group": \["a", "b", "b"\],\ ... "values": \[\[1, 2\], \[2, 3\], \[4\]\],\ ... }\ ... )\ \>>> df.group\_by("group").agg(pl.col("values").flatten()) \ shape: (2, 2)\ ┌───────┬───────────┐\ │ group ┆ values │\ │ --- ┆ --- │\ │ str ┆ list\[i64\] │\ ╞═══════╪═══════════╡\ │ a ┆ \[1, 2\] │\ │ b ┆ \[2, 3, 4\] │\ └───────┴───────────┘\ \ floor() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1637-L1659)\ \ Rounds down to the nearest integer value.\ \ Only works on floating point Series.\ \ Examples\ \ \>>> df \= pl.DataFrame({"a": \[0.3, 0.5, 1.0, 1.1\]})\ \>>> df.select(pl.col("a").floor())\ shape: (4, 1)\ ┌─────┐\ │ a │\ │ --- │\ │ f64 │\ ╞═════╡\ │ 0.0 │\ │ 0.0 │\ │ 1.0 │\ │ 1.0 │\ └─────┘\ \ floordiv(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)")\ _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5717-L5802)\ \ Method equivalent of integer division operator `expr // other`.\ \ Parameters:\ \ **other**\ \ Numeric literal or expression value.\ \ See also\ \ [`truediv`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.truediv.html#polars.Expr.truediv "polars.Expr.truediv")\ \ Examples\ \ \>>> df \= pl.DataFrame({"x": \[1, 2, 3, 4, 5\]})\ \>>> df.with\_columns(\ ... pl.col("x").truediv(2).alias("x/2"),\ ... pl.col("x").floordiv(2).alias("x//2"),\ ... )\ shape: (5, 3)\ ┌─────┬─────┬──────┐\ │ x ┆ x/2 ┆ x//2 │\ │ --- ┆ --- ┆ --- │\ │ i64 ┆ f64 ┆ i64 │\ ╞═════╪═════╪══════╡\ │ 1 ┆ 0.5 ┆ 0 │\ │ 2 ┆ 1.0 ┆ 1 │\ │ 3 ┆ 1.5 ┆ 1 │\ │ 4 ┆ 2.0 ┆ 2 │\ │ 5 ┆ 2.5 ┆ 2 │\ └─────┴─────┴──────┘\ \ Note that Polars’ `floordiv` is subtly different from Python’s floor division. For example, consider 6.0 floor-divided by 0.1. Python gives:\ \ \>>> 6.0 // 0.1\ 59.0\ \ because `0.1` is not represented internally as that exact value, but a slightly larger value. So the result of the division is slightly less than 60, meaning the flooring operation returns 59.0.\ \ Polars instead first does the floating-point division, resulting in a floating-point value of 60.0, and then performs the flooring operation using [`floor`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.floor.html#polars.Expr.floor "polars.Expr.floor")\ :\ \ \>>> df \= pl.DataFrame({"x": \[6.0, 6.03\]})\ \>>> df.with\_columns(\ ... pl.col("x").truediv(0.1).alias("x/0.1"),\ ... ).with\_columns(\ ... pl.col("x/0.1").floor().alias("x/0.1 floor"),\ ... )\ shape: (2, 3)\ ┌──────┬───────┬─────────────┐\ │ x ┆ x/0.1 ┆ x/0.1 floor │\ │ --- ┆ --- ┆ --- │\ │ f64 ┆ f64 ┆ f64 │\ ╞══════╪═══════╪═════════════╡\ │ 6.0 ┆ 60.0 ┆ 60.0 │\ │ 6.03 ┆ 60.3 ┆ 60.0 │\ └──────┴───────┴─────────────┘\ \ yielding the more intuitive result 60.0. The row with x = 6.03 is included to demonstrate the effect of the flooring operation.\ \ `floordiv` combines those two steps to give the same result with one expression:\ \ \>>> df.with\_columns(\ ... pl.col("x").floordiv(0.1).alias("x//0.1"),\ ... )\ shape: (2, 2)\ ┌──────┬────────┐\ │ x ┆ x//0.1 │\ │ --- ┆ --- │\ │ f64 ┆ f64 │\ ╞══════╪════════╡\ │ 6.0 ┆ 60.0 │\ │ 6.03 ┆ 60.0 │\ └──────┴────────┘\ \ forward\_fill(_limit: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2992-L3009)\ \ Fill missing values with the last non-null value.\ \ This is an alias of `.fill_null(strategy="forward")`.\ \ Parameters:\ \ **limit**\ \ The number of consecutive null values to forward fill.\ \ See also\ \ [`backward_fill`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.backward_fill.html#polars.Expr.backward_fill "polars.Expr.backward_fill")\ \ [`fill_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_null.html#polars.Expr.fill_null "polars.Expr.fill_null")\ \ [`shift`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.shift.html#polars.Expr.shift "polars.Expr.shift")\ \ _classmethod_ from\_json(_value: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11627-L11648)\ \ Read an expression from a JSON encoded string to construct an Expression.\ \ Deprecated since version 0.20.11: This method has been renamed to [`deserialize()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.deserialize.html#polars.Expr.deserialize "polars.Expr.deserialize")\ . Note that the new method operates on file-like inputs rather than strings. Enclose your input in `io.StringIO` to keep the same behavior.\ \ Parameters:\ \ **value**\ \ JSON encoded string value\ \ gather(\ \ _indices: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | Sequence\[[int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ \] | IntoExpr | Series | np.ndarray\[Any, Any\]_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2653-L2707)\ \ Take values by index.\ \ Parameters:\ \ **indices**\ \ An expression that leads to a UInt32 dtyped Series.\ \ Returns:\ \ Expr\ \ Expression of the same data type.\ \ See also\ \ [`Expr.get`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.get.html#polars.Expr.get "polars.Expr.get")\ \ Take a single value\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "group": \[\ ... "one",\ ... "one",\ ... "one",\ ... "two",\ ... "two",\ ... "two",\ ... \],\ ... "value": \[1, 98, 2, 3, 99, 4\],\ ... }\ ... )\ \>>> df.group\_by("group", maintain\_order\=True).agg(\ ... pl.col("value").gather(\[2, 1\])\ ... )\ shape: (2, 2)\ ┌───────┬───────────┐\ │ group ┆ value │\ │ --- ┆ --- │\ │ str ┆ list\[i64\] │\ ╞═══════╪═══════════╡\ │ one ┆ \[2, 98\] │\ │ two ┆ \[4, 99\] │\ └───────┴───────────┘\ \ gather\_every(_n: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ _, _offset: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ \= 0_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5133-L5171)\ \ Take every nth value in the Series and return as a new Series.\ \ Parameters:\ \ **n**\ \ Gather every _n_\-th row.\ \ **offset**\ \ Starting index.\ \ Examples\ \ \>>> df \= pl.DataFrame({"foo": \[1, 2, 3, 4, 5, 6, 7, 8, 9\]})\ \>>> df.select(pl.col("foo").gather\_every(3))\ shape: (3, 1)\ ┌─────┐\ │ foo │\ │ --- │\ │ i64 │\ ╞═════╡\ │ 1 │\ │ 4 │\ │ 7 │\ └─────┘\ \ \>>> df.select(pl.col("foo").gather\_every(3, offset\=1))\ shape: (3, 1)\ ┌─────┐\ │ foo │\ │ --- │\ │ i64 │\ ╞═════╡\ │ 2 │\ │ 5 │\ │ 8 │\ └─────┘\ \ ge(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)")\ _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5461-L5493)\ \ Method equivalent of “greater than or equal” operator `expr >= other`.\ \ Parameters:\ \ **other**\ \ A literal or expression value to compare with.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... data\={\ ... "x": \[5.0, 4.0, float("nan"), 2.0\],\ ... "y": \[5.0, 3.0, float("nan"), 1.0\],\ ... }\ ... )\ \>>> df.with\_columns(\ ... pl.col("x").ge(pl.col("y")).alias("x >= y"),\ ... )\ shape: (4, 3)\ ┌─────┬─────┬────────┐\ │ x ┆ y ┆ x >= y │\ │ --- ┆ --- ┆ --- │\ │ f64 ┆ f64 ┆ bool │\ ╞═════╪═════╪════════╡\ │ 5.0 ┆ 5.0 ┆ true │\ │ 4.0 ┆ 3.0 ┆ true │\ │ NaN ┆ NaN ┆ true │\ │ 2.0 ┆ 1.0 ┆ true │\ └─────┴─────┴────────┘\ \ get(\ \ _index: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | Expr_,\ \ _\*_,\ \ _null\_on\_oob: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= False_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2709-L2757)\ \ Return a single value by index.\ \ Parameters:\ \ **index**\ \ An expression that leads to a UInt32 index. Negative indexing is supported.\ \ **null\_on\_oob**\ \ Behavior if an index is out of bounds:\ \ * True -> set the result to null\ \ * False -> raise an error\ \ \ Returns:\ \ Expr\ \ Expression of the same data type.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "group": \[\ ... "one",\ ... "one",\ ... "one",\ ... "two",\ ... "two",\ ... "two",\ ... \],\ ... "value": \[1, 98, 2, 3, 99, 4\],\ ... }\ ... )\ \>>> df.group\_by("group", maintain\_order\=True).agg(pl.col("value").get(1))\ shape: (2, 2)\ ┌───────┬───────┐\ │ group ┆ value │\ │ --- ┆ --- │\ │ str ┆ i64 │\ ╞═══════╪═══════╡\ │ one ┆ 98 │\ │ two ┆ 99 │\ └───────┴───────┘\ \ gt(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)")\ _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5495-L5527)\ \ Method equivalent of “greater than” operator `expr > other`.\ \ Parameters:\ \ **other**\ \ A literal or expression value to compare with.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... data\={\ ... "x": \[5.0, 4.0, float("nan"), 2.0\],\ ... "y": \[5.0, 3.0, float("nan"), 1.0\],\ ... }\ ... )\ \>>> df.with\_columns(\ ... pl.col("x").gt(pl.col("y")).alias("x > y"),\ ... )\ shape: (4, 3)\ ┌─────┬─────┬───────┐\ │ x ┆ y ┆ x > y │\ │ --- ┆ --- ┆ --- │\ │ f64 ┆ f64 ┆ bool │\ ╞═════╪═════╪═══════╡\ │ 5.0 ┆ 5.0 ┆ false │\ │ 4.0 ┆ 3.0 ┆ true │\ │ NaN ┆ NaN ┆ false │\ │ 2.0 ┆ 1.0 ┆ true │\ └─────┴─────┴───────┘\ \ has\_nulls() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3444-L3467)\ \ Check whether the expression contains one or more null values.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "a": \[None, 1, None\],\ ... "b": \[10, None, 300\],\ ... "c": \[350, 650, 850\],\ ... }\ ... )\ \>>> df.select(pl.all().has\_nulls())\ shape: (1, 3)\ ┌──────┬──────┬───────┐\ │ a ┆ b ┆ c │\ │ --- ┆ --- ┆ --- │\ │ bool ┆ bool ┆ bool │\ ╞══════╪══════╪═══════╡\ │ true ┆ true ┆ false │\ └──────┴──────┴───────┘\ \ hash(\ \ _seed: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ \= 0_,\ \ _seed\_1: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _seed\_2: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _seed\_3: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6334-L6387)\ \ Hash the elements in the selection.\ \ The hash value is of type `UInt64`.\ \ Parameters:\ \ **seed**\ \ Random seed parameter. Defaults to 0.\ \ **seed\_1**\ \ Random seed parameter. Defaults to `seed` if not set.\ \ **seed\_2**\ \ Random seed parameter. Defaults to `seed` if not set.\ \ **seed\_3**\ \ Random seed parameter. Defaults to `seed` if not set.\ \ Notes\ \ This implementation of `hash` does not guarantee stable results across different Polars versions. Its stability is only guaranteed within a single version.\ \ Examples\ \ \>>> df \= pl.DataFrame(\ ... {\ ... "a": \[1, 2, None\],\ ... "b": \["x", None, "z"\],\ ... }\ ... )\ \>>> df.with\_columns(pl.all().hash(10, 20, 30, 40)) \ shape: (3, 2)\ ┌──────────────────────┬──────────────────────┐\ │ a ┆ b │\ │ --- ┆ --- │\ │ u64 ┆ u64 │\ ╞══════════════════════╪══════════════════════╡\ │ 9774092659964970114 ┆ 13614470193936745724 │\ │ 1101441246220388612 ┆ 11638928888656214026 │\ │ 11638928888656214026 ┆ 13382926553367784577 │\ └──────────────────────┴──────────────────────┘\ \ head(_n: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | Expr \= 10_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5173-L5197)\ \ Get the first `n` rows.\ \ Parameters:\ \ **n**\ \ Number of rows to return.\ \ Examples\ \ \>>> df \= pl.DataFrame({"foo": \[1, 2, 3, 4, 5, 6, 7\]})\ \>>> df.select(pl.col("foo").head(3))\ shape: (3, 1)\ ┌─────┐\ │ foo │\ │ --- │\ │ i64 │\ ╞═════╡\ │ 1 │\ │ 2 │\ │ 3 │\ └─────┘\ \ hist(\ \ _bins: IntoExpr | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _\*_,\ \ _bin\_count: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)")\ \= None_,\ \ _include\_category: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= False_,\ \ _include\_breakpoint: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \= False_,\ \ ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10932-L11002)\ \ Bin values into buckets and count their occurrences.\ \ Warning\ \ This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change.\ \ Parameters:\ \ **bins**\ \ Bin edges. If None given, we determine the edges based on the data.\ \ **bin\_count**\ \ If `bins` is not provided, `bin_count` uniform bins are created that fully encompass the data.\ \ **include\_breakpoint**\ \ Include a column that indicates the upper breakpoint.\ \ **include\_category**\ \ Include a column that shows the intervals as categories.\ \ Returns:\ \ DataFrame\ \ Examples\ \ \>>> df \= pl.DataFrame({"a": \[1, 3, 8, 8, 2, 1, 3\]})\ \>>> df.select(pl.col("a").hist(bins\=\[1, 2, 3\]))\ shape: (2, 1)\ ┌─────┐\ │ a │\ │ --- │\ │ u32 │\ ╞═════╡\ │ 3 │\ │ 2 │\ └─────┘\ \>>> df.select(\ ... pl.col("a").hist(\ ... bins\=\[1, 2, 3\], include\_breakpoint\=True, include\_category\=True\ ... )\ ... )\ shape: (2, 1)\ ┌──────────────────────┐\ │ a │\ │ --- │\ │ struct\[3\] │\ ╞══════════════════════╡\ │ {2.0,"\[1.0, 2.0\]",3} │\ │ {3.0,"(2.0, 3.0\]",2} │ └──────────────────────┘ implode() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5107-L5131) Aggregate values into a list. The returned list itself is a scalar value of `list` dtype. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, 3\], ... "b": \[4, 5, 6\], ... } ... ) \>>> df.select(pl.all().implode()) shape: (1, 2) ┌───────────┬───────────┐ │ a ┆ b │ │ --- ┆ --- │ │ list\[i64\] ┆ list\[i64\] │ ╞═══════════╪═══════════╡ │ \[1, 2, 3\] ┆ \[4, 5, 6\] │ └───────────┴───────────┘ index\_of(_element: IntoExpr_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2420-L2457) Get the index of the first occurrence of a value, or `None` if it’s not found. Parameters: **element** Value to find. Examples \>>> df \= pl.DataFrame({"a": \[1, None, 17\]}) \>>> df.select( ... \[\ ... pl.col("a").index\_of(17).alias("seventeen"),\ ... pl.col("a").index\_of(None).alias("null"),\ ... pl.col("a").index\_of(55).alias("fiftyfive"),\ ... \] ... ) shape: (1, 3) ┌───────────┬──────┬───────────┐ │ seventeen ┆ null ┆ fiftyfive │ │ --- ┆ --- ┆ --- │ │ u32 ┆ u32 ┆ u32 │ ╞═══════════╪══════╪═══════════╡ │ 2 ┆ 1 ┆ null │ └───────────┴──────┴───────────┘ inspect(_fmt: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") \= '{}'_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6424-L6455) Print the value that this expression evaluates to and pass on the value. Examples \>>> df \= pl.DataFrame({"foo": \[1, 1, 2\]}) \>>> df.select(pl.col("foo").cum\_sum().inspect("value is: {}").alias("bar")) value is: shape: (3,) Series: 'foo' \[i64\] \[\ 1\ 2\ 4\ \] shape: (3, 1) ┌─────┐ │ bar │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ │ 2 │ │ 4 │ └─────┘ interpolate(_method: InterpolationMethod \= 'linear'_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6457-L6534) Interpolate intermediate values. Nulls at the beginning and end of the series remain null. Parameters: **method**{‘linear’, ‘nearest’} Interpolation method. Examples Fill null values using linear interpolation. \>>> df \= pl.DataFrame( ... { ... "a": \[1, None, 3\], ... "b": \[1.0, float("nan"), 3.0\], ... } ... ) \>>> df.select(pl.all().interpolate()) shape: (3, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════╡ │ 1.0 ┆ 1.0 │ │ 2.0 ┆ NaN │ │ 3.0 ┆ 3.0 │ └─────┴─────┘ Fill null values using nearest interpolation. \>>> df.select(pl.all().interpolate("nearest")) shape: (3, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪═════╡ │ 1 ┆ 1.0 │ │ 3 ┆ NaN │ │ 3 ┆ 3.0 │ └─────┴─────┘ Regrid data to a new grid. \>>> df\_original\_grid \= pl.DataFrame( ... { ... "grid\_points": \[1, 3, 10\], ... "values": \[2.0, 6.0, 20.0\], ... } ... ) \# Interpolate from this to the new grid \>>> df\_new\_grid \= pl.DataFrame({"grid\_points": range(1, 11)}) \>>> df\_new\_grid.join( ... df\_original\_grid, on\="grid\_points", how\="left", coalesce\=True ... ).with\_columns(pl.col("values").interpolate()) shape: (10, 2) ┌─────────────┬────────┐ │ grid\_points ┆ values │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════════════╪════════╡ │ 1 ┆ 2.0 │ │ 2 ┆ 4.0 │ │ 3 ┆ 6.0 │ │ 4 ┆ 8.0 │ │ 5 ┆ 10.0 │ │ 6 ┆ 12.0 │ │ 7 ┆ 14.0 │ │ 8 ┆ 16.0 │ │ 9 ┆ 18.0 │ │ 10 ┆ 20.0 │ └─────────────┴────────┘ interpolate\_by(_by: IntoExpr_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6536-L6571) Fill null values using interpolation based on another column. Nulls at the beginning and end of the series remain null. Parameters: **by** Column to interpolate values based on. Examples Fill null values using linear interpolation. \>>> df \= pl.DataFrame( ... { ... "a": \[1, None, None, 3\], ... "b": \[1, 2, 7, 8\], ... } ... ) \>>> df.with\_columns(a\_interpolated\=pl.col("a").interpolate\_by("b")) shape: (4, 3) ┌──────┬─────┬────────────────┐ │ a ┆ b ┆ a\_interpolated │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ f64 │ ╞══════╪═════╪════════════════╡ │ 1 ┆ 1 ┆ 1.0 │ │ null ┆ 2 ┆ 1.285714 │ │ null ┆ 7 ┆ 2.714286 │ │ 3 ┆ 8 ┆ 3.0 │ └──────┴─────┴────────────────┘ is\_between( _lower\_bound: IntoExpr_, _upper\_bound: IntoExpr_, _closed: ClosedInterval \= 'both'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6160-L6272) Check if this expression is between the given lower and upper bounds. Parameters: **lower\_bound** Lower bound value. Accepts expression input. Strings are parsed as column names, other non-expression inputs are parsed as literals. **upper\_bound** Upper bound value. Accepts expression input. Strings are parsed as column names, other non-expression inputs are parsed as literals. **closed**{‘both’, ‘left’, ‘right’, ‘none’} Define which sides of the interval are closed (inclusive). Returns: Expr Expression of data type `Boolean`. Notes If the value of the `lower_bound` is greater than that of the `upper_bound` then the result will be False, as no value can satisfy the condition. Examples \>>> df \= pl.DataFrame({"num": \[1, 2, 3, 4, 5\]}) \>>> df.with\_columns(pl.col("num").is\_between(2, 4).alias("is\_between")) shape: (5, 2) ┌─────┬────────────┐ │ num ┆ is\_between │ │ --- ┆ --- │ │ i64 ┆ bool │ ╞═════╪════════════╡ │ 1 ┆ false │ │ 2 ┆ true │ │ 3 ┆ true │ │ 4 ┆ true │ │ 5 ┆ false │ └─────┴────────────┘ Use the `closed` argument to include or exclude the values at the bounds: \>>> df.with\_columns( ... pl.col("num").is\_between(2, 4, closed\="left").alias("is\_between") ... ) shape: (5, 2) ┌─────┬────────────┐ │ num ┆ is\_between │ │ --- ┆ --- │ │ i64 ┆ bool │ ╞═════╪════════════╡ │ 1 ┆ false │ │ 2 ┆ true │ │ 3 ┆ true │ │ 4 ┆ false │ │ 5 ┆ false │ └─────┴────────────┘ You can also use strings as well as numeric/temporal values (note: ensure that string literals are wrapped with `lit` so as not to conflate them with column names): \>>> df \= pl.DataFrame({"a": \["a", "b", "c", "d", "e"\]}) \>>> df.with\_columns( ... pl.col("a") ... .is\_between(pl.lit("a"), pl.lit("c"), closed\="both") ... .alias("is\_between") ... ) shape: (5, 2) ┌─────┬────────────┐ │ a ┆ is\_between │ │ --- ┆ --- │ │ str ┆ bool │ ╞═════╪════════════╡ │ a ┆ true │ │ b ┆ true │ │ c ┆ true │ │ d ┆ false │ │ e ┆ false │ └─────┴────────────┘ Use column expressions as lower/upper bounds, comparing to a literal value: \>>> df \= pl.DataFrame({"a": \[1, 2, 3, 4, 5\], "b": \[5, 4, 3, 2, 1\]}) \>>> df.with\_columns( ... pl.lit(3).is\_between(pl.col("a"), pl.col("b")).alias("between\_ab") ... ) shape: (5, 3) ┌─────┬─────┬────────────┐ │ a ┆ b ┆ between\_ab │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ bool │ ╞═════╪═════╪════════════╡ │ 1 ┆ 5 ┆ true │ │ 2 ┆ 4 ┆ true │ │ 3 ┆ 3 ┆ true │ │ 4 ┆ 2 ┆ false │ │ 5 ┆ 1 ┆ false │ └─────┴─────┴────────────┘ is\_close( _other: IntoExpr_, _\*_, _abs\_tol: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)") \= 0.0_, _rel\_tol: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)") \= 1e-09_, _nans\_equal: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6274-L6332) Check if this expression is close, i.e. almost equal, to the other expression. Two values `a` and `b` are considered close if the following condition holds: \\\[|a-b| \\le max \\{ \\text{rel\_tol} \\cdot max \\{ |a|, |b| \\}, \\text{abs\_tol} \\}\\\] Parameters: **other** A literal or expression value to compare with. **abs\_tol** Absolute tolerance. This is the maximum allowed absolute difference between two values. Must be non-negative. **rel\_tol** Relative tolerance. This is the maximum allowed difference between two values, relative to the larger absolute value. Must be non-negative. **nans\_equal** Whether NaN values should be considered equal. Returns: Expr Expression of data type `Boolean`. Notes The implementation of this method is symmetric and mirrors the behavior of `math.isclose()`. Specifically note that this behavior is different to `numpy.isclose()`. Examples \>>> df \= pl.DataFrame({"a": \[1.5, 2.0, 2.5\], "b": \[1.55, 2.2, 3.0\]}) \>>> df.with\_columns(pl.col("a").is\_close("b", abs\_tol\=0.1).alias("is\_close")) shape: (3, 3) ┌─────┬──────┬──────────┐ │ a ┆ b ┆ is\_close │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ bool │ ╞═════╪══════╪══════════╡ │ 1.5 ┆ 1.55 ┆ true │ │ 2.0 ┆ 2.2 ┆ false │ │ 2.5 ┆ 3.0 ┆ false │ └─────┴──────┴──────────┘ is\_duplicated() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4061-L4085) Return a boolean mask indicating duplicated values. Returns: Expr Expression of data type `Boolean`. Examples \>>> df \= pl.DataFrame({"a": \[1, 1, 2\]}) \>>> df.select(pl.col("a").is\_duplicated()) shape: (3, 1) ┌───────┐ │ a │ │ --- │ │ bool │ ╞═══════╡ │ true │ │ true │ │ false │ └───────┘ is\_finite() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1015-L1043) Returns a boolean Series indicating which values are finite. Returns: Expr Expression of data type `Boolean`. Examples \>>> df \= pl.DataFrame( ... { ... "A": \[1.0, 2\], ... "B": \[3.0, float("inf")\], ... } ... ) \>>> df.select(pl.all().is\_finite()) shape: (2, 2) ┌──────┬───────┐ │ A ┆ B │ │ --- ┆ --- │ │ bool ┆ bool │ ╞══════╪═══════╡ │ true ┆ true │ │ true ┆ false │ └──────┴───────┘ is\_first\_distinct() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4005-L4031) Return a boolean mask indicating the first occurrence of each distinct value. Returns: Expr Expression of data type `Boolean`. Examples \>>> df \= pl.DataFrame({"a": \[1, 1, 2, 3, 2\]}) \>>> df.with\_columns(pl.col("a").is\_first\_distinct().alias("first")) shape: (5, 2) ┌─────┬───────┐ │ a ┆ first │ │ --- ┆ --- │ │ i64 ┆ bool │ ╞═════╪═══════╡ │ 1 ┆ true │ │ 1 ┆ false │ │ 2 ┆ true │ │ 3 ┆ true │ │ 2 ┆ false │ └─────┴───────┘ is\_in(_other: Expr | Collection\[Any\] | Series_, _\*_, _nulls\_equal: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6074-L6116) Check if elements of this expression are present in the other Series. Parameters: **other** Series or sequence of primitive type. **nulls\_equal**bool, default False If True, treat null as a distinct value. Null values will not propagate. Returns: Expr Expression of data type `Boolean`. Examples \>>> df \= pl.DataFrame( ... {"sets": \[\[1, 2, 3\], \[1, 2\], \[9, 10\]\], "optional\_members": \[1, 2, 3\]} ... ) \>>> df.with\_columns(contains\=pl.col("optional\_members").is\_in("sets")) shape: (3, 3) ┌───────────┬──────────────────┬──────────┐ │ sets ┆ optional\_members ┆ contains │ │ --- ┆ --- ┆ --- │ │ list\[i64\] ┆ i64 ┆ bool │ ╞═══════════╪══════════════════╪══════════╡ │ \[1, 2, 3\] ┆ 1 ┆ true │ │ \[1, 2\] ┆ 2 ┆ true │ │ \[9, 10\] ┆ 3 ┆ false │ └───────────┴──────────────────┴──────────┘ is\_infinite() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1045-L1073) Returns a boolean Series indicating which values are infinite. Returns: Expr Expression of data type `Boolean`. Examples \>>> df \= pl.DataFrame( ... { ... "A": \[1.0, 2\], ... "B": \[3.0, float("inf")\], ... } ... ) \>>> df.select(pl.all().is\_infinite()) shape: (2, 2) ┌───────┬───────┐ │ A ┆ B │ │ --- ┆ --- │ │ bool ┆ bool │ ╞═══════╪═══════╡ │ false ┆ false │ │ false ┆ true │ └───────┴───────┘ is\_last\_distinct() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4033-L4059) Return a boolean mask indicating the last occurrence of each distinct value. Returns: Expr Expression of data type `Boolean`. Examples \>>> df \= pl.DataFrame({"a": \[1, 1, 2, 3, 2\]}) \>>> df.with\_columns(pl.col("a").is\_last\_distinct().alias("last")) shape: (5, 2) ┌─────┬───────┐ │ a ┆ last │ │ --- ┆ --- │ │ i64 ┆ bool │ ╞═════╪═══════╡ │ 1 ┆ false │ │ 1 ┆ true │ │ 2 ┆ false │ │ 3 ┆ true │ │ 2 ┆ true │ └─────┴───────┘ is\_nan() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1075-L1106) Returns a boolean Series indicating which values are NaN. Notes Floating point `NaN` (Not A Number) should not be confused with missing data represented as `Null/None`. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, None, 1, 5\], ... "b": \[1.0, 2.0, float("nan"), 1.0, 5.0\], ... } ... ) \>>> df.with\_columns(pl.col(pl.Float64).is\_nan().name.suffix("\_isnan")) shape: (5, 3) ┌──────┬─────┬─────────┐ │ a ┆ b ┆ b\_isnan │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool │ ╞══════╪═════╪═════════╡ │ 1 ┆ 1.0 ┆ false │ │ 2 ┆ 2.0 ┆ false │ │ null ┆ NaN ┆ true │ │ 1 ┆ 1.0 ┆ false │ │ 5 ┆ 5.0 ┆ false │ └──────┴─────┴─────────┘ is\_not\_nan() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1108-L1139) Returns a boolean Series indicating which values are not NaN. Notes Floating point `NaN` (Not A Number) should not be confused with missing data represented as `Null/None`. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, None, 1, 5\], ... "b": \[1.0, 2.0, float("nan"), 1.0, 5.0\], ... } ... ) \>>> df.with\_columns(pl.col(pl.Float64).is\_not\_nan().name.suffix("\_is\_not\_nan")) shape: (5, 3) ┌──────┬─────┬──────────────┐ │ a ┆ b ┆ b\_is\_not\_nan │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool │ ╞══════╪═════╪══════════════╡ │ 1 ┆ 1.0 ┆ true │ │ 2 ┆ 2.0 ┆ true │ │ null ┆ NaN ┆ false │ │ 1 ┆ 1.0 ┆ true │ │ 5 ┆ 5.0 ┆ true │ └──────┴─────┴──────────────┘ is\_not\_null() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L985-L1013) Returns a boolean Series indicating which values are not null. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, None, 1, 5\], ... "b": \[1.0, 2.0, float("nan"), 1.0, 5.0\], ... } ... ) \>>> df.with\_columns( ... pl.all().is\_not\_null().name.suffix("\_not\_null") \# nan != null ... ) shape: (5, 4) ┌──────┬─────┬────────────┬────────────┐ │ a ┆ b ┆ a\_not\_null ┆ b\_not\_null │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool ┆ bool │ ╞══════╪═════╪════════════╪════════════╡ │ 1 ┆ 1.0 ┆ true ┆ true │ │ 2 ┆ 2.0 ┆ true ┆ true │ │ null ┆ NaN ┆ false ┆ true │ │ 1 ┆ 1.0 ┆ true ┆ true │ │ 5 ┆ 5.0 ┆ true ┆ true │ └──────┴─────┴────────────┴────────────┘ is\_null() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L957-L983) Returns a boolean Series indicating which values are null. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, None, 1, 5\], ... "b": \[1.0, 2.0, float("nan"), 1.0, 5.0\], ... } ... ) \>>> df.with\_columns(pl.all().is\_null().name.suffix("\_isnull")) \# nan != null shape: (5, 4) ┌──────┬─────┬──────────┬──────────┐ │ a ┆ b ┆ a\_isnull ┆ b\_isnull │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool ┆ bool │ ╞══════╪═════╪══════════╪══════════╡ │ 1 ┆ 1.0 ┆ false ┆ false │ │ 2 ┆ 2.0 ┆ false ┆ false │ │ null ┆ NaN ┆ true ┆ false │ │ 1 ┆ 1.0 ┆ false ┆ false │ │ 5 ┆ 5.0 ┆ false ┆ false │ └──────┴─────┴──────────┴──────────┘ is\_unique() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3984-L4003) Get mask of unique values. Examples \>>> df \= pl.DataFrame({"a": \[1, 1, 2\]}) \>>> df.select(pl.col("a").is\_unique()) shape: (3, 1) ┌───────┐ │ a │ │ --- │ │ bool │ ╞═══════╡ │ false │ │ false │ │ true │ └───────┘ item(_\*_, _allow\_empty: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3603-L3646) Get the single value. This raises an error if there is not exactly one value. Parameters: **allow\_empty** Allow having no values to return `null`. See also [`Expr.get()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.get.html#polars.Expr.get "polars.Expr.get") Get a single value by index. Examples \>>> df \= pl.DataFrame({"a": \[1\]}) \>>> df.select(pl.col("a").item()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ └─────┘ \>>> df \= pl.DataFrame({"a": \[1, 2, 3\]}) \>>> df.select(pl.col("a").item()) Traceback (most recent call last): ... polars.exceptions.ComputeError: aggregation 'item' expected a single value, got 3 values \>>> df.head(0).select(pl.col("a").item(allow\_empty\=True)) shape: (1, 1) ┌──────┐ │ a │ │ --- │ │ i64 │ ╞══════╡ │ null │ └──────┘ kurtosis(_\*_, _fisher: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_, _bias: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9380-L9413) Compute the kurtosis (Fisher or Pearson) of a dataset. Kurtosis is the fourth central moment divided by the square of the variance. If Fisher’s definition is used, then 3.0 is subtracted from the result to give 0.0 for a normal distribution. If bias is False then the kurtosis is calculated using k statistics to eliminate bias coming from biased moment estimators. See scipy.stats for more information Parameters: **fisher**bool, optional If True, Fisher’s definition is used (normal ==> 0.0). If False, Pearson’s definition is used (normal ==> 3.0). **bias**bool, optional If False, the calculations are corrected for statistical bias. Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3, 2, 1\]}) \>>> df.select(pl.col("a").kurtosis()) shape: (1, 1) ┌───────────┐ │ a │ │ --- │ │ f64 │ ╞═══════════╡ │ -1.153061 │ └───────────┘ last(_\*_, _ignore\_nulls: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3577-L3601) Get the last value. Parameters: **ignore\_nulls** Ignore null values (default `False`). If set to `True`, the last non-null value is returned, otherwise `None` is returned if no non-null value exists. Examples \>>> df \= pl.DataFrame({"a": \[1, 3, 2\]}) \>>> df.select(pl.col("a").last()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 2 │ └─────┘ le(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5529-L5561) Method equivalent of “less than or equal” operator `expr <= other`. Parameters: **other** A literal or expression value to compare with. Examples \>>> df \= pl.DataFrame( ... data\={ ... "x": \[5.0, 4.0, float("nan"), 0.5\], ... "y": \[5.0, 3.5, float("nan"), 2.0\], ... } ... ) \>>> df.with\_columns( ... pl.col("x").le(pl.col("y")).alias("x <= y"), ... ) shape: (4, 3) ┌─────┬─────┬────────┐ │ x ┆ y ┆ x <= y │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ bool │ ╞═════╪═════╪════════╡ │ 5.0 ┆ 5.0 ┆ true │ │ 4.0 ┆ 3.5 ┆ false │ │ NaN ┆ NaN ┆ true │ │ 0.5 ┆ 2.0 ┆ true │ └─────┴─────┴────────┘ len() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1231-L1259) Return the number of elements in the column. Null values count towards the total. Returns: Expr Expression of data type `UInt32`. See also [`count`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.count.html#polars.count "polars.count") Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3\], "b": \[None, 4, 4\]}) \>>> df.select(pl.all().len()) shape: (1, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ u32 ┆ u32 │ ╞═════╪═════╡ │ 3 ┆ 3 │ └─────┴─────┘ limit(_n: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | Expr \= 10_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5232-L5256) Get the first `n` rows (alias for [`Expr.head()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.head.html#polars.Expr.head "polars.Expr.head") ). Parameters: **n** Number of rows to return. Examples \>>> df \= pl.DataFrame({"foo": \[1, 2, 3, 4, 5, 6, 7\]}) \>>> df.select(pl.col("foo").limit(3)) shape: (3, 1) ┌─────┐ │ foo │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ │ 2 │ │ 3 │ └─────┘ log(_base: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)") | IntoExpr \= 2.718281828459045_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10719-L10744) Compute the logarithm to a given base. Parameters: **base** Given base, defaults to `e` Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3\]}) \>>> df.select(pl.col("a").log(base\=2)) shape: (3, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 0.0 │ │ 1.0 │ │ 1.584963 │ └──────────┘ log10() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L681-L700) Compute the base 10 logarithm of the input array, element-wise. Examples \>>> df \= pl.DataFrame({"values": \[1.0, 2.0, 4.0\]}) \>>> df.select(pl.col("values").log10()) shape: (3, 1) ┌─────────┐ │ values │ │ --- │ │ f64 │ ╞═════════╡ │ 0.0 │ │ 0.30103 │ │ 0.60206 │ └─────────┘ log1p() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10746-L10767) Compute the natural logarithm of each element plus one. This computes `log(1 + x)` but is more numerically stable for `x` close to zero. Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3\]}) \>>> df.select(pl.col("a").log1p()) shape: (3, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 0.693147 │ │ 1.098612 │ │ 1.386294 │ └──────────┘ lower\_bound() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9502-L9522) Calculate the lower bound. Returns a unit Series with the lowest value possible for the dtype of this expression. Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3, 2, 1\]}) \>>> df.select(pl.col("a").lower\_bound()) shape: (1, 1) ┌──────────────────────┐ │ a │ │ --- │ │ i64 │ ╞══════════════════════╡ │ -9223372036854775808 │ └──────────────────────┘ lt(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5563-L5595) Method equivalent of “less than” operator `expr < other`. Parameters: **other** A literal or expression value to compare with. Examples \>>> df \= pl.DataFrame( ... data\={ ... "x": \[1.0, 2.0, float("nan"), 3.0\], ... "y": \[2.0, 2.0, float("nan"), 4.0\], ... } ... ) \>>> df.with\_columns( ... pl.col("x").lt(pl.col("y")).alias("x < y"), ... ) shape: (4, 3) ┌─────┬─────┬───────┐ │ x ┆ y ┆ x < y │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ bool │ ╞═════╪═════╪═══════╡ │ 1.0 ┆ 2.0 ┆ true │ │ 2.0 ┆ 2.0 ┆ false │ │ NaN ┆ NaN ┆ false │ │ 3.0 ┆ 4.0 ┆ true │ └─────┴─────┴───────┘ map\_batches( _function: Callable\[\[Series\], Series | Any\]_, _return\_dtype: PolarsDataType | DataTypeExpr | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _agg\_list: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _is\_elementwise: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _returns\_scalar: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4599-L4749) Apply a custom python function to a whole Series or sequence of Series. The output of this custom function is presumed to be either a Series, or a NumPy array (in which case it will be automatically converted into a Series), or a scalar that will be converted into a Series. If the result is a scalar and you want it to stay as a scalar, pass in `returns_scalar=True`. If you want to apply a custom function elementwise over single values, see [`map_elements()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.map_elements.html#polars.Expr.map_elements "polars.Expr.map_elements") . A reasonable use case for `map` functions is transforming the values represented by an expression using a third-party library. Parameters: **function** Lambda/function to apply. **return\_dtype** Datatype of the output Series. It is recommended to set this whenever possible. If this is `None`, it tries to infer the datatype by calling the function with dummy data and looking at the output. **agg\_list** First implode when in a group-by aggregation. Deprecated since version 1.32.0: Use `expr.implode().map_batches(..)` instead. **is\_elementwise** Set to true if the operations is elementwise for better performance and optimization. An elementwise operations has unit or equal length for all inputs and can be ran sequentially on slices without results being affected. **returns\_scalar** If the function returns a scalar, by default it will be wrapped in a list in the output, since the assumption is that the function always returns something Series-like. If you want to keep the result as a scalar, set this argument to True. See also [`map_elements`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.map_elements.html#polars.Expr.map_elements "polars.Expr.map_elements") [`replace`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.replace.html#polars.Expr.replace "polars.Expr.replace") Notes A UDF passed to `map_batches` must be pure, meaning that it cannot modify or depend on state other than its arguments. Polars may call the function with arbitrary input data. Examples \>>> df \= pl.DataFrame( ... { ... "sine": \[0.0, 1.0, 0.0, \-1.0\], ... "cosine": \[1.0, 0.0, \-1.0, 0.0\], ... } ... ) \>>> df.select( ... pl.all().map\_batches( ... lambda x: x.to\_numpy().argmax(), ... returns\_scalar\=True, ... ) ... ) shape: (1, 2) ┌──────┬────────┐ │ sine ┆ cosine │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞══════╪════════╡ │ 1 ┆ 0 │ └──────┴────────┘ Here’s an example of a function that returns a scalar, where we want it to stay as a scalar: \>>> df \= pl.DataFrame( ... { ... "a": \[0, 1, 0, 1\], ... "b": \[1, 2, 3, 4\], ... } ... ) \>>> df.group\_by("a").agg( ... pl.col("b").map\_batches( ... lambda x: x.max(), returns\_scalar\=True, return\_dtype\=pl.self\_dtype() ... ) ... ) shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 4 │ │ 0 ┆ 3 │ └─────┴─────┘ Call a function that takes multiple arguments by creating a `struct` and referencing its fields inside the function call. \>>> df \= pl.DataFrame( ... { ... "a": \[5, 1, 0, 3\], ... "b": \[4, 2, 3, 4\], ... } ... ) \>>> df.with\_columns( ... a\_times\_b\=pl.struct("a", "b").map\_batches( ... lambda x: np.multiply(x.struct.field("a"), x.struct.field("b")), ... return\_dtype\=pl.Int64, ... ) ... ) shape: (4, 3) ┌─────┬─────┬───────────┐ │ a ┆ b ┆ a\_times\_b │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═══════════╡ │ 5 ┆ 4 ┆ 20 │ │ 1 ┆ 2 ┆ 2 │ │ 0 ┆ 3 ┆ 0 │ │ 3 ┆ 4 ┆ 12 │ └─────┴─────┴───────────┘ map\_elements( _function: Callable\[\[Any\], Any\]_, _return\_dtype: PolarsDataType | DataTypeExpr | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _skip\_nulls: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_, _pass\_name: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _strategy: MapElementsStrategy \= 'thread\_local'_, _returns\_scalar: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4751-L5028) Map a custom/user-defined function (UDF) to each element of a column. Warning This method is much slower than the native expressions API. Only use it if you cannot implement your logic otherwise. Suppose that the function is: `x ↦ sqrt(x)`: * For mapping elements of a series, consider: `pl.col("col_name").sqrt()`. * For mapping inner elements of lists, consider: `pl.col("col_name").list.eval(pl.element().sqrt())`. * For mapping elements of struct fields, consider: `pl.col("col_name").struct.field("field_name").sqrt()`. If you want to replace the original column or field, consider [`.with_columns`](https://docs.pola.rs/api/python/stable/reference/dataframe/api/polars.DataFrame.with_columns.html#polars.DataFrame.with_columns "polars.DataFrame.with_columns") and [`.with_fields`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.struct.with_fields.html#polars.Expr.struct.with_fields "polars.Expr.struct.with_fields") . Parameters: **function** Lambda/function to map. **return\_dtype** Datatype of the output Series. It is recommended to set this whenever possible. If this is `None`, it tries to infer the datatype by calling the function with dummy data and looking at the output. **skip\_nulls** Don’t map the function over values that contain nulls (this is faster). **pass\_name** Pass the Series name to the custom function (this is more expensive). **returns\_scalar** Deprecated since version 1.32.0: Is ignored and will be removed in 2.0. **strategy**{‘thread\_local’, ‘threading’} The threading strategy to use. * ‘thread\_local’: run the python function on a single thread. * ‘threading’: run the python function on separate threads. Use with care as this can slow performance. This might only speed up your code if the amount of work per element is significant and the python function releases the GIL (e.g. via calling a c function) Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Notes * Using `map_elements` is strongly discouraged as you will be effectively running python “for” loops, which will be very slow. Wherever possible you should prefer the native expression API to achieve the best performance. * If your function is expensive and you don’t want it to be called more than once for a given input, consider applying an `@lru_cache` decorator to it. If your data is suitable you may achieve _significant_ speedups. * Window function application using `over` is considered a GroupBy context here, so `map_elements` can be used to map functions over window groups. * A UDF passed to `map_elements` must be pure, meaning that it cannot modify or depend on state other than its arguments. Polars may call the function with arbitrary input data. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, 3, 1\], ... "b": \["a", "b", "c", "c"\], ... } ... ) The function is applied to each element of column `'a'`: \>>> df.with\_columns( ... pl.col("a") ... .map\_elements(lambda x: x \* 2, return\_dtype\=pl.self\_dtype()) ... .alias("a\_times\_2"), ... ) shape: (4, 3) ┌─────┬─────┬───────────┐ │ a ┆ b ┆ a\_times\_2 │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ i64 │ ╞═════╪═════╪═══════════╡ │ 1 ┆ a ┆ 2 │ │ 2 ┆ b ┆ 4 │ │ 3 ┆ c ┆ 6 │ │ 1 ┆ c ┆ 2 │ └─────┴─────┴───────────┘ Tip: it is better to implement this with an expression: \>>> df.with\_columns( ... (pl.col("a") \* 2).alias("a\_times\_2"), ... ) \>>> ( ... df.lazy() ... .group\_by("b") ... .agg( ... pl.col("a") ... .implode() ... .map\_elements(lambda x: x.sum(), return\_dtype\=pl.Int64) ... ) ... .collect() ... ) shape: (3, 2) ┌─────┬─────┐ │ b ┆ a │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪═════╡ │ a ┆ 1 │ │ b ┆ 2 │ │ c ┆ 4 │ └─────┴─────┘ Tip: again, it is better to implement this with an expression: \>>> ( ... df.lazy() ... .group\_by("b", maintain\_order\=True) ... .agg(pl.col("a").sum()) ... .collect() ... ) Window function application using `over` will behave as a GroupBy context, with your function receiving individual window groups: \>>> df \= pl.DataFrame( ... { ... "key": \["x", "x", "y", "x", "y", "z"\], ... "val": \[1, 1, 1, 1, 1, 1\], ... } ... ) \>>> df.with\_columns( ... scaled\=pl.col("val") ... .implode() ... .map\_elements(lambda s: s \* len(s), return\_dtype\=pl.List(pl.Int64)) ... .explode() ... .over("key"), ... ).sort("key") shape: (6, 3) ┌─────┬─────┬────────┐ │ key ┆ val ┆ scaled │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪════════╡ │ x ┆ 1 ┆ 3 │ │ x ┆ 1 ┆ 3 │ │ x ┆ 1 ┆ 3 │ │ y ┆ 1 ┆ 2 │ │ y ┆ 1 ┆ 2 │ │ z ┆ 1 ┆ 1 │ └─────┴─────┴────────┘ Note that this function would _also_ be better-implemented natively: \>>> df.with\_columns( ... scaled\=(pl.col("val") \* pl.col("val").count()).over("key"), ... ).sort("key") max() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3117-L3134) Get maximum value. Examples \>>> df \= pl.DataFrame({"a": \[\-1.0, float("nan"), 1.0\]}) \>>> df.select(pl.col("a").max()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 1.0 │ └─────┘ max\_by(_by: IntoExpr_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3136-L3168) Get maximum value, ordered by another expression. If the by expression has multiple values equal to the maximum it is not defined which value will be chosen. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Parameters: **by** Column used to determine the largest element. Accepts expression input. Strings are parsed as column names. Examples \>>> df \= pl.DataFrame({"a": \[\-1.0, float("nan"), 1.0\], "b": \["x", "y", "z"\]}) \>>> df.select(pl.col("b").max\_by("a")) shape: (1, 1) ┌─────┐ │ b │ │ --- │ │ str │ ╞═════╡ │ z │ └─────┘ mean() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3295-L3312) Get mean value. Examples \>>> df \= pl.DataFrame({"a": \[\-1, 0, 1\]}) \>>> df.select(pl.col("a").mean()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 0.0 │ └─────┘ median() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3314-L3331) Get median value using linear interpolation. Examples \>>> df \= pl.DataFrame({"a": \[\-1, 0, 1\]}) \>>> df.select(pl.col("a").median()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 0.0 │ └─────┘ min() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3170-L3187) Get minimum value. Examples \>>> df \= pl.DataFrame({"a": \[\-1.0, float("nan"), 1.0\]}) \>>> df.select(pl.col("a").min()) shape: (1, 1) ┌──────┐ │ a │ │ --- │ │ f64 │ ╞══════╡ │ -1.0 │ └──────┘ min\_by(_by: IntoExpr_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3189-L3221) Get minimum value, ordered by another expression. If the by expression has multiple values equal to the minimum it is not defined which value will be chosen. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Parameters: **by** Column used to determine the smallest element. Accepts expression input. Strings are parsed as column names. Examples \>>> df \= pl.DataFrame({"a": \[\-1.0, float("nan"), 1.0\], "b": \["x", "y", "z"\]}) \>>> df.select(pl.col("b").min\_by("a")) shape: (1, 1) ┌─────┐ │ b │ │ --- │ │ str │ ╞═════╡ │ x │ └─────┘ mod(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5804-L5830) Method equivalent of modulus operator `expr % other`. Parameters: **other** Numeric literal or expression value. Examples \>>> df \= pl.DataFrame({"x": \[0, 1, 2, 3, 4\]}) \>>> df.with\_columns(pl.col("x").mod(2).alias("x%2")) shape: (5, 2) ┌─────┬─────┐ │ x ┆ x%2 │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 0 ┆ 0 │ │ 1 ┆ 1 │ │ 2 ┆ 0 │ │ 3 ┆ 1 │ │ 4 ┆ 0 │ └─────┴─────┘ mode(_\*_, _maintain\_order: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1804-L1833) Compute the most occurring value(s). Can return multiple Values. Parameters: **maintain\_order** Maintain order of data. This requires more work. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 1, 2, 3\], ... "b": \[1, 1, 2, 2\], ... } ... ) \>>> df.select(pl.all().mode().first()) shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 1 │ └─────┴─────┘ mul(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5832-L5861) Method equivalent of multiplication operator `expr * other`. Parameters: **other** Numeric literal or expression value. Examples \>>> df \= pl.DataFrame({"x": \[1, 2, 4, 8, 16\]}) \>>> df.with\_columns( ... pl.col("x").mul(2).alias("x\*2"), ... pl.col("x").mul(pl.col("x").log(2)).alias("x \* xlog2"), ... ) shape: (5, 3) ┌─────┬─────┬───────────┐ │ x ┆ x\*2 ┆ x \* xlog2 │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ f64 │ ╞═════╪═════╪═══════════╡ │ 1 ┆ 2 ┆ 0.0 │ │ 2 ┆ 4 ┆ 2.0 │ │ 4 ┆ 8 ┆ 8.0 │ │ 8 ┆ 16 ┆ 24.0 │ │ 16 ┆ 32 ┆ 64.0 │ └─────┴─────┴───────────┘ n\_unique() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3359-L3383) Count unique values. Notes `null` is considered to be a unique value for the purposes of this operation. Examples \>>> df \= pl.DataFrame({"x": \[1, 1, 2, 2, 3\], "y": \[1, 1, 1, None, None\]}) \>>> df.select( ... x\_unique\=pl.col("x").n\_unique(), ... y\_unique\=pl.col("y").n\_unique(), ... ) shape: (1, 2) ┌──────────┬──────────┐ │ x\_unique ┆ y\_unique │ │ --- ┆ --- │ │ u32 ┆ u32 │ ╞══════════╪══════════╡ │ 3 ┆ 2 │ └──────────┴──────────┘ nan\_max() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3223-L3243) Get maximum value, but propagate/poison encountered NaN values. This differs from numpy’s `nanmax` as numpy defaults to propagating NaN values, whereas polars defaults to ignoring them. Examples \>>> df \= pl.DataFrame({"a": \[0.0, float("nan")\]}) \>>> df.select(pl.col("a").nan\_max()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ NaN │ └─────┘ nan\_min() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3245-L3265) Get minimum value, but propagate/poison encountered NaN values. This differs from numpy’s `nanmax` as numpy defaults to propagating NaN values, whereas polars defaults to ignoring them. Examples \>>> df \= pl.DataFrame({"a": \[0.0, float("nan")\]}) \>>> df.select(pl.col("a").nan\_min()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ NaN │ └─────┘ ne(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5597-L5629) Method equivalent of inequality operator `expr != other`. Parameters: **other** A literal or expression value to compare with. Examples \>>> df \= pl.DataFrame( ... data\={ ... "x": \[1.0, 2.0, float("nan"), 4.0\], ... "y": \[2.0, 2.0, float("nan"), 4.0\], ... } ... ) \>>> df.with\_columns( ... pl.col("x").ne(pl.col("y")).alias("x != y"), ... ) shape: (4, 3) ┌─────┬─────┬────────┐ │ x ┆ y ┆ x != y │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ bool │ ╞═════╪═════╪════════╡ │ 1.0 ┆ 2.0 ┆ true │ │ 2.0 ┆ 2.0 ┆ false │ │ NaN ┆ NaN ┆ false │ │ 4.0 ┆ 4.0 ┆ false │ └─────┴─────┴────────┘ ne\_missing(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5631-L5669) Method equivalent of equality operator `expr != other` where `None == None`. This differs from default `ne` where null values are propagated. Parameters: **other** A literal or expression value to compare with. Examples \>>> df \= pl.DataFrame( ... data\={ ... "x": \[1.0, 2.0, float("nan"), 4.0, None, None\], ... "y": \[2.0, 2.0, float("nan"), 4.0, 5.0, None\], ... } ... ) \>>> df.with\_columns( ... pl.col("x").ne(pl.col("y")).alias("x ne y"), ... pl.col("x").ne\_missing(pl.col("y")).alias("x ne\_missing y"), ... ) shape: (6, 4) ┌──────┬──────┬────────┬────────────────┐ │ x ┆ y ┆ x ne y ┆ x ne\_missing y │ │ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ bool ┆ bool │ ╞══════╪══════╪════════╪════════════════╡ │ 1.0 ┆ 2.0 ┆ true ┆ true │ │ 2.0 ┆ 2.0 ┆ false ┆ false │ │ NaN ┆ NaN ┆ false ┆ false │ │ 4.0 ┆ 4.0 ┆ false ┆ false │ │ null ┆ 5.0 ┆ null ┆ true │ │ null ┆ null ┆ null ┆ false │ └──────┴──────┴────────┴────────────────┘ neg() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5894-L5914) Method equivalent of unary minus operator `-expr`. Examples \>>> df \= pl.DataFrame({"a": \[\-1, 0, 2, None\]}) \>>> df.with\_columns(pl.col("a").neg()) shape: (4, 1) ┌──────┐ │ a │ │ --- │ │ i64 │ ╞══════╡ │ 1 │ │ 0 │ │ -2 │ │ null │ └──────┘ not\_() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L918-L955) Method equivalent of bitwise “not” operator `~expr`. This has the effect of negating logical boolean expressions, but operates bitwise on integers. Examples \>>> df \= pl.DataFrame( ... { ... "label": \["aa", "bb", "cc", "dd", "ee"\], ... "valid": \[True, False, None, False, True\], ... "int\_code": \[1, 0, 2, None, \-1\], ... } ... ) Apply “not” to boolean expression (negates the value) and integer expression (operates bitwise): \>>> df.with\_columns( ... not\_valid\=pl.col("valid").not\_(), ... not\_int\_code\=pl.col("int\_code").not\_(), ... ) shape: (5, 5) ┌───────┬───────┬──────────┬───────────┬──────────────┐ │ label ┆ valid ┆ int\_code ┆ not\_valid ┆ not\_int\_code │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ bool ┆ i64 ┆ bool ┆ i64 │ ╞═══════╪═══════╪══════════╪═══════════╪══════════════╡ │ aa ┆ true ┆ 1 ┆ false ┆ -2 │ │ bb ┆ false ┆ 0 ┆ true ┆ -1 │ │ cc ┆ null ┆ 2 ┆ null ┆ -3 │ │ dd ┆ false ┆ null ┆ true ┆ null │ │ ee ┆ true ┆ -1 ┆ false ┆ 0 │ └───────┴───────┴──────────┴───────────┴──────────────┘ null\_count() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3419-L3442) Count null values. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[None, 1, None\], ... "b": \[10, None, 300\], ... "c": \[350, 650, 850\], ... } ... ) \>>> df.select(pl.all().null\_count()) shape: (1, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ u32 ┆ u32 ┆ u32 │ ╞═════╪═════╪═════╡ │ 2 ┆ 1 ┆ 0 │ └─────┴─────┴─────┘ or\_(_\*others: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5323-L5385) Method equivalent of bitwise “or” operator `expr | other | ...`. This has the effect of combining logical boolean expressions, but operates bitwise on integers. Parameters: **\*others** One or more integer or boolean expressions to evaluate/combine. Examples \>>> df \= pl.DataFrame( ... data\={ ... "x": \[5, 6, 7, 4, 8\], ... "y": \[1.5, 2.5, 1.0, 4.0, \-5.75\], ... "z": \[\-9, 2, \-1, 4, 8\], ... } ... ) Combine logical “or” conditions: \>>> df.select( ... (pl.col("x") \== pl.col("y")) ... .or\_( ... pl.col("x") \== pl.col("y"), ... pl.col("y") \== pl.col("z"), ... pl.col("y").cast(int) \== pl.col("z"), ... ) ... .alias("any") ... ) shape: (5, 1) ┌───────┐ │ any │ │ --- │ │ bool │ ╞═══════╡ │ false │ │ true │ │ false │ │ true │ │ false │ └───────┘ Bitwise “or” operation on integer columns: \>>> df.select("x", "z", x\_or\_z\=pl.col("x").or\_(pl.col("z"))) shape: (5, 3) ┌─────┬─────┬────────┐ │ x ┆ z ┆ x\_or\_z │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪════════╡ │ 5 ┆ -9 ┆ -9 │ │ 6 ┆ 2 ┆ 6 │ │ 7 ┆ -1 ┆ -1 │ │ 4 ┆ 4 ┆ 4 │ │ 8 ┆ 8 ┆ 8 │ └─────┴─────┴────────┘ over( _partition\_by: IntoExpr | Iterable\[IntoExpr\] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*more\_exprs: IntoExpr_, _order\_by: IntoExpr | Iterable\[IntoExpr\] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _descending: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _nulls\_last: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _mapping\_strategy: WindowMappingStrategy \= 'group\_to\_rows'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3648-L3874) Compute expressions over the given groups. This expression is similar to performing a group by aggregation and joining the result back into the original DataFrame. The outcome is similar to how [window functions](https://www.postgresql.org/docs/current/tutorial-window.html) work in PostgreSQL. Parameters: **partition\_by** Column(s) to group by. Accepts expression input. Strings are parsed as column names. **\*more\_exprs** Additional columns to group by, specified as positional arguments. **order\_by** Order the window functions/aggregations with the partitioned groups by the result of the expression passed to `order_by`. **descending** In case ‘order\_by’ is given, indicate whether to order in ascending or descending order. **nulls\_last** In case ‘order\_by’ is given, indicate whether to order the nulls in last position. **mapping\_strategy: {‘group\_to\_rows’, ‘join’, ‘explode’}** * group\_to\_rows If the aggregation results in multiple values per group, map them back to their row position in the DataFrame. This can only be done if each group yields the same elements before aggregation as after. If the aggregation results in one scalar value per group, this value will be mapped to every row. * join If the aggregation may result in multiple values per group, join the values as ‘List’ to each row position. Warning: this can be memory intensive. If the aggregation always results in one scalar value per group, join this value as ‘’ to each row position. * explode If the aggregation may result in multiple values per group, map each value to a new row, similar to the results of `group_by` + `agg` + `explode`. If the aggregation always results in one scalar value per group, map this value to one row position. Sorting of the given groups is required if the groups are not part of the window operation for the operation, otherwise the result would not make sense. This operation changes the number of rows. Examples Pass the name of a column to compute the expression over that column. \>>> df \= pl.DataFrame( ... { ... "a": \["a", "a", "b", "b", "b"\], ... "b": \[1, 2, 3, 5, 3\], ... "c": \[5, 4, 3, 2, 1\], ... } ... ) \>>> df.with\_columns(c\_max\=pl.col("c").max().over("a")) shape: (5, 4) ┌─────┬─────┬─────┬───────┐ │ a ┆ b ┆ c ┆ c\_max │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╪═══════╡ │ a ┆ 1 ┆ 5 ┆ 5 │ │ a ┆ 2 ┆ 4 ┆ 5 │ │ b ┆ 3 ┆ 3 ┆ 3 │ │ b ┆ 5 ┆ 2 ┆ 3 │ │ b ┆ 3 ┆ 1 ┆ 3 │ └─────┴─────┴─────┴───────┘ Expression input is also supported. \>>> df.with\_columns(c\_max\=pl.col("c").max().over(pl.col("b") // 2)) shape: (5, 4) ┌─────┬─────┬─────┬───────┐ │ a ┆ b ┆ c ┆ c\_max │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╪═══════╡ │ a ┆ 1 ┆ 5 ┆ 5 │ │ a ┆ 2 ┆ 4 ┆ 4 │ │ b ┆ 3 ┆ 3 ┆ 4 │ │ b ┆ 5 ┆ 2 ┆ 2 │ │ b ┆ 3 ┆ 1 ┆ 4 │ └─────┴─────┴─────┴───────┘ Group by multiple columns by passing multiple column names or expressions. \>>> df.with\_columns(c\_min\=pl.col("c").min().over("a", pl.col("b") % 2)) shape: (5, 4) ┌─────┬─────┬─────┬───────┐ │ a ┆ b ┆ c ┆ c\_min │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╪═══════╡ │ a ┆ 1 ┆ 5 ┆ 5 │ │ a ┆ 2 ┆ 4 ┆ 4 │ │ b ┆ 3 ┆ 3 ┆ 1 │ │ b ┆ 5 ┆ 2 ┆ 1 │ │ b ┆ 3 ┆ 1 ┆ 1 │ └─────┴─────┴─────┴───────┘ Mapping strategy `join` joins the values by group. \>>> df.with\_columns( ... c\_pairs\=pl.col("c").head(2).over("a", mapping\_strategy\="join") ... ) shape: (5, 4) ┌─────┬─────┬─────┬───────────┐ │ a ┆ b ┆ c ┆ c\_pairs │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ list\[i64\] │ ╞═════╪═════╪═════╪═══════════╡ │ a ┆ 1 ┆ 5 ┆ \[5, 4\] │ │ a ┆ 2 ┆ 4 ┆ \[5, 4\] │ │ b ┆ 3 ┆ 3 ┆ \[3, 2\] │ │ b ┆ 5 ┆ 2 ┆ \[3, 2\] │ │ b ┆ 3 ┆ 1 ┆ \[3, 2\] │ └─────┴─────┴─────┴───────────┘ Mapping strategy `explode` maps the values to new rows, changing the shape. \>>> df.select( ... c\_first\_2\=pl.col("c").head(2).over("a", mapping\_strategy\="explode") ... ) shape: (4, 1) ┌───────────┐ │ c\_first\_2 │ │ --- │ │ i64 │ ╞═══════════╡ │ 5 │ │ 4 │ │ 3 │ │ 2 │ └───────────┘ You can use non-elementwise expressions with `over` too. By default they are evaluated using row-order, but you can specify a different one using `order_by`. \>>> from datetime import date \>>> df \= pl.DataFrame( ... { ... "store\_id": \["a", "a", "b", "b"\], ... "date": \[\ ... date(2024, 9, 18),\ ... date(2024, 9, 17),\ ... date(2024, 9, 18),\ ... date(2024, 9, 16),\ ... \], ... "sales": \[7, 9, 8, 10\], ... } ... ) \>>> df.with\_columns( ... cumulative\_sales\=pl.col("sales") ... .cum\_sum() ... .over("store\_id", order\_by\="date") ... ) shape: (4, 4) ┌──────────┬────────────┬───────┬──────────────────┐ │ store\_id ┆ date ┆ sales ┆ cumulative\_sales │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ i64 ┆ i64 │ ╞══════════╪════════════╪═══════╪══════════════════╡ │ a ┆ 2024-09-18 ┆ 7 ┆ 16 │ │ a ┆ 2024-09-17 ┆ 9 ┆ 9 │ │ b ┆ 2024-09-18 ┆ 8 ┆ 18 │ │ b ┆ 2024-09-16 ┆ 10 ┆ 10 │ └──────────┴────────────┴───────┴──────────────────┘ If you don’t require that the group order be preserved, then the more performant option is to use `mapping_strategy='explode'` - be careful however to only ever use this in a `select` statement, not a `with_columns` one. \>>> window \= { ... "partition\_by": "store\_id", ... "order\_by": "date", ... "mapping\_strategy": "explode", ... } \>>> df.select( ... pl.all().over(\*\*window), ... cumulative\_sales\=pl.col("sales").cum\_sum().over(\*\*window), ... ) shape: (4, 4) ┌──────────┬────────────┬───────┬──────────────────┐ │ store\_id ┆ date ┆ sales ┆ cumulative\_sales │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ i64 ┆ i64 │ ╞══════════╪════════════╪═══════╪══════════════════╡ │ a ┆ 2024-09-17 ┆ 9 ┆ 9 │ │ a ┆ 2024-09-18 ┆ 7 ┆ 16 │ │ b ┆ 2024-09-16 ┆ 10 ┆ 10 │ │ b ┆ 2024-09-18 ┆ 8 ┆ 18 │ └──────────┴────────────┴───────┴──────────────────┘ pct\_change(_n: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | IntoExprColumn \= 1_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9284-L9325) Computes percentage change between values. Percentage change (as fraction) between current element and most-recent non-null element at least `n` period(s) before the current element. Computes the change from the previous row by default. Parameters: **n** periods to shift for forming percent change. Notes Null values are preserved. If you’re coming from pandas, this matches their `fill_method=None` behaviour. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[10, 11, 12, None, 12\], ... } ... ) \>>> df.with\_columns(pl.col("a").pct\_change().alias("pct\_change")) shape: (5, 2) ┌──────┬────────────┐ │ a ┆ pct\_change │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞══════╪════════════╡ │ 10 ┆ null │ │ 11 ┆ 0.1 │ │ 12 ┆ 0.090909 │ │ null ┆ null │ │ 12 ┆ null │ └──────┴────────────┘ peak\_max() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4087-L4108) Get a boolean mask of the local maximum peaks. Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3, 4, 5\]}) \>>> df.select(pl.col("a").peak\_max()) shape: (5, 1) ┌───────┐ │ a │ │ --- │ │ bool │ ╞═══════╡ │ false │ │ false │ │ false │ │ false │ │ true │ └───────┘ peak\_min() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4110-L4131) Get a boolean mask of the local minimum peaks. Examples \>>> df \= pl.DataFrame({"a": \[4, 1, 3, 2, 5\]}) \>>> df.select(pl.col("a").peak\_min()) shape: (5, 1) ┌───────┐ │ a │ │ --- │ │ bool │ ╞═══════╡ │ false │ │ true │ │ false │ │ true │ │ false │ └───────┘ pipe( _function: Callable\[Concatenate\[Expr, P\], T\]_, _\*args: P.args_, _\*\*kwargs: P.kwargs_, ) → T[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L868-L916) Offers a structured way to apply a sequence of user-defined functions (UDFs). Parameters: **function** Callable; will receive the expression as the first parameter, followed by any given args/kwargs. **\*args** Arguments to pass to the UDF. **\*\*kwargs** Keyword arguments to pass to the UDF. Examples \>>> def extract\_number(expr: pl.Expr) \-> pl.Expr: ... """Extract the digits from a string.""" ... return expr.str.extract(r"\\d+", 0).cast(pl.Int64) \>>> \>>> def scale\_negative\_even(expr: pl.Expr, \*, n: int \= 1) \-> pl.Expr: ... """Set even numbers negative, and scale by a user-supplied value.""" ... expr \= pl.when(expr % 2 \== 0).then(\-expr).otherwise(expr) ... return expr \* n \>>> \>>> df \= pl.DataFrame({"val": \["a: 1", "b: 2", "c: 3", "d: 4"\]}) \>>> df.with\_columns( ... udfs\=( ... pl.col("val").pipe(extract\_number).pipe(scale\_negative\_even, n\=5) ... ), ... ) shape: (4, 2) ┌──────┬──────┐ │ val ┆ udfs │ │ --- ┆ --- │ │ str ┆ i64 │ ╞══════╪══════╡ │ a: 1 ┆ 5 │ │ b: 2 ┆ -10 │ │ c: 3 ┆ 15 │ │ d: 4 ┆ -20 │ └──────┴──────┘ pow(_exponent: IntoExprColumn | [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5960-L6011) Method equivalent of exponentiation operator `expr ** exponent`. If the exponent is float, the result follows the dtype of exponent. Otherwise, it follows dtype of base. Parameters: **exponent** Numeric literal or expression exponent value. Examples \>>> df \= pl.DataFrame({"x": \[1, 2, 4, 8\]}) \>>> df.with\_columns( ... pl.col("x").pow(3).alias("cube"), ... pl.col("x").pow(pl.col("x").log(2)).alias("x \*\* xlog2"), ... ) shape: (4, 3) ┌─────┬──────┬────────────┐ │ x ┆ cube ┆ x \*\* xlog2 │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ f64 │ ╞═════╪══════╪════════════╡ │ 1 ┆ 1 ┆ 1.0 │ │ 2 ┆ 8 ┆ 2.0 │ │ 4 ┆ 64 ┆ 16.0 │ │ 8 ┆ 512 ┆ 512.0 │ └─────┴──────┴────────────┘ Raising an integer to a positive integer results in an integer - in order to raise to a negative integer, you can cast either the base or the exponent to float first: \>>> df.with\_columns( ... x\_squared\=pl.col("x").pow(2), ... x\_inverse\=pl.col("x").pow(\-1.0), ... ) shape: (4, 3) ┌─────┬───────────┬───────────┐ │ x ┆ x\_squared ┆ x\_inverse │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ f64 │ ╞═════╪═══════════╪═══════════╡ │ 1 ┆ 1 ┆ 1.0 │ │ 2 ┆ 4 ┆ 0.5 │ │ 4 ┆ 16 ┆ 0.25 │ │ 8 ┆ 64 ┆ 0.125 │ └─────┴───────────┴───────────┘ product() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3333-L3357) Compute the product of an expression. Notes If there are no non-null values, then the output is `1`. If you would prefer empty products to return `None`, you can use `pl.when(expr.count()>0).then(expr.product())` instead of `expr.product()`. Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3\]}) \>>> df.select(pl.col("a").product()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 6 │ └─────┘ qcut( _quantiles: [Sequence](https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \] | [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _\*_, _labels: [Sequence](https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence "(in Python v3.14)") \[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _left\_closed: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _allow\_duplicates: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _include\_breaks: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4281-L4396) Bin continuous values into discrete categories based on their quantiles. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Parameters: **quantiles** Either a list of quantile probabilities between 0 and 1 or a positive integer determining the number of bins with uniform probability. **labels** Names of the categories. The number of labels must be equal to the number of categories. **left\_closed** Set the intervals to be left-closed instead of right-closed. **allow\_duplicates** If set to `True`, duplicates in the resulting quantiles are dropped, rather than raising a `DuplicateError`. This can happen even with unique probabilities, depending on the data. **include\_breaks** Include a column with the right endpoint of the bin each observation falls in. This will change the data type of the output from a `Categorical` to a `Struct`. Returns: Expr Expression of data type `Categorical` if `include_breaks` is set to `False` (default), otherwise an expression of data type `Struct`. See also [`cut`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cut.html#polars.Expr.cut "polars.Expr.cut") Examples Divide a column into three categories according to pre-defined quantile probabilities. \>>> df \= pl.DataFrame({"foo": \[\-2, \-1, 0, 1, 2\]}) \>>> df.with\_columns( ... pl.col("foo").qcut(\[0.25, 0.75\], labels\=\["a", "b", "c"\]).alias("qcut") ... ) shape: (5, 2) ┌─────┬──────┐ │ foo ┆ qcut │ │ --- ┆ --- │ │ i64 ┆ cat │ ╞═════╪══════╡ │ -2 ┆ a │ │ -1 ┆ a │ │ 0 ┆ b │ │ 1 ┆ b │ │ 2 ┆ c │ └─────┴──────┘ Divide a column into two categories using uniform quantile probabilities. \>>> df.with\_columns( ... pl.col("foo") ... .qcut(2, labels\=\["low", "high"\], left\_closed\=True) ... .alias("qcut") ... ) shape: (5, 2) ┌─────┬──────┐ │ foo ┆ qcut │ │ --- ┆ --- │ │ i64 ┆ cat │ ╞═════╪══════╡ │ -2 ┆ low │ │ -1 ┆ low │ │ 0 ┆ high │ │ 1 ┆ high │ │ 2 ┆ high │ └─────┴──────┘ Add both the category and the breakpoint. \>>> df.with\_columns( ... pl.col("foo").qcut(\[0.25, 0.75\], include\_breaks\=True).alias("qcut") ... ).unnest("qcut") shape: (5, 3) ┌─────┬────────────┬────────────┐ │ foo ┆ breakpoint ┆ category │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ cat │ ╞═════╪════════════╪════════════╡ │ -2 ┆ -1.0 ┆ (-inf, -1\] │ │ -1 ┆ -1.0 ┆ (-inf, -1\] │ │ 0 ┆ 1.0 ┆ (-1, 1\] │ │ 1 ┆ 1.0 ┆ (-1, 1\] │ │ 2 ┆ inf ┆ (1, inf\] │ └─────┴────────────┴────────────┘ quantile(_quantile: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)") | Expr_, _interpolation: QuantileMethod \= 'nearest'_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4133-L4198) Get quantile value. Parameters: **quantile** Quantile between 0.0 and 1.0. **interpolation**{‘nearest’, ‘higher’, ‘lower’, ‘midpoint’, ‘linear’, ‘equiprobable’} Interpolation method. Examples \>>> df \= pl.DataFrame({"a": \[0, 1, 2, 3, 4, 5\]}) \>>> df.select(pl.col("a").quantile(0.3)) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 2.0 │ └─────┘ \>>> df.select(pl.col("a").quantile(0.3, interpolation\="higher")) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 2.0 │ └─────┘ \>>> df.select(pl.col("a").quantile(0.3, interpolation\="lower")) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 1.0 │ └─────┘ \>>> df.select(pl.col("a").quantile(0.3, interpolation\="midpoint")) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 1.5 │ └─────┘ \>>> df.select(pl.col("a").quantile(0.3, interpolation\="linear")) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 1.5 │ └─────┘ radians() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9923-L9953) Convert from degrees to radians. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[\-720, \-540, \-360, \-180, 0, 180, 360, 540, 720\]}) \>>> df.select(pl.col("a").radians()) shape: (9, 1) ┌────────────┐ │ a │ │ --- │ │ f64 │ ╞════════════╡ │ -12.566371 │ │ -9.424778 │ │ -6.283185 │ │ -3.141593 │ │ 0.0 │ │ 3.141593 │ │ 6.283185 │ │ 9.424778 │ │ 12.566371 │ └────────────┘ rank( _method: RankMethod \= 'average'_, _\*_, _descending: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _seed: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9108-L9223) Assign ranks to data, dealing with ties appropriately. Parameters: **method**{‘average’, ‘min’, ‘max’, ‘dense’, ‘ordinal’, ‘random’} The method used to assign ranks to tied elements. The following methods are available (default is ‘average’): * ‘average’ : The average of the ranks that would have been assigned to all the tied values is assigned to each value. * ‘min’ : The minimum of the ranks that would have been assigned to all the tied values is assigned to each value. (This is also referred to as “competition” ranking.) * ‘max’ : The maximum of the ranks that would have been assigned to all the tied values is assigned to each value. * ‘dense’ : Like ‘min’, but the rank of the next highest element is assigned the rank immediately after those assigned to the tied elements. * ‘ordinal’ : All values are given a distinct rank, corresponding to the order that the values occur in the Series. * ‘random’ : Like ‘ordinal’, but the rank for ties is not dependent on the order that the values occur in the Series. **descending** Rank in descending order. **seed** If `method="random"`, use this as seed. Notes If you’re coming from SQL, you may be expecting null values to be ranked last. Polars, however, only ranks non-null values and preserves the null ones. Examples The ‘average’ method: \>>> df \= pl.DataFrame({"a": \[3, 6, 1, 1, 6\]}) \>>> df.select(pl.col("a").rank()) shape: (5, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 3.0 │ │ 4.5 │ │ 1.5 │ │ 1.5 │ │ 4.5 │ └─────┘ The ‘ordinal’ method: \>>> df \= pl.DataFrame({"a": \[3, 6, 1, 1, 6\]}) \>>> df.select(pl.col("a").rank("ordinal")) shape: (5, 1) ┌─────┐ │ a │ │ --- │ │ u32 │ ╞═════╡ │ 3 │ │ 4 │ │ 1 │ │ 2 │ │ 5 │ └─────┘ Use ‘rank’ with ‘over’ to rank within groups: \>>> df \= pl.DataFrame({"a": \[1, 1, 2, 2, 2\], "b": \[6, 7, 5, 14, 11\]}) \>>> df.with\_columns(pl.col("b").rank().over("a").alias("rank")) shape: (5, 3) ┌─────┬─────┬──────┐ │ a ┆ b ┆ rank │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ f64 │ ╞═════╪═════╪══════╡ │ 1 ┆ 6 ┆ 1.0 │ │ 1 ┆ 7 ┆ 2.0 │ │ 2 ┆ 5 ┆ 1.0 │ │ 2 ┆ 14 ┆ 3.0 │ │ 2 ┆ 11 ┆ 2.0 │ └─────┴─────┴──────┘ Divide by the length or number of non-null values to compute the percentile rank. \>>> df \= pl.DataFrame({"a": \[6, 7, None, 14, 11\]}) \>>> df.with\_columns( ... pct\=pl.col("a").rank() / pl.len(), ... pct\_valid\=pl.col("a").rank() / pl.count("a"), ... ) shape: (5, 3) ┌──────┬──────┬───────────┐ │ a ┆ pct ┆ pct\_valid │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ f64 │ ╞══════╪══════╪═══════════╡ │ 6 ┆ 0.2 ┆ 0.25 │ │ 7 ┆ 0.4 ┆ 0.5 │ │ null ┆ null ┆ null │ │ 14 ┆ 0.8 ┆ 1.0 │ │ 11 ┆ 0.6 ┆ 0.75 │ └──────┴──────┴───────────┘ rechunk() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1333-L1358) Create a single chunk of memory for this Series. Examples \>>> df \= pl.DataFrame({"a": \[1, 1, 2\]}) Create a Series with 3 nulls, append column `a`, then rechunk. \>>> df.select(pl.repeat(None, 3).append(pl.col("a")).rechunk()) shape: (6, 1) ┌────────┐ │ repeat │ │ --- │ │ i64 │ ╞════════╡ │ null │ │ null │ │ null │ │ 1 │ │ 1 │ │ 2 │ └────────┘ register\_plugin( _\*_, _lib: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _symbol: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _args: [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[IntoExpr\] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _kwargs: [dict](https://docs.python.org/3/library/stdtypes.html#dict "(in Python v3.14)") \[Any, Any\] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _is\_elementwise: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _input\_wildcard\_expansion: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _returns\_scalar: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _cast\_to\_supertypes: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _pass\_name\_to\_apply: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _changes\_length: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11503-L11586) Register a plugin function. Deprecated since version 0.20.16: Use [`polars.plugins.register_plugin_function()`](https://docs.pola.rs/api/python/stable/reference/api/polars.plugins.register_plugin_function.html#polars.plugins.register_plugin_function "polars.plugins.register_plugin_function") instead. See the [user guide](https://docs.pola.rs/user-guide/plugins/) for more information about plugins. Parameters: **lib** Library to load. **symbol** Function to load. **args** Arguments (other than self) passed to this function. These arguments have to be of type Expression. **kwargs** Non-expression arguments. They must be JSON serializable. **is\_elementwise** If the function only operates on scalars this will trigger fast paths. **input\_wildcard\_expansion** Expand expressions as input of this function. **returns\_scalar** Automatically explode on unit length if it ran as final aggregation. this is the case for aggregations like `sum`, `min`, `covariance` etc. **cast\_to\_supertypes** Cast the input datatypes to their supertype. **pass\_name\_to\_apply** if set, then the `Series` passed to the function in the group\_by operation will ensure the name is set. This is an extra heap allocation per group. **changes\_length** For example a `unique` or a `slice` Warning This method is deprecated. Use the new `polars.plugins.register_plugin_function` function instead. This is highly unsafe as this will call the C function loaded by `lib::symbol`. The parameters you set dictate how Polars will handle the function. Make sure they are correct! reinterpret(_\*_, _signed: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6389-L6422) Reinterpret the underlying bits as a signed/unsigned integer. This operation is only allowed for 64bit integers. For lower bits integers, you can safely use that cast operation. Parameters: **signed** If True, reinterpret as `pl.Int64`. Otherwise, reinterpret as `pl.UInt64`. Examples \>>> s \= pl.Series("a", \[1, 1, 2\], dtype\=pl.UInt64) \>>> df \= pl.DataFrame(\[s\]) \>>> df.select( ... \[\ ... pl.col("a").reinterpret(signed\=True).alias("reinterpreted"),\ ... pl.col("a").alias("original"),\ ... \] ... ) shape: (3, 2) ┌───────────────┬──────────┐ │ reinterpreted ┆ original │ │ --- ┆ --- │ │ i64 ┆ u64 │ ╞═══════════════╪══════════╡ │ 1 ┆ 1 │ │ 1 ┆ 1 │ │ 2 ┆ 2 │ └───────────────┴──────────┘ repeat\_by( _by: Series | Expr | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") | [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6118-L6158) Repeat the elements in this Series as specified in the given expression. The repeated elements are expanded into a `List`. Parameters: **by** Numeric column that determines how often the values will be repeated. The column will be coerced to UInt32. Give this dtype to make the coercion a no-op. Returns: Expr Expression of data type `List`, where the inner data type is equal to the original data type. Examples \>>> df \= pl.DataFrame( ... { ... "a": \["x", "y", "z"\], ... "n": \[1, 2, 3\], ... } ... ) \>>> df.select(pl.col("a").repeat\_by("n")) shape: (3, 1) ┌─────────────────┐ │ a │ │ --- │ │ list\[str\] │ ╞═════════════════╡ │ \["x"\] │ │ \["y", "y"\] │ │ \["z", "z", "z"\] │ └─────────────────┘ replace(_old: IntoExpr | Sequence\[Any\] | Mapping\[Any, Any\], new: IntoExpr | Sequence\[Any\] | NoDefault \= , \*, default: IntoExpr | NoDefault \= , return\_dtype: PolarsDataType | None \= None_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11004-L11182) Replace the given values by different values of the same data type. Parameters: **old** Value or sequence of values to replace. Accepts expression input. Sequences are parsed as Series, other non-expression inputs are parsed as literals. Also accepts a mapping of values to their replacement as syntactic sugar for `replace(old=Series(mapping.keys()), new=Series(mapping.values()))`. **new** Value or sequence of values to replace by. Accepts expression input. Sequences are parsed as Series, other non-expression inputs are parsed as literals. Length must match the length of `old` or have length 1. **default** Set values that were not replaced to this value. Defaults to keeping the original value. Accepts expression input. Non-expression inputs are parsed as literals. Deprecated since version 1.0.0: Use [`replace_strict()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.replace_strict.html#polars.Expr.replace_strict "polars.Expr.replace_strict") instead to set a default while replacing values. **return\_dtype** The data type of the resulting expression. If set to `None` (default), the data type of the original column is preserved. Deprecated since version 1.0.0: Use [`replace_strict()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.replace_strict.html#polars.Expr.replace_strict "polars.Expr.replace_strict") instead to set a return data type while replacing values, or explicitly call [`cast()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.cast.html#polars.Expr.cast "polars.Expr.cast") on the output. See also [`replace_strict`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.replace_strict.html#polars.Expr.replace_strict "polars.Expr.replace_strict") [`str.replace`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.replace.html#polars.Expr.str.replace "polars.Expr.str.replace") Notes The global string cache must be enabled when replacing categorical values. Examples Replace a single value by another value. Values that were not replaced remain unchanged. \>>> df \= pl.DataFrame({"a": \[1, 2, 2, 3\]}) \>>> df.with\_columns(replaced\=pl.col("a").replace(2, 100)) shape: (4, 2) ┌─────┬──────────┐ │ a ┆ replaced │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪══════════╡ │ 1 ┆ 1 │ │ 2 ┆ 100 │ │ 2 ┆ 100 │ │ 3 ┆ 3 │ └─────┴──────────┘ Replace multiple values by passing sequences to the `old` and `new` parameters. \>>> df.with\_columns(replaced\=pl.col("a").replace(\[2, 3\], \[100, 200\])) shape: (4, 2) ┌─────┬──────────┐ │ a ┆ replaced │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪══════════╡ │ 1 ┆ 1 │ │ 2 ┆ 100 │ │ 2 ┆ 100 │ │ 3 ┆ 200 │ └─────┴──────────┘ Passing a mapping with replacements is also supported as syntactic sugar. \>>> mapping \= {2: 100, 3: 200} \>>> df.with\_columns(replaced\=pl.col("a").replace(mapping)) shape: (4, 2) ┌─────┬──────────┐ │ a ┆ replaced │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪══════════╡ │ 1 ┆ 1 │ │ 2 ┆ 100 │ │ 2 ┆ 100 │ │ 3 ┆ 200 │ └─────┴──────────┘ The original data type is preserved when replacing by values of a different data type. Use [`replace_strict()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.replace_strict.html#polars.Expr.replace_strict "polars.Expr.replace_strict") to replace and change the return data type. \>>> df \= pl.DataFrame({"a": \["x", "y", "z"\]}) \>>> mapping \= {"x": 1, "y": 2, "z": 3} \>>> df.with\_columns(replaced\=pl.col("a").replace(mapping)) shape: (3, 2) ┌─────┬──────────┐ │ a ┆ replaced │ │ --- ┆ --- │ │ str ┆ str │ ╞═════╪══════════╡ │ x ┆ 1 │ │ y ┆ 2 │ │ z ┆ 3 │ └─────┴──────────┘ Expression input is supported. \>>> df \= pl.DataFrame({"a": \[1, 2, 2, 3\], "b": \[1.5, 2.5, 5.0, 1.0\]}) \>>> df.with\_columns( ... replaced\=pl.col("a").replace( ... old\=pl.col("a").max(), ... new\=pl.col("b").sum(), ... ) ... ) shape: (4, 3) ┌─────┬─────┬──────────┐ │ a ┆ b ┆ replaced │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ i64 │ ╞═════╪═════╪══════════╡ │ 1 ┆ 1.5 ┆ 1 │ │ 2 ┆ 2.5 ┆ 2 │ │ 2 ┆ 5.0 ┆ 2 │ │ 3 ┆ 1.0 ┆ 10 │ └─────┴─────┴──────────┘ replace\_strict(_old: IntoExpr | Sequence\[Any\] | Mapping\[Any, Any\], new: IntoExpr | Sequence\[Any\] | NoDefault \= , \*, default: IntoExpr | NoDefault \= , return\_dtype: PolarsDataType | DataTypeExpr | None \= None_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L11184-L11384) Replace all values by different values. Parameters: **old** Value or sequence of values to replace. Accepts expression input. Sequences are parsed as Series, other non-expression inputs are parsed as literals. Also accepts a mapping of values to their replacement as syntactic sugar for `replace_strict(old=Series(mapping.keys()), new=Series(mapping.values()))`. **new** Value or sequence of values to replace by. Accepts expression input. Sequences are parsed as Series, other non-expression inputs are parsed as literals. Length must match the length of `old` or have length 1. **default** Set values that were not replaced to this value. If no default is specified, (default), an error is raised if any values were not replaced. Accepts expression input. Non-expression inputs are parsed as literals. **return\_dtype** The data type of the resulting expression. If set to `None` (default), the data type is determined automatically based on the other inputs. Raises: InvalidOperationError If any non-null values in the original column were not replaced, and no `default` was specified. See also [`replace`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.replace.html#polars.Expr.replace "polars.Expr.replace") [`str.replace`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.str.replace.html#polars.Expr.str.replace "polars.Expr.str.replace") Notes The global string cache must be enabled when replacing categorical values. Examples Replace values by passing sequences to the `old` and `new` parameters. \>>> df \= pl.DataFrame({"a": \[1, 2, 2, 3\]}) \>>> df.with\_columns( ... replaced\=pl.col("a").replace\_strict(\[1, 2, 3\], \[100, 200, 300\]) ... ) shape: (4, 2) ┌─────┬──────────┐ │ a ┆ replaced │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪══════════╡ │ 1 ┆ 100 │ │ 2 ┆ 200 │ │ 2 ┆ 200 │ │ 3 ┆ 300 │ └─────┴──────────┘ Passing a mapping with replacements is also supported as syntactic sugar. \>>> mapping \= {1: 100, 2: 200, 3: 300} \>>> df.with\_columns(replaced\=pl.col("a").replace\_strict(mapping)) shape: (4, 2) ┌─────┬──────────┐ │ a ┆ replaced │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪══════════╡ │ 1 ┆ 100 │ │ 2 ┆ 200 │ │ 2 ┆ 200 │ │ 3 ┆ 300 │ └─────┴──────────┘ By default, an error is raised if any non-null values were not replaced. Specify a default to set all values that were not matched. \>>> mapping \= {2: 200, 3: 300} \>>> df.with\_columns( ... replaced\=pl.col("a").replace\_strict(mapping) ... ) Traceback (most recent call last): ... polars.exceptions.InvalidOperationError: incomplete mapping specified for \`replace\_strict\` \>>> df.with\_columns(replaced\=pl.col("a").replace\_strict(mapping, default\=-1)) shape: (4, 2) ┌─────┬──────────┐ │ a ┆ replaced │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪══════════╡ │ 1 ┆ -1 │ │ 2 ┆ 200 │ │ 2 ┆ 200 │ │ 3 ┆ 300 │ └─────┴──────────┘ Replacing by values of a different data type sets the return type based on a combination of the `new` data type and the `default` data type. \>>> df \= pl.DataFrame({"a": \["x", "y", "z"\]}) \>>> mapping \= {"x": 1, "y": 2, "z": 3} \>>> df.with\_columns(replaced\=pl.col("a").replace\_strict(mapping)) shape: (3, 2) ┌─────┬──────────┐ │ a ┆ replaced │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪══════════╡ │ x ┆ 1 │ │ y ┆ 2 │ │ z ┆ 3 │ └─────┴──────────┘ \>>> df.with\_columns(replaced\=pl.col("a").replace\_strict(mapping, default\="x")) shape: (3, 2) ┌─────┬──────────┐ │ a ┆ replaced │ │ --- ┆ --- │ │ str ┆ str │ ╞═════╪══════════╡ │ x ┆ 1 │ │ y ┆ 2 │ │ z ┆ 3 │ └─────┴──────────┘ Set the `return_dtype` parameter to control the resulting data type directly. \>>> df.with\_columns( ... replaced\=pl.col("a").replace\_strict(mapping, return\_dtype\=pl.UInt8) ... ) shape: (3, 2) ┌─────┬──────────┐ │ a ┆ replaced │ │ --- ┆ --- │ │ str ┆ u8 │ ╞═════╪══════════╡ │ x ┆ 1 │ │ y ┆ 2 │ │ z ┆ 3 │ └─────┴──────────┘ Expression input is supported for all parameters. \>>> df \= pl.DataFrame({"a": \[1, 2, 2, 3\], "b": \[1.5, 2.5, 5.0, 1.0\]}) \>>> df.with\_columns( ... replaced\=pl.col("a").replace\_strict( ... old\=pl.col("a").max(), ... new\=pl.col("b").sum(), ... default\=pl.col("b"), ... ) ... ) shape: (4, 3) ┌─────┬─────┬──────────┐ │ a ┆ b ┆ replaced │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ f64 │ ╞═════╪═════╪══════════╡ │ 1 ┆ 1.5 ┆ 1.5 │ │ 2 ┆ 2.5 ┆ 2.5 │ │ 2 ┆ 5.0 ┆ 5.0 │ │ 3 ┆ 1.0 ┆ 10.0 │ └─────┴─────┴──────────┘ reshape(_dimensions: [tuple](https://docs.python.org/3/library/stdtypes.html#tuple "(in Python v3.14)") \[[int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)")\ , ...\]_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9955-L10012) Reshape this Expr to a flat column or an Array column. Parameters: **dimensions** Tuple of the dimension sizes. If -1 is used as the value for the first dimension, that dimension is inferred. Because the size of the Column may not be known in advance, it is only possible to use -1 for the first dimension. Returns: Expr If a single dimension is given, results in an expression of the original data type. If a multiple dimensions are given, results in an expression of data type `Array` with shape `dimensions`. See also [`Expr.list.explode`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.list.explode.html#polars.Expr.list.explode "polars.Expr.list.explode") Explode a list column. Examples \>>> df \= pl.DataFrame({"foo": \[1, 2, 3, 4, 5, 6, 7, 8, 9\]}) \>>> square \= df.select(pl.col("foo").reshape((3, 3))) \>>> square shape: (3, 1) ┌───────────────┐ │ foo │ │ --- │ │ array\[i64, 3\] │ ╞═══════════════╡ │ \[1, 2, 3\] │ │ \[4, 5, 6\] │ │ \[7, 8, 9\] │ └───────────────┘ \>>> square.select(pl.col("foo").reshape((9,))) shape: (9, 1) ┌─────┐ │ foo │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ │ 2 │ │ 3 │ │ 4 │ │ 5 │ │ 6 │ │ 7 │ │ 8 │ │ 9 │ └─────┘ reverse() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3030-L3063) Reverse the selection. Examples \>>> df \= pl.DataFrame( ... { ... "A": \[1, 2, 3, 4, 5\], ... "fruits": \["banana", "banana", "apple", "apple", "banana"\], ... "B": \[5, 4, 3, 2, 1\], ... "cars": \["beetle", "audi", "beetle", "beetle", "beetle"\], ... } ... ) \>>> df.select( ... \[\ ... pl.all(),\ ... pl.all().reverse().name.suffix("\_reverse"),\ ... \] ... ) shape: (5, 8) ┌─────┬────────┬─────┬────────┬───────────┬────────────────┬───────────┬──────────────┐ │ A ┆ fruits ┆ B ┆ cars ┆ A\_reverse ┆ fruits\_reverse ┆ B\_reverse ┆ cars\_reverse │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ i64 ┆ str ┆ i64 ┆ str ┆ i64 ┆ str │ ╞═════╪════════╪═════╪════════╪═══════════╪════════════════╪═══════════╪══════════════╡ │ 1 ┆ banana ┆ 5 ┆ beetle ┆ 5 ┆ banana ┆ 1 ┆ beetle │ │ 2 ┆ banana ┆ 4 ┆ audi ┆ 4 ┆ apple ┆ 2 ┆ beetle │ │ 3 ┆ apple ┆ 3 ┆ beetle ┆ 3 ┆ apple ┆ 3 ┆ beetle │ │ 4 ┆ apple ┆ 2 ┆ beetle ┆ 2 ┆ banana ┆ 4 ┆ audi │ │ 5 ┆ banana ┆ 1 ┆ beetle ┆ 1 ┆ banana ┆ 5 ┆ beetle │ └─────┴────────┴─────┴────────┴───────────┴────────────────┴───────────┴──────────────┘ rle() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4398-L4433) Compress the column data using run-length encoding. Run-length encoding (RLE) encodes data by storing each _run_ of identical values as a single value and its length. Returns: Expr Expression of data type `Struct` with fields `len` of data type `UInt32` and `value` of the original data type. See also [`rle_id`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rle_id.html#polars.Expr.rle_id "polars.Expr.rle_id") Examples \>>> df \= pl.DataFrame({"a": \[1, 1, 2, 1, None, 1, 3, 3\]}) \>>> df.select(pl.col("a").rle()).unnest("a") shape: (6, 2) ┌─────┬───────┐ │ len ┆ value │ │ --- ┆ --- │ │ u32 ┆ i64 │ ╞═════╪═══════╡ │ 2 ┆ 1 │ │ 1 ┆ 2 │ │ 1 ┆ 1 │ │ 1 ┆ null │ │ 1 ┆ 1 │ │ 2 ┆ 3 │ └─────┴───────┘ rle\_id() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4435-L4481) Get a distinct integer ID for each run of identical values. The ID starts at 0 and increases by one each time the value of the column changes. Returns: Expr Expression of data type `UInt32`. See also [`rle`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rle.html#polars.Expr.rle "polars.Expr.rle") Notes This functionality is especially useful for defining a new group for every time a column’s value changes, rather than for every distinct value of that column. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, 1, 1, 1\], ... "b": \["x", "x", None, "y", "y"\], ... } ... ) \>>> df.with\_columns( ... rle\_id\_a\=pl.col("a").rle\_id(), ... rle\_id\_ab\=pl.struct("a", "b").rle\_id(), ... ) shape: (5, 4) ┌─────┬──────┬──────────┬───────────┐ │ a ┆ b ┆ rle\_id\_a ┆ rle\_id\_ab │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ u32 ┆ u32 │ ╞═════╪══════╪══════════╪═══════════╡ │ 1 ┆ x ┆ 0 ┆ 0 │ │ 2 ┆ x ┆ 1 ┆ 1 │ │ 1 ┆ null ┆ 2 ┆ 2 │ │ 1 ┆ y ┆ 2 ┆ 3 │ │ 1 ┆ y ┆ 2 ┆ 3 │ └─────┴──────┴──────────┴───────────┘ rolling( _index\_column: IntoExprColumn_, _\*_, _period: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") | timedelta_, _offset: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") | timedelta | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _closed: ClosedInterval \= 'right'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3876-L3982) Create rolling groups based on a temporal or integer column. If you have a time series ``, then by default the windows created will be > * (t\_0 - period, t\_0\] > > * (t\_1 - period, t\_1\] > > * … > > * (t\_n - period, t\_n\] > whereas if you pass a non-default `offset`, then the windows will be > * (t\_0 + offset, t\_0 + offset + period\] > > * (t\_1 + offset, t\_1 + offset + period\] > > * … > > * (t\_n + offset, t\_n + offset + period\] > The `period` and `offset` arguments are created either from a timedelta, or by using the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) Or combine them: “3d12h4m25s” # 3 days, 12 hours, 4 minutes, and 25 seconds By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, due to daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. Parameters: **index\_column** Column used to group based on the time window. Often of type Date/Datetime. This column must be sorted in ascending order. In case of a rolling group by on indices, dtype needs to be one of {UInt32, UInt64, Int32, Int64}. Note that the first three get temporarily cast to Int64, so if performance matters use an Int64 column. **period** Length of the window - must be non-negative. **offset** Offset of the window. Default is `-period`. **closed**{‘right’, ‘left’, ‘both’, ‘none’} Define which sides of the temporal interval are closed (inclusive). Examples \>>> dates \= \[\ ... "2020-01-01 13:45:48",\ ... "2020-01-01 16:42:13",\ ... "2020-01-01 16:45:09",\ ... "2020-01-02 18:12:48",\ ... "2020-01-03 19:45:32",\ ... "2020-01-08 23:16:43",\ ... \] \>>> df \= pl.DataFrame({"dt": dates, "a": \[3, 7, 5, 9, 2, 1\]}).with\_columns( ... pl.col("dt").str.strptime(pl.Datetime).set\_sorted() ... ) \>>> df.with\_columns( ... sum\_a\=pl.sum("a").rolling(index\_column\="dt", period\="2d"), ... min\_a\=pl.min("a").rolling(index\_column\="dt", period\="2d"), ... max\_a\=pl.max("a").rolling(index\_column\="dt", period\="2d"), ... ) shape: (6, 5) ┌─────────────────────┬─────┬───────┬───────┬───────┐ │ dt ┆ a ┆ sum\_a ┆ min\_a ┆ max\_a │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ datetime\[μs\] ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════════════════════╪═════╪═══════╪═══════╪═══════╡ │ 2020-01-01 13:45:48 ┆ 3 ┆ 3 ┆ 3 ┆ 3 │ │ 2020-01-01 16:42:13 ┆ 7 ┆ 10 ┆ 3 ┆ 7 │ │ 2020-01-01 16:45:09 ┆ 5 ┆ 15 ┆ 3 ┆ 7 │ │ 2020-01-02 18:12:48 ┆ 9 ┆ 24 ┆ 3 ┆ 9 │ │ 2020-01-03 19:45:32 ┆ 2 ┆ 11 ┆ 2 ┆ 9 │ │ 2020-01-08 23:16:43 ┆ 1 ┆ 1 ┆ 1 ┆ 1 │ └─────────────────────┴─────┴───────┴───────┴───────┘ rolling\_kurtosis( _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _\*_, _fisher: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_, _bias: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L8942-L9005) Compute a rolling kurtosis. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. The window at a given row will include the row itself, and the `window_size - 1` elements before it. Parameters: **window\_size** Integer size of the rolling window. **fisher**bool, optional If True, Fisher’s definition is used (normal ==> 0.0). If False, Pearson’s definition is used (normal ==> 3.0). **bias**bool, optional If False, the calculations are corrected for statistical bias. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. See also [`Expr.kurtosis`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.kurtosis.html#polars.Expr.kurtosis "polars.Expr.kurtosis") Examples \>>> df \= pl.DataFrame({"a": \[1, 4, 2, 9\]}) \>>> df.select(pl.col("a").rolling\_kurtosis(3)) shape: (4, 1) ┌──────┐ │ a │ │ --- │ │ f64 │ ╞══════╡ │ null │ │ null │ │ -1.5 │ │ -1.5 │ └──────┘ rolling\_map( _function: Callable\[\[Series\], Any\]_, _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _weights: [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9007-L9078) Compute a custom rolling window function. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **function** Custom aggregation function. **window\_size** The length of the window in number of elements. **weights** An optional slice with the same length as the window that will be multiplied elementwise with the values in the window. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. Warning Computing custom functions is extremely slow. Use specialized rolling functions such as [`Expr.rolling_sum()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.rolling_sum.html#polars.Expr.rolling_sum "polars.Expr.rolling_sum") if at all possible. Examples \>>> from numpy import nansum \>>> df \= pl.DataFrame({"a": \[11.0, 2.0, 9.0, float("nan"), 8.0\]}) \>>> df.select(pl.col("a").rolling\_map(nansum, window\_size\=3)) shape: (5, 1) ┌──────┐ │ a │ │ --- │ │ f64 │ ╞══════╡ │ null │ │ null │ │ 22.0 │ │ 11.0 │ │ 17.0 │ └──────┘ rolling\_max( _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _weights: [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L7976-L8084) Apply a rolling max (moving max) over the values in this array. A window of length `window_size` will traverse the array. The values that fill this window will (optionally) be multiplied with the weights given by the `weights` vector. The resulting values will be aggregated to their max. The window at a given row will include the row itself, and the `window_size - 1` elements before it. Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **window\_size** The length of the window in number of elements. **weights** An optional slice with the same length as the window that will be multiplied elementwise with the values in the window. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples \>>> df \= pl.DataFrame({"A": \[1.0, 2.0, 3.0, 4.0, 5.0, 6.0\]}) \>>> df.with\_columns( ... rolling\_max\=pl.col("A").rolling\_max(window\_size\=2), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_max │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 2.0 │ │ 3.0 ┆ 3.0 │ │ 4.0 ┆ 4.0 │ │ 5.0 ┆ 5.0 │ │ 6.0 ┆ 6.0 │ └─────┴─────────────┘ Specify weights to multiply the values in the window with: \>>> df.with\_columns( ... rolling\_max\=pl.col("A").rolling\_max( ... window\_size\=2, weights\=\[0.25, 0.75\] ... ), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_max │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 1.5 │ │ 3.0 ┆ 2.25 │ │ 4.0 ┆ 3.0 │ │ 5.0 ┆ 3.75 │ │ 6.0 ┆ 4.5 │ └─────┴─────────────┘ Center the values in the window \>>> df.with\_columns( ... rolling\_max\=pl.col("A").rolling\_max(window\_size\=3, center\=True), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_max │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 3.0 │ │ 3.0 ┆ 4.0 │ │ 4.0 ┆ 5.0 │ │ 5.0 ┆ 6.0 │ │ 6.0 ┆ null │ └─────┴─────────────┘ rolling\_max\_by( _by: IntoExpr_, _window\_size: timedelta | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, _closed: ClosedInterval \= 'right'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6701-L6853) Apply a rolling max based on another column. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Given a `by` column ``, then `closed="right"` (the default) means the windows will be: > * (t\_0 - window\_size, t\_0\] > > * (t\_1 - window\_size, t\_1\] > > * … > > * (t\_n - window\_size, t\_n\] > Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **by** Should be `DateTime`, `Date`, `UInt64`, `UInt32`, `Int64`, or `Int32` data type (note that the integral ones require using `'i'` in `window size`). **window\_size** The length of the window. Can be a dynamic temporal size indicated by a timedelta or the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, due to daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. **min\_samples** The number of values in the window that should be non-null before computing a result. **closed**{‘left’, ‘right’, ‘both’, ‘none’} Define which sides of the temporal interval are closed (inclusive), defaults to `'right'`. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples Create a DataFrame with a datetime column and a row number column \>>> from datetime import timedelta, datetime \>>> start \= datetime(2001, 1, 1) \>>> stop \= datetime(2001, 1, 2) \>>> df\_temporal \= pl.DataFrame( ... {"date": pl.datetime\_range(start, stop, "1h", eager\=True)} ... ).with\_row\_index() \>>> df\_temporal shape: (25, 2) ┌───────┬─────────────────────┐ │ index ┆ date │ │ --- ┆ --- │ │ u32 ┆ datetime\[μs\] │ ╞═══════╪═════════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 │ │ 1 ┆ 2001-01-01 01:00:00 │ │ 2 ┆ 2001-01-01 02:00:00 │ │ 3 ┆ 2001-01-01 03:00:00 │ │ 4 ┆ 2001-01-01 04:00:00 │ │ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 │ │ 21 ┆ 2001-01-01 21:00:00 │ │ 22 ┆ 2001-01-01 22:00:00 │ │ 23 ┆ 2001-01-01 23:00:00 │ │ 24 ┆ 2001-01-02 00:00:00 │ └───────┴─────────────────────┘ Compute the rolling max with the temporal windows closed on the right (default) \>>> df\_temporal.with\_columns( ... rolling\_row\_max\=pl.col("index").rolling\_max\_by("date", window\_size\="2h") ... ) shape: (25, 3) ┌───────┬─────────────────────┬─────────────────┐ │ index ┆ date ┆ rolling\_row\_max │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ u32 │ ╞═══════╪═════════════════════╪═════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ 0 │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 1 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 2 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 3 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 4 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 20 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 21 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 22 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 23 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 24 │ └───────┴─────────────────────┴─────────────────┘ Compute the rolling max with the closure of windows on both sides \>>> df\_temporal.with\_columns( ... rolling\_row\_max\=pl.col("index").rolling\_max\_by( ... "date", window\_size\="2h", closed\="both" ... ) ... ) shape: (25, 3) ┌───────┬─────────────────────┬─────────────────┐ │ index ┆ date ┆ rolling\_row\_max │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ u32 │ ╞═══════╪═════════════════════╪═════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ 0 │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 1 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 2 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 3 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 4 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 20 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 21 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 22 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 23 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 24 │ └───────┴─────────────────────┴─────────────────┘ rolling\_mean( _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _weights: [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L8086-L8196) Apply a rolling mean (moving mean) over the values in this array. A window of length `window_size` will traverse the array. The values that fill this window will (optionally) be multiplied with the weights given by the `weights` vector. The resulting values will be aggregated to their mean. Weights are normalized to sum to 1. The window at a given row will include the row itself, and the `window_size - 1` elements before it. Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **window\_size** The length of the window in number of elements. **weights** An optional slice with the same length as the window that will be multiplied elementwise with the values in the window, after being normalized to sum to 1. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples \>>> df \= pl.DataFrame({"A": \[1.0, 2.0, 3.0, 4.0, 5.0, 6.0\]}) \>>> df.with\_columns( ... rolling\_mean\=pl.col("A").rolling\_mean(window\_size\=2), ... ) shape: (6, 2) ┌─────┬──────────────┐ │ A ┆ rolling\_mean │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪══════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 1.5 │ │ 3.0 ┆ 2.5 │ │ 4.0 ┆ 3.5 │ │ 5.0 ┆ 4.5 │ │ 6.0 ┆ 5.5 │ └─────┴──────────────┘ Specify weights to multiply the values in the window with: \>>> df.with\_columns( ... rolling\_mean\=pl.col("A").rolling\_mean( ... window\_size\=2, weights\=\[0.25, 0.75\] ... ), ... ) shape: (6, 2) ┌─────┬──────────────┐ │ A ┆ rolling\_mean │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪══════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 1.75 │ │ 3.0 ┆ 2.75 │ │ 4.0 ┆ 3.75 │ │ 5.0 ┆ 4.75 │ │ 6.0 ┆ 5.75 │ └─────┴──────────────┘ Center the values in the window \>>> df.with\_columns( ... rolling\_mean\=pl.col("A").rolling\_mean(window\_size\=3, center\=True), ... ) shape: (6, 2) ┌─────┬──────────────┐ │ A ┆ rolling\_mean │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪══════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 2.0 │ │ 3.0 ┆ 3.0 │ │ 4.0 ┆ 4.0 │ │ 5.0 ┆ 5.0 │ │ 6.0 ┆ null │ └─────┴──────────────┘ rolling\_mean\_by( _by: IntoExpr_, _window\_size: timedelta | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, _closed: ClosedInterval \= 'right'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6855-L7014) Apply a rolling mean based on another column. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Given a `by` column ``, then `closed="right"` (the default) means the windows will be: > * (t\_0 - window\_size, t\_0\] > > * (t\_1 - window\_size, t\_1\] > > * … > > * (t\_n - window\_size, t\_n\] > Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **by** Should be `DateTime`, `Date`, `UInt64`, `UInt32`, `Int64`, or `Int32` data type (note that the integral ones require using `'i'` in `window size`). **window\_size** The length of the window. Can be a dynamic temporal size indicated by a timedelta or the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, due to daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. **min\_samples** The number of values in the window that should be non-null before computing a result. **closed**{‘left’, ‘right’, ‘both’, ‘none’} Define which sides of the temporal interval are closed (inclusive), defaults to `'right'`. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples Create a DataFrame with a datetime column and a row number column \>>> from datetime import timedelta, datetime \>>> start \= datetime(2001, 1, 1) \>>> stop \= datetime(2001, 1, 2) \>>> df\_temporal \= pl.DataFrame( ... {"date": pl.datetime\_range(start, stop, "1h", eager\=True)} ... ).with\_row\_index() \>>> df\_temporal shape: (25, 2) ┌───────┬─────────────────────┐ │ index ┆ date │ │ --- ┆ --- │ │ u32 ┆ datetime\[μs\] │ ╞═══════╪═════════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 │ │ 1 ┆ 2001-01-01 01:00:00 │ │ 2 ┆ 2001-01-01 02:00:00 │ │ 3 ┆ 2001-01-01 03:00:00 │ │ 4 ┆ 2001-01-01 04:00:00 │ │ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 │ │ 21 ┆ 2001-01-01 21:00:00 │ │ 22 ┆ 2001-01-01 22:00:00 │ │ 23 ┆ 2001-01-01 23:00:00 │ │ 24 ┆ 2001-01-02 00:00:00 │ └───────┴─────────────────────┘ Compute the rolling mean with the temporal windows closed on the right (default) \>>> df\_temporal.with\_columns( ... rolling\_row\_mean\=pl.col("index").rolling\_mean\_by( ... "date", window\_size\="2h" ... ) ... ) shape: (25, 3) ┌───────┬─────────────────────┬──────────────────┐ │ index ┆ date ┆ rolling\_row\_mean │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ f64 │ ╞═══════╪═════════════════════╪══════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ 0.0 │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 0.5 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 1.5 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 2.5 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 3.5 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 19.5 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 20.5 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 21.5 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 22.5 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 23.5 │ └───────┴─────────────────────┴──────────────────┘ Compute the rolling mean with the closure of windows on both sides \>>> df\_temporal.with\_columns( ... rolling\_row\_mean\=pl.col("index").rolling\_mean\_by( ... "date", window\_size\="2h", closed\="both" ... ) ... ) shape: (25, 3) ┌───────┬─────────────────────┬──────────────────┐ │ index ┆ date ┆ rolling\_row\_mean │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ f64 │ ╞═══════╪═════════════════════╪══════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ 0.0 │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 0.5 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 1.0 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 2.0 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 3.0 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 19.0 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 20.0 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 21.0 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 22.0 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 23.0 │ └───────┴─────────────────────┴──────────────────┘ rolling\_median( _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _weights: [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L8540-L8648) Compute a rolling median. A window of length `window_size` will traverse the array. The values that fill this window will (optionally) be multiplied with the weights given by the `weights` vector. The resulting values will be aggregated to their median. The window at a given row will include the row itself, and the `window_size - 1` elements before it. Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **window\_size** The length of the window in number of elements. **weights** An optional slice with the same length as the window that will be multiplied elementwise with the values in the window. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples \>>> df \= pl.DataFrame({"A": \[1.0, 2.0, 3.0, 4.0, 5.0, 6.0\]}) \>>> df.with\_columns( ... rolling\_median\=pl.col("A").rolling\_median(window\_size\=2), ... ) shape: (6, 2) ┌─────┬────────────────┐ │ A ┆ rolling\_median │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪════════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 1.5 │ │ 3.0 ┆ 2.5 │ │ 4.0 ┆ 3.5 │ │ 5.0 ┆ 4.5 │ │ 6.0 ┆ 5.5 │ └─────┴────────────────┘ Specify weights for the values in each window: \>>> df.with\_columns( ... rolling\_median\=pl.col("A").rolling\_median( ... window\_size\=2, weights\=\[0.25, 0.75\] ... ), ... ) shape: (6, 2) ┌─────┬────────────────┐ │ A ┆ rolling\_median │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪════════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 1.5 │ │ 3.0 ┆ 2.5 │ │ 4.0 ┆ 3.5 │ │ 5.0 ┆ 4.5 │ │ 6.0 ┆ 5.5 │ └─────┴────────────────┘ Center the values in the window \>>> df.with\_columns( ... rolling\_median\=pl.col("A").rolling\_median(window\_size\=3, center\=True), ... ) shape: (6, 2) ┌─────┬────────────────┐ │ A ┆ rolling\_median │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪════════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 2.0 │ │ 3.0 ┆ 3.0 │ │ 4.0 ┆ 4.0 │ │ 5.0 ┆ 5.0 │ │ 6.0 ┆ null │ └─────┴────────────────┘ rolling\_median\_by( _by: IntoExpr_, _window\_size: timedelta | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, _closed: ClosedInterval \= 'right'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L7496-L7624) Compute a rolling median based on another column. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Given a `by` column ``, then `closed="right"` (the default) means the windows will be: > * (t\_0 - window\_size, t\_0\] > > * (t\_1 - window\_size, t\_1\] > > * … > > * (t\_n - window\_size, t\_n\] > Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **by** Should be `DateTime`, `Date`, `UInt64`, `UInt32`, `Int64`, or `Int32` data type (note that the integral ones require using `'i'` in `window size`). **window\_size** The length of the window. Can be a dynamic temporal size indicated by a timedelta or the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, due to daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. **min\_samples** The number of values in the window that should be non-null before computing a result. **closed**{‘left’, ‘right’, ‘both’, ‘none’} Define which sides of the temporal interval are closed (inclusive), defaults to `'right'`. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples Create a DataFrame with a datetime column and a row number column \>>> from datetime import timedelta, datetime \>>> start \= datetime(2001, 1, 1) \>>> stop \= datetime(2001, 1, 2) \>>> df\_temporal \= pl.DataFrame( ... {"date": pl.datetime\_range(start, stop, "1h", eager\=True)} ... ).with\_row\_index() \>>> df\_temporal shape: (25, 2) ┌───────┬─────────────────────┐ │ index ┆ date │ │ --- ┆ --- │ │ u32 ┆ datetime\[μs\] │ ╞═══════╪═════════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 │ │ 1 ┆ 2001-01-01 01:00:00 │ │ 2 ┆ 2001-01-01 02:00:00 │ │ 3 ┆ 2001-01-01 03:00:00 │ │ 4 ┆ 2001-01-01 04:00:00 │ │ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 │ │ 21 ┆ 2001-01-01 21:00:00 │ │ 22 ┆ 2001-01-01 22:00:00 │ │ 23 ┆ 2001-01-01 23:00:00 │ │ 24 ┆ 2001-01-02 00:00:00 │ └───────┴─────────────────────┘ Compute the rolling median with the temporal windows closed on the right: \>>> df\_temporal.with\_columns( ... rolling\_row\_median\=pl.col("index").rolling\_median\_by( ... "date", window\_size\="2h" ... ) ... ) shape: (25, 3) ┌───────┬─────────────────────┬────────────────────┐ │ index ┆ date ┆ rolling\_row\_median │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ f64 │ ╞═══════╪═════════════════════╪════════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ 0.0 │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 0.5 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 1.5 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 2.5 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 3.5 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 19.5 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 20.5 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 21.5 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 22.5 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 23.5 │ └───────┴─────────────────────┴────────────────────┘ rolling\_min( _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _weights: [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L7866-L7974) Apply a rolling min (moving min) over the values in this array. A window of length `window_size` will traverse the array. The values that fill this window will (optionally) be multiplied with the weights given by the `weights` vector. The resulting values will be aggregated to their min. The window at a given row will include the row itself, and the `window_size - 1` elements before it. Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **window\_size** The length of the window in number of elements. **weights** An optional slice with the same length as the window that will be multiplied elementwise with the values in the window. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples \>>> df \= pl.DataFrame({"A": \[1.0, 2.0, 3.0, 4.0, 5.0, 6.0\]}) \>>> df.with\_columns( ... rolling\_min\=pl.col("A").rolling\_min(window\_size\=2), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_min │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 1.0 │ │ 3.0 ┆ 2.0 │ │ 4.0 ┆ 3.0 │ │ 5.0 ┆ 4.0 │ │ 6.0 ┆ 5.0 │ └─────┴─────────────┘ Specify weights to multiply the values in the window with: \>>> df.with\_columns( ... rolling\_min\=pl.col("A").rolling\_min( ... window\_size\=2, weights\=\[0.25, 0.75\] ... ), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_min │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 0.25 │ │ 3.0 ┆ 0.5 │ │ 4.0 ┆ 0.75 │ │ 5.0 ┆ 1.0 │ │ 6.0 ┆ 1.25 │ └─────┴─────────────┘ Center the values in the window \>>> df.with\_columns( ... rolling\_min\=pl.col("A").rolling\_min(window\_size\=3, center\=True), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_min │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 1.0 │ │ 3.0 ┆ 2.0 │ │ 4.0 ┆ 3.0 │ │ 5.0 ┆ 4.0 │ │ 6.0 ┆ null │ └─────┴─────────────┘ rolling\_min\_by( _by: IntoExpr_, _window\_size: timedelta | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, _closed: ClosedInterval \= 'right'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6573-L6699) Apply a rolling min based on another column. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Given a `by` column ``, then `closed="right"` (the default) means the windows will be: > * (t\_0 - window\_size, t\_0\] > > * (t\_1 - window\_size, t\_1\] > > * … > > * (t\_n - window\_size, t\_n\] > Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **by** Should be `DateTime`, `Date`, `UInt64`, `UInt32`, `Int64`, or `Int32` data type (note that the integral ones require using `'i'` in `window size`). **window\_size** The length of the window. Can be a dynamic temporal size indicated by a timedelta or the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, due to daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. **min\_samples** The number of values in the window that should be non-null before computing a result. **closed**{‘left’, ‘right’, ‘both’, ‘none’} Define which sides of the temporal interval are closed (inclusive), defaults to `'right'`. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples Create a DataFrame with a datetime column and a row number column \>>> from datetime import timedelta, datetime \>>> start \= datetime(2001, 1, 1) \>>> stop \= datetime(2001, 1, 2) \>>> df\_temporal \= pl.DataFrame( ... {"date": pl.datetime\_range(start, stop, "1h", eager\=True)} ... ).with\_row\_index() \>>> df\_temporal shape: (25, 2) ┌───────┬─────────────────────┐ │ index ┆ date │ │ --- ┆ --- │ │ u32 ┆ datetime\[μs\] │ ╞═══════╪═════════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 │ │ 1 ┆ 2001-01-01 01:00:00 │ │ 2 ┆ 2001-01-01 02:00:00 │ │ 3 ┆ 2001-01-01 03:00:00 │ │ 4 ┆ 2001-01-01 04:00:00 │ │ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 │ │ 21 ┆ 2001-01-01 21:00:00 │ │ 22 ┆ 2001-01-01 22:00:00 │ │ 23 ┆ 2001-01-01 23:00:00 │ │ 24 ┆ 2001-01-02 00:00:00 │ └───────┴─────────────────────┘ Compute the rolling min with the temporal windows closed on the right (default) \>>> df\_temporal.with\_columns( ... rolling\_row\_min\=pl.col("index").rolling\_min\_by("date", window\_size\="2h") ... ) shape: (25, 3) ┌───────┬─────────────────────┬─────────────────┐ │ index ┆ date ┆ rolling\_row\_min │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ u32 │ ╞═══════╪═════════════════════╪═════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ 0 │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 0 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 1 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 2 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 3 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 19 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 20 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 21 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 22 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 23 │ └───────┴─────────────────────┴─────────────────┘ rolling\_quantile( _quantile: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)") _, _interpolation: QuantileMethod \= 'nearest'_, _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 2_, _weights: [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L8650-L8794) Compute a rolling quantile. A window of length `window_size` will traverse the array. The values that fill this window will (optionally) be multiplied with the weights given by the `weights` vector. The resulting values will be aggregated to their quantile. The window at a given row will include the row itself, and the `window_size - 1` elements before it. Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **quantile** Quantile between 0.0 and 1.0. **interpolation**{‘nearest’, ‘higher’, ‘lower’, ‘midpoint’, ‘linear’, ‘equiprobable’} Interpolation method. **window\_size** The length of the window in number of elements. **weights** An optional slice with the same length as the window that will be multiplied elementwise with the values in the window. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples \>>> df \= pl.DataFrame({"A": \[1.0, 2.0, 3.0, 4.0, 5.0, 6.0\]}) \>>> df.with\_columns( ... rolling\_quantile\=pl.col("A").rolling\_quantile( ... quantile\=0.25, window\_size\=4 ... ), ... ) shape: (6, 2) ┌─────┬──────────────────┐ │ A ┆ rolling\_quantile │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪══════════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ null │ │ 3.0 ┆ null │ │ 4.0 ┆ 2.0 │ │ 5.0 ┆ 3.0 │ │ 6.0 ┆ 4.0 │ └─────┴──────────────────┘ Specify weights for the values in each window: \>>> df.with\_columns( ... rolling\_quantile\=pl.col("A").rolling\_quantile( ... quantile\=0.25, window\_size\=4, weights\=\[0.2, 0.4, 0.4, 0.2\] ... ), ... ) shape: (6, 2) ┌─────┬──────────────────┐ │ A ┆ rolling\_quantile │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪══════════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ null │ │ 3.0 ┆ null │ │ 4.0 ┆ 2.0 │ │ 5.0 ┆ 3.0 │ │ 6.0 ┆ 4.0 │ └─────┴──────────────────┘ Specify weights and interpolation method \>>> df.with\_columns( ... rolling\_quantile\=pl.col("A").rolling\_quantile( ... quantile\=0.25, ... window\_size\=4, ... weights\=\[0.2, 0.4, 0.4, 0.2\], ... interpolation\="linear", ... ), ... ) shape: (6, 2) ┌─────┬──────────────────┐ │ A ┆ rolling\_quantile │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪══════════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ null │ │ 3.0 ┆ null │ │ 4.0 ┆ 1.625 │ │ 5.0 ┆ 2.625 │ │ 6.0 ┆ 3.625 │ └─────┴──────────────────┘ Center the values in the window \>>> df.with\_columns( ... rolling\_quantile\=pl.col("A").rolling\_quantile( ... quantile\=0.2, window\_size\=5, center\=True ... ), ... ) shape: (6, 2) ┌─────┬──────────────────┐ │ A ┆ rolling\_quantile │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪══════════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ null │ │ 3.0 ┆ 2.0 │ │ 4.0 ┆ 3.0 │ │ 5.0 ┆ null │ │ 6.0 ┆ null │ └─────┴──────────────────┘ rolling\_quantile\_by( _by: IntoExpr_, _window\_size: timedelta | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _\*_, _quantile: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)") _, _interpolation: QuantileMethod \= 'nearest'_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, _closed: ClosedInterval \= 'right'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L7626-L7767) Compute a rolling quantile based on another column. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Given a `by` column ``, then `closed="right"` (the default) means the windows will be: > * (t\_0 - window\_size, t\_0\] > > * (t\_1 - window\_size, t\_1\] > > * … > > * (t\_n - window\_size, t\_n\] > Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **by** Should be `DateTime`, `Date`, `UInt64`, `UInt32`, `Int64`, or `Int32` data type (note that the integral ones require using `'i'` in `window size`). **quantile** Quantile between 0.0 and 1.0. **interpolation**{‘nearest’, ‘higher’, ‘lower’, ‘midpoint’, ‘linear’, ‘equiprobable’} Interpolation method. **window\_size** The length of the window. Can be a dynamic temporal size indicated by a timedelta or the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, due to daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. **min\_samples** The number of values in the window that should be non-null before computing a result. **closed**{‘left’, ‘right’, ‘both’, ‘none’} Define which sides of the temporal interval are closed (inclusive), defaults to `'right'`. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples Create a DataFrame with a datetime column and a row number column \>>> from datetime import timedelta, datetime \>>> start \= datetime(2001, 1, 1) \>>> stop \= datetime(2001, 1, 2) \>>> df\_temporal \= pl.DataFrame( ... {"date": pl.datetime\_range(start, stop, "1h", eager\=True)} ... ).with\_row\_index() \>>> df\_temporal shape: (25, 2) ┌───────┬─────────────────────┐ │ index ┆ date │ │ --- ┆ --- │ │ u32 ┆ datetime\[μs\] │ ╞═══════╪═════════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 │ │ 1 ┆ 2001-01-01 01:00:00 │ │ 2 ┆ 2001-01-01 02:00:00 │ │ 3 ┆ 2001-01-01 03:00:00 │ │ 4 ┆ 2001-01-01 04:00:00 │ │ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 │ │ 21 ┆ 2001-01-01 21:00:00 │ │ 22 ┆ 2001-01-01 22:00:00 │ │ 23 ┆ 2001-01-01 23:00:00 │ │ 24 ┆ 2001-01-02 00:00:00 │ └───────┴─────────────────────┘ Compute the rolling quantile with the temporal windows closed on the right: \>>> df\_temporal.with\_columns( ... rolling\_row\_quantile\=pl.col("index").rolling\_quantile\_by( ... "date", window\_size\="2h", quantile\=0.3 ... ) ... ) shape: (25, 3) ┌───────┬─────────────────────┬──────────────────────┐ │ index ┆ date ┆ rolling\_row\_quantile │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ f64 │ ╞═══════╪═════════════════════╪══════════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ 0.0 │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 0.0 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 1.0 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 2.0 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 3.0 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 19.0 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 20.0 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 21.0 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 22.0 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 23.0 │ └───────┴─────────────────────┴──────────────────────┘ rolling\_rank( _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _method: RankMethod \= 'average'_, _\*_, _seed: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L8796-L8877) Compute a rolling rank. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. A window of length `window_size` will traverse the array. The values that fill this window will be ranked according to the `method` parameter. The resulting values will be the rank of the value that is at the end of the sliding window. Parameters: **window\_size** Integer size of the rolling window. **method**{‘average’, ‘min’, ‘max’, ‘dense’, ‘random’} The method used to assign ranks to tied elements. The following methods are available (default is ‘average’): * ‘average’ : The average of the ranks that would have been assigned to all the tied values is assigned to each value. * ‘min’ : The minimum of the ranks that would have been assigned to all the tied values is assigned to each value. (This is also referred to as “competition” ranking.) * ‘max’ : The maximum of the ranks that would have been assigned to all the tied values is assigned to each value. * ‘dense’ : Like ‘min’, but the rank of the next highest element is assigned the rank immediately after those assigned to the tied elements. * ‘random’ : Choose a random rank for each value in a tie. **seed** Random seed used when `method='random'`. If set to None (default), a random seed is generated for each rolling rank operation. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. Returns: Expr An Expr of data [`Float64`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Float64.html#polars.datatypes.Float64 "polars.datatypes.Float64") if `method` is `"average"` or, the index size (see [`get_index_type()`](https://docs.pola.rs/api/python/stable/reference/api/polars.get_index_type.html#polars.get_index_type "polars.get_index_type") ) otherwise. Examples \>>> df \= pl.DataFrame({"a": \[1, 4, 4, 1, 9\]}) \>>> df.select(pl.col("a").rolling\_rank(3, method\="average")) shape: (5, 1) ┌──────┐ │ a │ │ --- │ │ f64 │ ╞══════╡ │ null │ │ null │ │ 2.5 │ │ 1.0 │ │ 3.0 │ └──────┘ rolling\_rank\_by( _by: IntoExpr_, _window\_size: timedelta | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _method: RankMethod \= 'average'_, _\*_, _seed: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, _closed: ClosedInterval \= 'right'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L7769-L7864) Compute a rolling rank based on another column. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Given a `by` column ``, then `closed="right"` (the default) means the windows will be: > * (t\_0 - window\_size, t\_0\] > > * (t\_1 - window\_size, t\_1\] > > * … > > * (t\_n - window\_size, t\_n\] > Parameters: **by** Should be `DateTime`, `Date`, `UInt64`, `UInt32`, `Int64`, or `Int32` data type (note that the integral ones require using `'i'` in `window size`). **window\_size** The length of the window. Can be a dynamic temporal size indicated by a timedelta or the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, due to daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. **method**{‘average’, ‘min’, ‘max’, ‘dense’, ‘random’} The method used to assign ranks to tied elements. The following methods are available (default is ‘average’): * ‘average’ : The average of the ranks that would have been assigned to all the tied values is assigned to each value. * ‘min’ : The minimum of the ranks that would have been assigned to all the tied values is assigned to each value. (This is also referred to as “competition” ranking.) * ‘max’ : The maximum of the ranks that would have been assigned to all the tied values is assigned to each value. * ‘dense’ : Like ‘min’, but the rank of the next highest element is assigned the rank immediately after those assigned to the tied elements. * ‘random’ : Choose a random rank for each value in a tie. **seed** Random seed used when `method='random'`. If set to None (default), a random seed is generated for each rolling rank operation. **min\_samples** The number of values in the window that should be non-null before computing a result. **closed**{‘left’, ‘right’, ‘both’, ‘none’} Define which sides of the temporal interval are closed (inclusive), defaults to `'right'`. Returns: Expr An Expr of data [`Float64`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Float64.html#polars.datatypes.Float64 "polars.datatypes.Float64") if `method` is `"average"` or, the index size (see [`get_index_type()`](https://docs.pola.rs/api/python/stable/reference/api/polars.get_index_type.html#polars.get_index_type "polars.get_index_type") ) otherwise. rolling\_skew( _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _\*_, _bias: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L8879-L8940) Compute a rolling skew. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. The window at a given row will include the row itself, and the `window_size - 1` elements before it. Parameters: **window\_size** Integer size of the rolling window. **bias** If False, the calculations are corrected for statistical bias. bias: bool = True, **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. See also [`Expr.skew`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.skew.html#polars.Expr.skew "polars.Expr.skew") Examples \>>> df \= pl.DataFrame({"a": \[1, 4, 2, 9\]}) \>>> df.select(pl.col("a").rolling\_skew(3)) shape: (4, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ null │ │ null │ │ 0.381802 │ │ 0.47033 │ └──────────┘ Note how the values match the following: \>>> pl.Series(\[1, 4, 2\]).skew(), pl.Series(\[4, 2, 9\]).skew() (0.38180177416060584, 0.47033046033698594) rolling\_std( _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _weights: [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _ddof: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L8308-L8422) Compute a rolling standard deviation. A window of length `window_size` will traverse the array. The values that fill this window will (optionally) be multiplied with the weights given by the `weights` vector. The resulting values will be aggregated to their std. Weights are normalized to sum to 1. The window at a given row will include the row itself, and the `window_size - 1` elements before it. Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **window\_size** The length of the window in number of elements. **weights** An optional slice with the same length as the window that will be multiplied elementwise with the values in the window after being normalized to sum to 1. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. **ddof** “Delta Degrees of Freedom”: The divisor for a length N window is N - ddof Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples \>>> df \= pl.DataFrame({"A": \[1.0, 2.0, 3.0, 4.0, 5.0, 6.0\]}) \>>> df.with\_columns( ... rolling\_std\=pl.col("A").rolling\_std(window\_size\=2), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_std │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 0.707107 │ │ 3.0 ┆ 0.707107 │ │ 4.0 ┆ 0.707107 │ │ 5.0 ┆ 0.707107 │ │ 6.0 ┆ 0.707107 │ └─────┴─────────────┘ Specify weights to multiply the values in the window with: \>>> df.with\_columns( ... rolling\_std\=pl.col("A").rolling\_std( ... window\_size\=2, weights\=\[0.25, 0.75\] ... ), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_std │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 0.433013 │ │ 3.0 ┆ 0.433013 │ │ 4.0 ┆ 0.433013 │ │ 5.0 ┆ 0.433013 │ │ 6.0 ┆ 0.433013 │ └─────┴─────────────┘ Center the values in the window \>>> df.with\_columns( ... rolling\_std\=pl.col("A").rolling\_std(window\_size\=3, center\=True), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_std │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 1.0 │ │ 3.0 ┆ 1.0 │ │ 4.0 ┆ 1.0 │ │ 5.0 ┆ 1.0 │ │ 6.0 ┆ null │ └─────┴─────────────┘ rolling\_std\_by( _by: IntoExpr_, _window\_size: timedelta | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, _closed: ClosedInterval \= 'right'_, _ddof: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L7170-L7331) Compute a rolling standard deviation based on another column. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Given a `by` column ``, then `closed="right"` (the default) means the windows will be: > * (t\_0 - window\_size, t\_0\] > > * (t\_1 - window\_size, t\_1\] > > * … > > * (t\_n - window\_size, t\_n\] > Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **by** Should be `DateTime`, `Date`, `UInt64`, `UInt32`, `Int64`, or `Int32` data type (note that the integral ones require using `'i'` in `window size`). **window\_size** The length of the window. Can be a dynamic temporal size indicated by a timedelta or the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, due to daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. **min\_samples** The number of values in the window that should be non-null before computing a result. **closed**{‘left’, ‘right’, ‘both’, ‘none’} Define which sides of the temporal interval are closed (inclusive), defaults to `'right'`. **ddof** “Delta Degrees of Freedom”: The divisor for a length N window is N - ddof Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples Create a DataFrame with a datetime column and a row number column \>>> from datetime import timedelta, datetime \>>> start \= datetime(2001, 1, 1) \>>> stop \= datetime(2001, 1, 2) \>>> df\_temporal \= pl.DataFrame( ... {"date": pl.datetime\_range(start, stop, "1h", eager\=True)} ... ).with\_row\_index() \>>> df\_temporal shape: (25, 2) ┌───────┬─────────────────────┐ │ index ┆ date │ │ --- ┆ --- │ │ u32 ┆ datetime\[μs\] │ ╞═══════╪═════════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 │ │ 1 ┆ 2001-01-01 01:00:00 │ │ 2 ┆ 2001-01-01 02:00:00 │ │ 3 ┆ 2001-01-01 03:00:00 │ │ 4 ┆ 2001-01-01 04:00:00 │ │ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 │ │ 21 ┆ 2001-01-01 21:00:00 │ │ 22 ┆ 2001-01-01 22:00:00 │ │ 23 ┆ 2001-01-01 23:00:00 │ │ 24 ┆ 2001-01-02 00:00:00 │ └───────┴─────────────────────┘ Compute the rolling std with the temporal windows closed on the right (default) \>>> df\_temporal.with\_columns( ... rolling\_row\_std\=pl.col("index").rolling\_std\_by("date", window\_size\="2h") ... ) shape: (25, 3) ┌───────┬─────────────────────┬─────────────────┐ │ index ┆ date ┆ rolling\_row\_std │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ f64 │ ╞═══════╪═════════════════════╪═════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ null │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 0.707107 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 0.707107 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 0.707107 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 0.707107 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 0.707107 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 0.707107 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 0.707107 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 0.707107 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 0.707107 │ └───────┴─────────────────────┴─────────────────┘ Compute the rolling std with the closure of windows on both sides \>>> df\_temporal.with\_columns( ... rolling\_row\_std\=pl.col("index").rolling\_std\_by( ... "date", window\_size\="2h", closed\="both" ... ) ... ) shape: (25, 3) ┌───────┬─────────────────────┬─────────────────┐ │ index ┆ date ┆ rolling\_row\_std │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ f64 │ ╞═══════╪═════════════════════╪═════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ null │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 0.707107 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 1.0 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 1.0 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 1.0 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 1.0 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 1.0 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 1.0 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 1.0 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 1.0 │ └───────┴─────────────────────┴─────────────────┘ rolling\_sum( _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _weights: [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L8198-L8306) Apply a rolling sum (moving sum) over the values in this array. A window of length `window_size` will traverse the array. The values that fill this window will (optionally) be multiplied with the weights given by the `weights` vector. The resulting values will be aggregated to their sum. The window at a given row will include the row itself, and the `window_size - 1` elements before it. Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **window\_size** The length of the window in number of elements. **weights** An optional slice with the same length as the window that will be multiplied elementwise with the values in the window. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples \>>> df \= pl.DataFrame({"A": \[1.0, 2.0, 3.0, 4.0, 5.0, 6.0\]}) \>>> df.with\_columns( ... rolling\_sum\=pl.col("A").rolling\_sum(window\_size\=2), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_sum │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 3.0 │ │ 3.0 ┆ 5.0 │ │ 4.0 ┆ 7.0 │ │ 5.0 ┆ 9.0 │ │ 6.0 ┆ 11.0 │ └─────┴─────────────┘ Specify weights to multiply the values in the window with: \>>> df.with\_columns( ... rolling\_sum\=pl.col("A").rolling\_sum( ... window\_size\=2, weights\=\[0.25, 0.75\] ... ), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_sum │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 1.75 │ │ 3.0 ┆ 2.75 │ │ 4.0 ┆ 3.75 │ │ 5.0 ┆ 4.75 │ │ 6.0 ┆ 5.75 │ └─────┴─────────────┘ Center the values in the window \>>> df.with\_columns( ... rolling\_sum\=pl.col("A").rolling\_sum(window\_size\=3, center\=True), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_sum │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 6.0 │ │ 3.0 ┆ 9.0 │ │ 4.0 ┆ 12.0 │ │ 5.0 ┆ 15.0 │ │ 6.0 ┆ null │ └─────┴─────────────┘ rolling\_sum\_by( _by: IntoExpr_, _window\_size: timedelta | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, _closed: ClosedInterval \= 'right'_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L7016-L7168) Apply a rolling sum based on another column. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Given a `by` column ``, then `closed="right"` (the default) means the windows will be: > * (t\_0 - window\_size, t\_0\] > > * (t\_1 - window\_size, t\_1\] > > * … > > * (t\_n - window\_size, t\_n\] > Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **window\_size** The length of the window. Can be a dynamic temporal size indicated by a timedelta or the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, due to daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. **min\_samples** The number of values in the window that should be non-null before computing a result. **by** Should be `DateTime`, `Date`, `UInt64`, `UInt32`, `Int64`, or `Int32` data type (note that the integral ones require using `'i'` in `window size`). **closed**{‘left’, ‘right’, ‘both’, ‘none’} Define which sides of the temporal interval are closed (inclusive), defaults to `'right'`. Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples Create a DataFrame with a datetime column and a row number column \>>> from datetime import timedelta, datetime \>>> start \= datetime(2001, 1, 1) \>>> stop \= datetime(2001, 1, 2) \>>> df\_temporal \= pl.DataFrame( ... {"date": pl.datetime\_range(start, stop, "1h", eager\=True)} ... ).with\_row\_index() \>>> df\_temporal shape: (25, 2) ┌───────┬─────────────────────┐ │ index ┆ date │ │ --- ┆ --- │ │ u32 ┆ datetime\[μs\] │ ╞═══════╪═════════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 │ │ 1 ┆ 2001-01-01 01:00:00 │ │ 2 ┆ 2001-01-01 02:00:00 │ │ 3 ┆ 2001-01-01 03:00:00 │ │ 4 ┆ 2001-01-01 04:00:00 │ │ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 │ │ 21 ┆ 2001-01-01 21:00:00 │ │ 22 ┆ 2001-01-01 22:00:00 │ │ 23 ┆ 2001-01-01 23:00:00 │ │ 24 ┆ 2001-01-02 00:00:00 │ └───────┴─────────────────────┘ Compute the rolling sum with the temporal windows closed on the right (default) \>>> df\_temporal.with\_columns( ... rolling\_row\_sum\=pl.col("index").rolling\_sum\_by("date", window\_size\="2h") ... ) shape: (25, 3) ┌───────┬─────────────────────┬─────────────────┐ │ index ┆ date ┆ rolling\_row\_sum │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ u32 │ ╞═══════╪═════════════════════╪═════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ 0 │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 1 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 3 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 5 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 7 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 39 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 41 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 43 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 45 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 47 │ └───────┴─────────────────────┴─────────────────┘ Compute the rolling sum with the closure of windows on both sides \>>> df\_temporal.with\_columns( ... rolling\_row\_sum\=pl.col("index").rolling\_sum\_by( ... "date", window\_size\="2h", closed\="both" ... ) ... ) shape: (25, 3) ┌───────┬─────────────────────┬─────────────────┐ │ index ┆ date ┆ rolling\_row\_sum │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ u32 │ ╞═══════╪═════════════════════╪═════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ 0 │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 1 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 3 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 6 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 9 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 57 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 60 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 63 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 66 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 69 │ └───────┴─────────────────────┴─────────────────┘ rolling\_var( _window\_size: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _, _weights: [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)")\ \] | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _center: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _ddof: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L8424-L8538) Compute a rolling variance. A window of length `window_size` will traverse the array. The values that fill this window will (optionally) be multiplied with the weights given by the `weights` vector. The resulting values will be aggregated to their var. Weights are normalized to sum to 1. The window at a given row will include the row itself, and the `window_size - 1` elements before it. Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **window\_size** The length of the window in number of elements. **weights** An optional slice with the same length as the window that will be multiplied elementwise with the values in the window after being normalized to sum to 1. **min\_samples** The number of values in the window that should be non-null before computing a result. If set to `None` (default), it will be set equal to `window_size`. **center** Set the labels at the center of the window. **ddof** “Delta Degrees of Freedom”: The divisor for a length N window is N - ddof Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples \>>> df \= pl.DataFrame({"A": \[1.0, 2.0, 3.0, 4.0, 5.0, 6.0\]}) \>>> df.with\_columns( ... rolling\_var\=pl.col("A").rolling\_var(window\_size\=2), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_var │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 0.5 │ │ 3.0 ┆ 0.5 │ │ 4.0 ┆ 0.5 │ │ 5.0 ┆ 0.5 │ │ 6.0 ┆ 0.5 │ └─────┴─────────────┘ Specify weights to multiply the values in the window with: \>>> df.with\_columns( ... rolling\_var\=pl.col("A").rolling\_var( ... window\_size\=2, weights\=\[0.25, 0.75\] ... ), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_var │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 0.1875 │ │ 3.0 ┆ 0.1875 │ │ 4.0 ┆ 0.1875 │ │ 5.0 ┆ 0.1875 │ │ 6.0 ┆ 0.1875 │ └─────┴─────────────┘ Center the values in the window \>>> df.with\_columns( ... rolling\_var\=pl.col("A").rolling\_var(window\_size\=3, center\=True), ... ) shape: (6, 2) ┌─────┬─────────────┐ │ A ┆ rolling\_var │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════╪═════════════╡ │ 1.0 ┆ null │ │ 2.0 ┆ 1.0 │ │ 3.0 ┆ 1.0 │ │ 4.0 ┆ 1.0 │ │ 5.0 ┆ 1.0 │ │ 6.0 ┆ null │ └─────┴─────────────┘ rolling\_var\_by( _by: IntoExpr_, _window\_size: timedelta | [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") _, _\*_, _min\_samples: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, _closed: ClosedInterval \= 'right'_, _ddof: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L7333-L7494) Compute a rolling variance based on another column. Warning This functionality is considered **unstable**. It may be changed at any point without it being considered a breaking change. Given a `by` column ``, then `closed="right"` (the default) means the windows will be: > * (t\_0 - window\_size, t\_0\] > > * (t\_1 - window\_size, t\_1\] > > * … > > * (t\_n - window\_size, t\_n\] > Changed in version 1.21.0: The `min_periods` parameter was renamed `min_samples`. Parameters: **by** Should be `DateTime`, `Date`, `UInt64`, `UInt32`, `Int64`, or `Int32` data type (note that the integral ones require using `'i'` in `window size`). **window\_size** The length of the window. Can be a dynamic temporal size indicated by a timedelta or the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, due to daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. **min\_samples** The number of values in the window that should be non-null before computing a result. **closed**{‘left’, ‘right’, ‘both’, ‘none’} Define which sides of the temporal interval are closed (inclusive), defaults to `'right'`. **ddof** “Delta Degrees of Freedom”: The divisor for a length N window is N - ddof Notes If you want to compute multiple aggregation statistics over the same dynamic window, consider using `rolling` - this method can cache the window size computation. Examples Create a DataFrame with a datetime column and a row number column \>>> from datetime import timedelta, datetime \>>> start \= datetime(2001, 1, 1) \>>> stop \= datetime(2001, 1, 2) \>>> df\_temporal \= pl.DataFrame( ... {"date": pl.datetime\_range(start, stop, "1h", eager\=True)} ... ).with\_row\_index() \>>> df\_temporal shape: (25, 2) ┌───────┬─────────────────────┐ │ index ┆ date │ │ --- ┆ --- │ │ u32 ┆ datetime\[μs\] │ ╞═══════╪═════════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 │ │ 1 ┆ 2001-01-01 01:00:00 │ │ 2 ┆ 2001-01-01 02:00:00 │ │ 3 ┆ 2001-01-01 03:00:00 │ │ 4 ┆ 2001-01-01 04:00:00 │ │ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 │ │ 21 ┆ 2001-01-01 21:00:00 │ │ 22 ┆ 2001-01-01 22:00:00 │ │ 23 ┆ 2001-01-01 23:00:00 │ │ 24 ┆ 2001-01-02 00:00:00 │ └───────┴─────────────────────┘ Compute the rolling var with the temporal windows closed on the right (default) \>>> df\_temporal.with\_columns( ... rolling\_row\_var\=pl.col("index").rolling\_var\_by("date", window\_size\="2h") ... ) shape: (25, 3) ┌───────┬─────────────────────┬─────────────────┐ │ index ┆ date ┆ rolling\_row\_var │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ f64 │ ╞═══════╪═════════════════════╪═════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ null │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 0.5 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 0.5 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 0.5 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 0.5 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 0.5 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 0.5 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 0.5 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 0.5 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 0.5 │ └───────┴─────────────────────┴─────────────────┘ Compute the rolling var with the closure of windows on both sides \>>> df\_temporal.with\_columns( ... rolling\_row\_var\=pl.col("index").rolling\_var\_by( ... "date", window\_size\="2h", closed\="both" ... ) ... ) shape: (25, 3) ┌───────┬─────────────────────┬─────────────────┐ │ index ┆ date ┆ rolling\_row\_var │ │ --- ┆ --- ┆ --- │ │ u32 ┆ datetime\[μs\] ┆ f64 │ ╞═══════╪═════════════════════╪═════════════════╡ │ 0 ┆ 2001-01-01 00:00:00 ┆ null │ │ 1 ┆ 2001-01-01 01:00:00 ┆ 0.5 │ │ 2 ┆ 2001-01-01 02:00:00 ┆ 1.0 │ │ 3 ┆ 2001-01-01 03:00:00 ┆ 1.0 │ │ 4 ┆ 2001-01-01 04:00:00 ┆ 1.0 │ │ … ┆ … ┆ … │ │ 20 ┆ 2001-01-01 20:00:00 ┆ 1.0 │ │ 21 ┆ 2001-01-01 21:00:00 ┆ 1.0 │ │ 22 ┆ 2001-01-01 22:00:00 ┆ 1.0 │ │ 23 ┆ 2001-01-01 23:00:00 ┆ 1.0 │ │ 24 ┆ 2001-01-02 00:00:00 ┆ 1.0 │ └───────┴─────────────────────┴─────────────────┘ round(_decimals: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 0_, _mode: RoundMode \= 'half\_to\_even'_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1685-L1746) Round underlying floating point data by `decimals` digits. The default rounding mode is “half to even” (also known as “bankers’ rounding”). Parameters: **decimals** Number of decimals to round by. **mode**{‘half\_to\_even’, ‘half\_away\_from\_zero’} RoundMode. * _half\_to\_even_ round to the nearest even number * _half\_away\_from\_zero_ round to the nearest number away from zero Examples \>>> df \= pl.DataFrame({"a": \[0.33, 0.52, 1.02, 1.17\]}) \>>> df.select(pl.col("a").round(1)) shape: (4, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 0.3 │ │ 0.5 │ │ 1.0 │ │ 1.2 │ └─────┘ \>>> df \= pl.DataFrame( ... { ... "f64": \[\-3.5, \-2.5, \-1.5, \-0.5, 0.5, 1.5, 2.5, 3.5\], ... "d": \["-3.5", "-2.5", "-1.5", "-0.5", "0.5", "1.5", "2.5", "3.5"\], ... }, ... schema\_overrides\={"d": pl.Decimal(scale\=1)}, ... ) \>>> df.with\_columns( ... pl.all().round(mode\="half\_away\_from\_zero").name.suffix("\_away"), ... pl.all().round(mode\="half\_to\_even").name.suffix("\_to\_even"), ... ) shape: (8, 6) ┌──────┬───────────────┬──────────┬───────────────┬─────────────┬───────────────┐ │ f64 ┆ d ┆ f64\_away ┆ d\_away ┆ f64\_to\_even ┆ d\_to\_even │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ decimal\[38,1\] ┆ f64 ┆ decimal\[38,1\] ┆ f64 ┆ decimal\[38,1\] │ ╞══════╪═══════════════╪══════════╪═══════════════╪═════════════╪═══════════════╡ │ -3.5 ┆ -3.5 ┆ -4.0 ┆ -4.0 ┆ -4.0 ┆ -4.0 │ │ -2.5 ┆ -2.5 ┆ -3.0 ┆ -3.0 ┆ -2.0 ┆ -2.0 │ │ -1.5 ┆ -1.5 ┆ -2.0 ┆ -2.0 ┆ -2.0 ┆ -2.0 │ │ -0.5 ┆ -0.5 ┆ -1.0 ┆ -1.0 ┆ -0.0 ┆ 0.0 │ │ 0.5 ┆ 0.5 ┆ 1.0 ┆ 1.0 ┆ 0.0 ┆ 0.0 │ │ 1.5 ┆ 1.5 ┆ 2.0 ┆ 2.0 ┆ 2.0 ┆ 2.0 │ │ 2.5 ┆ 2.5 ┆ 3.0 ┆ 3.0 ┆ 2.0 ┆ 2.0 │ │ 3.5 ┆ 3.5 ┆ 4.0 ┆ 4.0 ┆ 4.0 ┆ 4.0 │ └──────┴───────────────┴──────────┴───────────────┴─────────────┴───────────────┘ round\_sig\_figs(_digits: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1748-L1772) Round to a number of significant figures. Parameters: **digits** Number of significant figures to round to. Examples \>>> df \= pl.DataFrame({"a": \[0.01234, 3.333, 1234.0\]}) \>>> df.with\_columns(pl.col("a").round\_sig\_figs(2).alias("round\_sig\_figs")) shape: (3, 2) ┌─────────┬────────────────┐ │ a ┆ round\_sig\_figs │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞═════════╪════════════════╡ │ 0.01234 ┆ 0.012 │ │ 3.333 ┆ 3.3 │ │ 1234.0 ┆ 1200.0 │ └─────────┴────────────────┘ sample( _n: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | IntoExprColumn | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _fraction: [float](https://docs.python.org/3/library/functions.html#float "(in Python v3.14)") | IntoExprColumn | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _with\_replacement: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _shuffle: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _seed: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10044-L10103) Sample from this expression. Parameters: **n** Number of items to return. Cannot be used with `fraction`. Defaults to 1 if `fraction` is None. **fraction** Fraction of items to return. Cannot be used with `n`. **with\_replacement** Allow values to be sampled more than once. **shuffle** Shuffle the order of sampled data points. **seed** Seed for the random number generator. If set to None (default), a random seed is generated for each sample operation. Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3\]}) \>>> df.select(pl.col("a").sample(fraction\=1.0, with\_replacement\=True, seed\=1)) shape: (3, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 3 │ │ 3 │ │ 1 │ └─────┘ search\_sorted( _element: IntoExpr | np.ndarray\[Any, Any\]_, _side: SearchSortedSide \= 'any'_, _\*_, _descending: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2459-L2509) Find indices where elements should be inserted to maintain order. \\\[a\[i-1\] < v <= a\[i\]\\\] Parameters: **element** Expression or scalar value. **side**{‘any’, ‘left’, ‘right’} If ‘any’, the index of the first suitable location found is given. If ‘left’, the index of the leftmost suitable location found is given. If ‘right’, return the rightmost suitable location found is given. **descending** Boolean indicating whether the values are descending or not (they are required to be sorted either way). Examples \>>> df \= pl.DataFrame( ... { ... "values": \[1, 2, 3, 5\], ... } ... ) \>>> df.select( ... \[\ ... pl.col("values").search\_sorted(0).alias("zero"),\ ... pl.col("values").search\_sorted(3).alias("three"),\ ... pl.col("values").search\_sorted(6).alias("six"),\ ... \] ... ) shape: (1, 3) ┌──────┬───────┬─────┐ │ zero ┆ three ┆ six │ │ --- ┆ --- ┆ --- │ │ u32 ┆ u32 ┆ u32 │ ╞══════╪═══════╪═════╡ │ 0 ┆ 2 ┆ 4 │ └──────┴───────┴─────┘ set\_sorted(_\*_, _descending: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10857-L10886) Flags the expression as ‘sorted’. Enables downstream code to user fast paths for sorted arrays. Parameters: **descending** Whether the `Series` order is descending. Warning This can lead to incorrect results if the data is NOT sorted!! Use with care! Examples \>>> df \= pl.DataFrame({"values": \[1, 2, 3\]}) \>>> df.select(pl.col("values").set\_sorted().max()) shape: (1, 1) ┌────────┐ │ values │ │ --- │ │ i64 │ ╞════════╡ │ 3 │ └────────┘ shift(_n: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | IntoExprColumn \= 1_, _\*_, _fill\_value: IntoExpr | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2759-L2835) Shift values by the given number of indices. Parameters: **n** Number of indices to shift forward. If a negative value is passed, values are shifted in the opposite direction instead. **fill\_value** Fill the resulting null values with this scalar value. See also [`fill_null`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.fill_null.html#polars.Expr.fill_null "polars.Expr.fill_null") Notes This method is similar to the `LAG` operation in SQL when the value for `n` is positive. With a negative value for `n`, it is similar to `LEAD`. Examples By default, values are shifted forward by one index. \>>> df \= pl.DataFrame({"a": \[1, 2, 3, 4\]}) \>>> df.with\_columns(shift\=pl.col("a").shift()) shape: (4, 2) ┌─────┬───────┐ │ a ┆ shift │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═══════╡ │ 1 ┆ null │ │ 2 ┆ 1 │ │ 3 ┆ 2 │ │ 4 ┆ 3 │ └─────┴───────┘ Pass a negative value to shift in the opposite direction instead. \>>> df.with\_columns(shift\=pl.col("a").shift(\-2)) shape: (4, 2) ┌─────┬───────┐ │ a ┆ shift │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═══════╡ │ 1 ┆ 3 │ │ 2 ┆ 4 │ │ 3 ┆ null │ │ 4 ┆ null │ └─────┴───────┘ Specify `fill_value` to fill the resulting null values. \>>> df.with\_columns(shift\=pl.col("a").shift(\-2, fill\_value\=100)) shape: (4, 2) ┌─────┬───────┐ │ a ┆ shift │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═══════╡ │ 1 ┆ 3 │ │ 2 ┆ 4 │ │ 3 ┆ 100 │ │ 4 ┆ 100 │ └─────┴───────┘ shrink\_dtype() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10888-L10930) Shrink numeric columns to the minimal required datatype. Shrink to the dtype needed to fit the extrema of this \[`Series`\]. This can be used to reduce memory pressure. Changed in version 1.33.0: Deprecated and turned into a no-op. The operation does not match the Polars data-model during lazy execution since the output datatype cannot be known without inspecting the data. Use `Series.shrink_dtype` instead. Examples \>>> pl.DataFrame( ... { ... "a": \[1, 2, 3\], ... "b": \[1, 2, 2 << 32\], ... "c": \[\-1, 2, 1 << 30\], ... "d": \[\-112, 2, 112\], ... "e": \[\-112, 2, 129\], ... "f": \["a", "b", "c"\], ... "g": \[0.1, 1.32, 0.12\], ... "h": \[True, None, False\], ... } ... ).select(pl.all().shrink\_dtype()) shape: (3, 8) ┌─────┬────────────┬────────────┬──────┬──────┬─────┬──────┬───────┐ │ a ┆ b ┆ c ┆ d ┆ e ┆ f ┆ g ┆ h │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i8 ┆ i64 ┆ i32 ┆ i8 ┆ i16 ┆ str ┆ f32 ┆ bool │ ╞═════╪════════════╪════════════╪══════╪══════╪═════╪══════╪═══════╡ │ 1 ┆ 1 ┆ -1 ┆ -112 ┆ -112 ┆ a ┆ 0.1 ┆ true │ │ 2 ┆ 2 ┆ 2 ┆ 2 ┆ 2 ┆ b ┆ 1.32 ┆ null │ │ 3 ┆ 8589934592 ┆ 1073741824 ┆ 112 ┆ 129 ┆ c ┆ 0.12 ┆ false │ └─────┴────────────┴────────────┴──────┴──────┴─────┴──────┴───────┘ shuffle(_seed: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10014-L10042) Shuffle the contents of this expression. Note this is shuffled independently of any other column or Expression. If you want each row to stay the same use df.sample(shuffle=True) Parameters: **seed** Seed for the random number generator. If set to None (default), a random seed is generated each time the shuffle is called. Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3\]}) \>>> df.select(pl.col("a").shuffle(seed\=1)) shape: (3, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 2 │ │ 3 │ │ 1 │ └─────┘ sign() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9546-L9576) Compute the element-wise sign function on numeric types. The returned value is computed as follows: * \-1 if x < 0. * 1 if x > 0. * x otherwise (typically 0, but could be NaN if the input is). Null values are preserved as-is, and the dtype of the input is preserved. Examples \>>> df \= pl.DataFrame({"a": \[\-9.0, \-0.0, 0.0, 4.0, float("nan"), None\]}) \>>> df.select(pl.col.a.sign()) shape: (6, 1) ┌──────┐ │ a │ │ --- │ │ f64 │ ╞══════╡ │ -1.0 │ │ -0.0 │ │ 0.0 │ │ 1.0 │ │ NaN │ │ null │ └──────┘ sin() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9578-L9600) Compute the element-wise value for the sine. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[0.0\]}) \>>> df.select(pl.col("a").sin()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 0.0 │ └─────┘ sinh() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9746-L9768) Compute the element-wise value for the hyperbolic sine. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[1.0\]}) \>>> df.select(pl.col("a").sinh()) shape: (1, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 1.175201 │ └──────────┘ skew(_\*_, _bias: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9327-L9378) Compute the sample skewness of a data set. For normally distributed data, the skewness should be about zero. For unimodal continuous distributions, a skewness value greater than zero means that there is more weight in the right tail of the distribution. The function `skewtest` can be used to determine if the skewness value is close enough to zero, statistically speaking. See scipy.stats for more information. Parameters: **bias**bool, optional If False, the calculations are corrected for statistical bias. Notes The sample skewness is computed as the Fisher-Pearson coefficient of skewness, i.e. \\\[g\_1=\\frac{m\_3}{m\_2^{3/2}}\\\] where \\\[m\_i=\\frac{1}{N}\\sum\_{n=1}^N(x\[n\]-\\bar{x})^i\\\] is the biased sample \\(i\\texttt{th}\\) central moment, and \\(\\bar{x}\\) is the sample mean. If `bias` is False, the calculations are corrected for bias and the value computed is the adjusted Fisher-Pearson standardized moment coefficient, i.e. \\\[G\_1 = \\frac{k\_3}{k\_2^{3/2}} = \\frac{\\sqrt{N(N-1)}}{N-2}\\frac{m\_3}{m\_2^{3/2}}\\\] Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3, 2, 1\]}) \>>> df.select(pl.col("a").skew()) shape: (1, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 0.343622 │ └──────────┘ slice( _offset: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | Expr_, _length: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | Expr | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1261-L1296) Get a slice of this expression. Parameters: **offset** Start index. Negative indexing is supported. **length** Length of the slice. If set to `None`, all rows starting at the offset will be selected. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[8, 9, 10, 11\], ... "b": \[None, 4, 4, 4\], ... } ... ) \>>> df.select(pl.all().slice(1, 2)) shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 9 ┆ 4 │ │ 10 ┆ 4 │ └─────┴─────┘ sort( _\*_, _descending: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _nulls\_last: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1884-L1961) Sort this column. When used in a projection/selection context, the whole column is sorted. When used in a group by context, the groups are sorted. Parameters: **descending** Sort in descending order. **nulls\_last** Place null values last. Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, None, 3, 2\], ... } ... ) \>>> df.select(pl.col("a").sort()) shape: (4, 1) ┌──────┐ │ a │ │ --- │ │ i64 │ ╞══════╡ │ null │ │ 1 │ │ 2 │ │ 3 │ └──────┘ \>>> df.select(pl.col("a").sort(descending\=True)) shape: (4, 1) ┌──────┐ │ a │ │ --- │ │ i64 │ ╞══════╡ │ null │ │ 3 │ │ 2 │ │ 1 │ └──────┘ \>>> df.select(pl.col("a").sort(nulls\_last\=True)) shape: (4, 1) ┌──────┐ │ a │ │ --- │ │ i64 │ ╞══════╡ │ 1 │ │ 2 │ │ 3 │ │ null │ └──────┘ When sorting in a group by context, the groups are sorted. \>>> df \= pl.DataFrame( ... { ... "group": \["one", "one", "one", "two", "two", "two"\], ... "value": \[1, 98, 2, 3, 99, 4\], ... } ... ) \>>> df.group\_by("group").agg(pl.col("value").sort()) shape: (2, 2) ┌───────┬────────────┐ │ group ┆ value │ │ --- ┆ --- │ │ str ┆ list\[i64\] │ ╞═══════╪════════════╡ │ two ┆ \[3, 4, 99\] │ │ one ┆ \[1, 2, 98\] │ └───────┴────────────┘ sort\_by( _by: IntoExpr | Iterable\[IntoExpr\]_, _\*more\_by: IntoExpr_, _descending: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") | Sequence\[[bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \] \= False_, _nulls\_last: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") | Sequence\[[bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \] \= False_, _multithreaded: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_, _maintain\_order: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2511-L2651) Sort this column by the ordering of other columns. When used in a projection/selection context, the whole column is sorted. When used in a group by context, the groups are sorted. Parameters: **by** Column(s) to sort by. Accepts expression input. Strings are parsed as column names. **\*more\_by** Additional columns to sort by, specified as positional arguments. **descending** Sort in descending order. When sorting by multiple columns, can be specified per column by passing a sequence of booleans. **nulls\_last** Place null values last; can specify a single boolean applying to all columns or a sequence of booleans for per-column control. **multithreaded** Sort using multiple threads. **maintain\_order** Whether the order should be maintained if elements are equal. Examples Pass a single column name to sort by that column. \>>> df \= pl.DataFrame( ... { ... "group": \["a", "a", "b", "b"\], ... "value1": \[1, 3, 4, 2\], ... "value2": \[8, 7, 6, 5\], ... } ... ) \>>> df.select(pl.col("group").sort\_by("value1")) shape: (4, 1) ┌───────┐ │ group │ │ --- │ │ str │ ╞═══════╡ │ a │ │ b │ │ a │ │ b │ └───────┘ Sorting by expressions is also supported. \>>> df.select(pl.col("group").sort\_by(pl.col("value1") + pl.col("value2"))) shape: (4, 1) ┌───────┐ │ group │ │ --- │ │ str │ ╞═══════╡ │ b │ │ a │ │ a │ │ b │ └───────┘ Sort by multiple columns by passing a list of columns. \>>> df.select(pl.col("group").sort\_by(\["value1", "value2"\], descending\=True)) shape: (4, 1) ┌───────┐ │ group │ │ --- │ │ str │ ╞═══════╡ │ b │ │ a │ │ b │ │ a │ └───────┘ Or use positional arguments to sort by multiple columns in the same way. \>>> df.select(pl.col("group").sort\_by("value1", "value2")) shape: (4, 1) ┌───────┐ │ group │ │ --- │ │ str │ ╞═══════╡ │ a │ │ b │ │ a │ │ b │ └───────┘ When sorting in a group by context, the groups are sorted. \>>> df.group\_by("group").agg( ... pl.col("value1").sort\_by("value2") ... ) shape: (2, 2) ┌───────┬───────────┐ │ group ┆ value1 │ │ --- ┆ --- │ │ str ┆ list\[i64\] │ ╞═══════╪═══════════╡ │ a ┆ \[3, 1\] │ │ b ┆ \[2, 4\] │ └───────┴───────────┘ Take a single row from each group where a column attains its minimal value within that group. \>>> df.group\_by("group").agg( ... pl.all().sort\_by("value2").first() ... ) shape: (2, 3) ┌───────┬────────┬────────┐ │ group ┆ value1 ┆ value2 | │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 | ╞═══════╪════════╪════════╡ │ a ┆ 3 ┆ 7 | │ b ┆ 2 ┆ 5 | └───────┴────────┴────────┘ sqrt() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L639-L658) Compute the square root of the elements. Examples \>>> df \= pl.DataFrame({"values": \[1.0, 2.0, 4.0\]}) \>>> df.select(pl.col("values").sqrt()) shape: (3, 1) ┌──────────┐ │ values │ │ --- │ │ f64 │ ╞══════════╡ │ 1.0 │ │ 1.414214 │ │ 2.0 │ └──────────┘ std(_ddof: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3065-L3089) Get standard deviation. Parameters: **ddof** “Delta Degrees of Freedom”: the divisor used in the calculation is N - ddof, where N represents the number of elements. By default ddof is 1. Examples \>>> df \= pl.DataFrame({"a": \[\-1, 0, 1\]}) \>>> df.select(pl.col("a").std()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 1.0 │ └─────┘ sub(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5863-L5892) Method equivalent of subtraction operator `expr - other`. Parameters: **other** Numeric literal or expression value. Examples \>>> df \= pl.DataFrame({"x": \[0, 1, 2, 3, 4\]}) \>>> df.with\_columns( ... pl.col("x").sub(2).alias("x-2"), ... pl.col("x").sub(pl.col("x").cum\_sum()).alias("x-expr"), ... ) shape: (5, 3) ┌─────┬─────┬────────┐ │ x ┆ x-2 ┆ x-expr │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪════════╡ │ 0 ┆ -2 ┆ 0 │ │ 1 ┆ -1 ┆ 0 │ │ 2 ┆ 0 ┆ -1 │ │ 3 ┆ 1 ┆ -3 │ │ 4 ┆ 2 ┆ -6 │ └─────┴─────┴────────┘ sum() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3267-L3293) Get sum value. Notes * Dtypes in {Int8, UInt8, Int16, UInt16} are cast to Int64 before summing to prevent overflow issues. * If there are no non-null values, then the output is `0`. If you would prefer empty sums to return `None`, you can use `pl.when(expr.count()>0).then(expr.sum())` instead of `expr.sum()`. Examples \>>> df \= pl.DataFrame({"a": \[\-1, 0, 1\]}) \>>> df.select(pl.col("a").sum()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 0 │ └─────┘ tail(_n: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | Expr \= 10_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5199-L5230) Get the last `n` rows. Parameters: **n** Number of rows to return. Examples \>>> df \= pl.DataFrame({"foo": \[1, 2, 3, 4, 5, 6, 7\]}) \>>> df.select(pl.col("foo").tail(3)) shape: (3, 1) ┌─────┐ │ foo │ │ --- │ │ i64 │ ╞═════╡ │ 5 │ │ 6 │ │ 7 │ └─────┘ tan() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9626-L9648) Compute the element-wise value for the tangent. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[1.0\]}) \>>> df.select(pl.col("a").tan().round(2)) shape: (1, 1) ┌──────┐ │ a │ │ --- │ │ f64 │ ╞══════╡ │ 1.56 │ └──────┘ tanh() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9794-L9816) Compute the element-wise value for the hyperbolic tangent. Returns: Expr Expression of data type `Float64`. Examples \>>> df \= pl.DataFrame({"a": \[1.0\]}) \>>> df.select(pl.col("a").tanh()) shape: (1, 1) ┌──────────┐ │ a │ │ --- │ │ f64 │ ╞══════════╡ │ 0.761594 │ └──────────┘ to\_physical() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L447-L493) Cast to physical representation of the logical dtype. * [`polars.datatypes.Date()`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Date.html#polars.datatypes.Date "polars.datatypes.Date") -> [`polars.datatypes.Int32()`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Int32.html#polars.datatypes.Int32 "polars.datatypes.Int32") * [`polars.datatypes.Datetime()`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Datetime.html#polars.datatypes.Datetime "polars.datatypes.Datetime") -> [`polars.datatypes.Int64()`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Int64.html#polars.datatypes.Int64 "polars.datatypes.Int64") * [`polars.datatypes.Time()`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Time.html#polars.datatypes.Time "polars.datatypes.Time") -> [`polars.datatypes.Int64()`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Int64.html#polars.datatypes.Int64 "polars.datatypes.Int64") * [`polars.datatypes.Duration()`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Duration.html#polars.datatypes.Duration "polars.datatypes.Duration") -> [`polars.datatypes.Int64()`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Int64.html#polars.datatypes.Int64 "polars.datatypes.Int64") * [`polars.datatypes.Categorical()`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.Categorical.html#polars.datatypes.Categorical "polars.datatypes.Categorical") -> [`polars.datatypes.UInt32()`](https://docs.pola.rs/api/python/stable/reference/api/polars.datatypes.UInt32.html#polars.datatypes.UInt32 "polars.datatypes.UInt32") * `List(inner)` -> `List(physical of inner)` * `Array(inner)` -> `Struct(physical of inner)` * `Struct(fields)` -> `Array(physical of fields)` Other data types will be left unchanged. Warning The physical representations are an implementation detail and not guaranteed to be stable. Examples Replicating the pandas [pd.factorize](https://pandas.pydata.org/docs/reference/api/pandas.factorize.html) function. \>>> pl.DataFrame({"vals": \["a", "x", None, "a"\]}).with\_columns( ... pl.col("vals").cast(pl.Categorical), ... pl.col("vals") ... .cast(pl.Categorical) ... .to\_physical() ... .alias("vals\_physical"), ... ) shape: (4, 2) ┌──────┬───────────────┐ │ vals ┆ vals\_physical │ │ --- ┆ --- │ │ cat ┆ u32 │ ╞══════╪═══════════════╡ │ a ┆ 0 │ │ x ┆ 1 │ │ null ┆ null │ │ a ┆ 0 │ └──────┴───────────────┘ top\_k(_k: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | IntoExprColumn \= 5_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L1963-L2009) Return the `k` largest elements. Non-null elements are always preferred over null elements. The output is not guaranteed to be in any particular order, call [`sort()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sort.html#polars.Expr.sort "polars.Expr.sort") after this function if you wish the output to be sorted. This has time complexity: \\\[O(n)\\\] Parameters: **k** Number of elements to return. See also [`top_k_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.top_k_by.html#polars.Expr.top_k_by "polars.Expr.top_k_by") [`bottom_k`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bottom_k.html#polars.Expr.bottom_k "polars.Expr.bottom_k") [`bottom_k_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bottom_k_by.html#polars.Expr.bottom_k_by "polars.Expr.bottom_k_by") Examples Get the 5 largest values in series. \>>> df \= pl.DataFrame({"value": \[1, 98, 2, 3, 99, 4\]}) \>>> df.select( ... pl.col("value").top\_k().alias("top\_k"), ... pl.col("value").bottom\_k().alias("bottom\_k"), ... ) shape: (5, 2) ┌───────┬──────────┐ │ top\_k ┆ bottom\_k │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═══════╪══════════╡ │ 4 ┆ 1 │ │ 98 ┆ 98 │ │ 2 ┆ 2 │ │ 3 ┆ 3 │ │ 99 ┆ 4 │ └───────┴──────────┘ top\_k\_by( _by: IntoExpr | Iterable\[IntoExpr\]_, _k: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") | IntoExprColumn \= 5_, _\*_, _reverse: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") | Sequence\[[bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)")\ \] \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L2011-L2137) Return the elements corresponding to the `k` largest elements of the `by` column(s). Non-null elements are always preferred over null elements, regardless of the value of `reverse`. The output is not guaranteed to be in any particular order, call [`sort()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.sort.html#polars.Expr.sort "polars.Expr.sort") after this function if you wish the output to be sorted. This has time complexity: \\\[O(n \\log{n})\\\] Changed in version 1.0.0: The `descending` parameter was renamed to `reverse`. Parameters: **by** Column(s) used to determine the largest elements. Accepts expression input. Strings are parsed as column names. **k** Number of elements to return. **reverse** Consider the `k` smallest elements of the `by` column(s) (instead of the `k` largest). This can be specified per column by passing a sequence of booleans. See also [`top_k`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.top_k.html#polars.Expr.top_k "polars.Expr.top_k") [`bottom_k`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bottom_k.html#polars.Expr.bottom_k "polars.Expr.bottom_k") [`bottom_k_by`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.bottom_k_by.html#polars.Expr.bottom_k_by "polars.Expr.bottom_k_by") Examples \>>> df \= pl.DataFrame( ... { ... "a": \[1, 2, 3, 4, 5, 6\], ... "b": \[6, 5, 4, 3, 2, 1\], ... "c": \["Apple", "Orange", "Apple", "Apple", "Banana", "Banana"\], ... } ... ) \>>> df shape: (6, 3) ┌─────┬─────┬────────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪════════╡ │ 1 ┆ 6 ┆ Apple │ │ 2 ┆ 5 ┆ Orange │ │ 3 ┆ 4 ┆ Apple │ │ 4 ┆ 3 ┆ Apple │ │ 5 ┆ 2 ┆ Banana │ │ 6 ┆ 1 ┆ Banana │ └─────┴─────┴────────┘ Get the top 2 rows by column `a` or `b`. \>>> df.select( ... pl.all().top\_k\_by("a", 2).name.suffix("\_top\_by\_a"), ... pl.all().top\_k\_by("b", 2).name.suffix("\_top\_by\_b"), ... ) shape: (2, 6) ┌────────────┬────────────┬────────────┬────────────┬────────────┬────────────┐ │ a\_top\_by\_a ┆ b\_top\_by\_a ┆ c\_top\_by\_a ┆ a\_top\_by\_b ┆ b\_top\_by\_b ┆ c\_top\_by\_b │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str ┆ i64 ┆ i64 ┆ str │ ╞════════════╪════════════╪════════════╪════════════╪════════════╪════════════╡ │ 6 ┆ 1 ┆ Banana ┆ 1 ┆ 6 ┆ Apple │ │ 5 ┆ 2 ┆ Banana ┆ 2 ┆ 5 ┆ Orange │ └────────────┴────────────┴────────────┴────────────┴────────────┴────────────┘ Get the top 2 rows by multiple columns with given order. \>>> df.select( ... pl.all() ... .top\_k\_by(\["c", "a"\], 2, reverse\=\[False, True\]) ... .name.suffix("\_by\_ca"), ... pl.all() ... .top\_k\_by(\["c", "b"\], 2, reverse\=\[False, True\]) ... .name.suffix("\_by\_cb"), ... ) shape: (2, 6) ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐ │ a\_by\_ca ┆ b\_by\_ca ┆ c\_by\_ca ┆ a\_by\_cb ┆ b\_by\_cb ┆ c\_by\_cb │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str ┆ i64 ┆ i64 ┆ str │ ╞═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡ │ 2 ┆ 5 ┆ Orange ┆ 2 ┆ 5 ┆ Orange │ │ 5 ┆ 2 ┆ Banana ┆ 6 ┆ 1 ┆ Banana │ └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘ Get the top 2 rows by column `a` in each group. \>>> ( ... df.group\_by("c", maintain\_order\=True) ... .agg(pl.all().top\_k\_by("a", 2)) ... .explode(pl.all().exclude("c")) ... ) shape: (5, 3) ┌────────┬─────┬─────┐ │ c ┆ a ┆ b │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞════════╪═════╪═════╡ │ Apple ┆ 4 ┆ 3 │ │ Apple ┆ 3 ┆ 4 │ │ Orange ┆ 2 ┆ 5 │ │ Banana ┆ 6 ┆ 1 │ │ Banana ┆ 5 ┆ 2 │ └────────┴─────┴─────┘ truediv(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L5916-L5958) Method equivalent of float division operator `expr / other`. Parameters: **other** Numeric literal or expression value. See also [`floordiv`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.floordiv.html#polars.Expr.floordiv "polars.Expr.floordiv") Notes Zero-division behaviour follows IEEE-754: 0/0: Invalid operation - mathematically undefined, returns NaN. n/0: On finite operands gives an exact infinite result, eg: ±infinity. Examples \>>> df \= pl.DataFrame( ... data\={"x": \[\-2, \-1, 0, 1, 2\], "y": \[0.5, 0.0, 0.0, \-4.0, \-0.5\]} ... ) \>>> df.with\_columns( ... pl.col("x").truediv(2).alias("x/2"), ... pl.col("x").truediv(pl.col("y")).alias("x/y"), ... ) shape: (5, 4) ┌─────┬──────┬──────┬───────┐ │ x ┆ y ┆ x/2 ┆ x/y │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ f64 ┆ f64 │ ╞═════╪══════╪══════╪═══════╡ │ -2 ┆ 0.5 ┆ -1.0 ┆ -4.0 │ │ -1 ┆ 0.0 ┆ -0.5 ┆ -inf │ │ 0 ┆ 0.0 ┆ 0.0 ┆ NaN │ │ 1 ┆ -4.0 ┆ 0.5 ┆ -0.25 │ │ 2 ┆ -0.5 ┆ 1.0 ┆ -4.0 │ └─────┴──────┴──────┴───────┘ unique(_\*_, _maintain\_order: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3505-L3540) Get unique values of this expression. Parameters: **maintain\_order** Maintain order of data. This requires more work. Examples \>>> df \= pl.DataFrame({"a": \[1, 1, 2\]}) \>>> df.select(pl.col("a").unique()) shape: (2, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 2 │ │ 1 │ └─────┘ \>>> df.select(pl.col("a").unique(maintain\_order\=True)) shape: (2, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ │ 2 │ └─────┘ unique\_counts() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10660-L10717) Return a count of the unique values in the order of appearance. This method differs from `value_counts` in that it does not return the values, only the counts and might be faster Examples \>>> df \= pl.DataFrame( ... { ... "id": \["a", "b", "b", "c", "c", "c"\], ... } ... ) \>>> df.select(pl.col("id").unique\_counts()) shape: (3, 1) ┌─────┐ │ id │ │ --- │ │ u32 │ ╞═════╡ │ 1 │ │ 2 │ │ 3 │ └─────┘ Note that `group_by` can be used to generate counts. \>>> df.group\_by("id", maintain\_order\=True).len().select("len") shape: (3, 1) ┌─────┐ │ len │ │ --- │ │ u32 │ ╞═════╡ │ 1 │ │ 2 │ │ 3 │ └─────┘ To add counts as a new column `pl.len()` can be used as a window function. \>>> df.with\_columns(pl.len().over("id")) shape: (6, 2) ┌─────┬─────┐ │ id ┆ len │ │ --- ┆ --- │ │ str ┆ u32 │ ╞═════╪═════╡ │ a ┆ 1 │ │ b ┆ 2 │ │ b ┆ 2 │ │ c ┆ 3 │ │ c ┆ 3 │ │ c ┆ 3 │ └─────┴─────┘ upper\_bound() → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L9524-L9544) Calculate the upper bound. Returns a unit Series with the highest value possible for the dtype of this expression. Examples \>>> df \= pl.DataFrame({"a": \[1, 2, 3, 2, 1\]}) \>>> df.select(pl.col("a").upper\_bound()) shape: (1, 1) ┌─────────────────────┐ │ a │ │ --- │ │ i64 │ ╞═════════════════════╡ │ 9223372036854775807 │ └─────────────────────┘ value\_counts( _\*_, _sort: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _parallel: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, _name: [str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)") | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _normalize: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= False_, ) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L10512-L10658) Count the occurrence of unique values. Parameters: **sort** Sort the output by count, in descending order. If set to `False` (default), the order is non-deterministic. **parallel** Execute the computation in parallel. Note This option should likely _not_ be enabled in a `group_by` context, as the computation will already be parallelized per group. **name** Give the resulting count column a specific name; if `normalize` is True this defaults to “proportion”, otherwise defaults to “count”. **normalize** If True, the count is returned as the relative frequency of unique values normalized to 1.0. Returns: Expr Expression of type `Struct`, mapping unique values to their count (or proportion). Examples \>>> df \= pl.DataFrame( ... {"color": \["red", "blue", "red", "green", "blue", "blue"\]} ... ) \>>> df\_count \= df.select(pl.col("color").value\_counts()) \>>> df\_count shape: (3, 1) ┌─────────────┐ │ color │ │ --- │ │ struct\[2\] │ ╞═════════════╡ │ {"green",1} │ │ {"blue",3} │ │ {"red",2} │ └─────────────┘ \>>> df\_count.unnest("color") shape: (3, 2) ┌───────┬───────┐ │ color ┆ count │ │ --- ┆ --- │ │ str ┆ u32 │ ╞═══════╪═══════╡ │ green ┆ 1 │ │ blue ┆ 3 │ │ red ┆ 2 │ └───────┴───────┘ Sort the output by (descending) count, customize the field name, and normalize the count to its relative proportion (of 1.0). \>>> df\_count \= df.select( ... pl.col("color").value\_counts( ... name\="fraction", ... normalize\=True, ... sort\=True, ... ) ... ) \>>> df\_count shape: (3, 1) ┌────────────────────┐ │ color │ │ --- │ │ struct\[2\] │ ╞════════════════════╡ │ {"blue",0.5} │ │ {"red",0.333333} │ │ {"green",0.166667} │ └────────────────────┘ \>>> df\_count.unnest("color") shape: (3, 2) ┌───────┬──────────┐ │ color ┆ fraction │ │ --- ┆ --- │ │ str ┆ f64 │ ╞═══════╪══════════╡ │ blue ┆ 0.5 │ │ red ┆ 0.333333 │ │ green ┆ 0.166667 │ └───────┴──────────┘ Note that `group_by` can be used to generate counts. \>>> df.group\_by("color").len() shape: (3, 2) ┌───────┬─────┐ │ color ┆ len │ │ --- ┆ --- │ │ str ┆ u32 │ ╞═══════╪═════╡ │ red ┆ 2 │ │ green ┆ 1 │ │ blue ┆ 3 │ └───────┴─────┘ To add counts as a new column `pl.len()` can be used as a window function. \>>> df.with\_columns(pl.len().over("color")) shape: (6, 2) ┌───────┬─────┐ │ color ┆ len │ │ --- ┆ --- │ │ str ┆ u32 │ ╞═══════╪═════╡ │ red ┆ 2 │ │ blue ┆ 3 │ │ red ┆ 2 │ │ green ┆ 1 │ │ blue ┆ 3 │ │ blue ┆ 3 │ └───────┴─────┘ \>>> df.with\_columns((pl.len().over("color") / pl.len()).alias("fraction")) shape: (6, 2) ┌───────┬──────────┐ │ color ┆ fraction │ │ --- ┆ --- │ │ str ┆ f64 │ ╞═══════╪══════════╡ │ red ┆ 0.333333 │ │ blue ┆ 0.5 │ │ red ┆ 0.333333 │ │ green ┆ 0.166667 │ │ blue ┆ 0.5 │ │ blue ┆ 0.5 │ └───────┴──────────┘ var(_ddof: [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") \= 1_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L3091-L3115) Get variance. Parameters: **ddof** “Delta Degrees of Freedom”: the divisor used in the calculation is N - ddof, where N represents the number of elements. By default ddof is 1. Examples \>>> df \= pl.DataFrame({"a": \[\-1, 0, 1\]}) \>>> df.select(pl.col("a").var()) shape: (1, 1) ┌─────┐ │ a │ │ --- │ │ f64 │ ╞═════╡ │ 1.0 │ └─────┘ where(_predicate: Expr_) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L4558-L4597) Filter a single column. Deprecated since version 0.20.4: Use the [`filter()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.filter.html#polars.Expr.filter "polars.Expr.filter") method instead. Alias for [`filter()`](https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.filter.html#polars.Expr.filter "polars.Expr.filter") . Parameters: **predicate** Boolean expression. Examples \>>> df \= pl.DataFrame( ... { ... "group\_col": \["g1", "g1", "g2"\], ... "b": \[1, 2, 3\], ... } ... ) \>>> df.group\_by("group\_col").agg( ... \[\ ... pl.col("b").where(pl.col("b") < 2).sum().alias("lt"),\ ... pl.col("b").where(pl.col("b") \>= 2).sum().alias("gte"),\ ... \] ... ).sort("group\_col") shape: (2, 3) ┌───────────┬─────┬─────┐ │ group\_col ┆ lt ┆ gte │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═══════════╪═════╪═════╡ │ g1 ┆ 1 ┆ 2 │ │ g2 ┆ 0 ┆ 3 │ └───────────┴─────┴─────┘ xor(_other: [Any](https://docs.python.org/3/library/typing.html#typing.Any "(in Python v3.14)") _) → Expr[\[source\]](https://github.com/pola-rs/polars/blob/py-1.37.1/py-polars/src/polars/expr/expr.py#L6013-L6072) Method equivalent of bitwise exclusive-or operator `expr ^ other`. Parameters: **other** Integer or boolean value; accepts expression input. Examples \>>> df \= pl.DataFrame( ... {"x": \[True, False, True, False\], "y": \[True, True, False, False\]} ... ) \>>> df.with\_columns(pl.col("x").xor(pl.col("y")).alias("x ^ y")) shape: (4, 3) ┌───────┬───────┬───────┐ │ x ┆ y ┆ x ^ y │ │ --- ┆ --- ┆ --- │ │ bool ┆ bool ┆ bool │ ╞═══════╪═══════╪═══════╡ │ true ┆ true ┆ false │ │ false ┆ true ┆ true │ │ true ┆ false ┆ true │ │ false ┆ false ┆ false │ └───────┴───────┴───────┘ \>>> def binary\_string(n: int) \-> str: ... return bin(n)\[2:\].zfill(8) \>>> \>>> df \= pl.DataFrame( ... data\={"x": \[10, 8, 250, 66\], "y": \[1, 2, 3, 4\]}, ... schema\={"x": pl.UInt8, "y": pl.UInt8}, ... ) \>>> df.with\_columns( ... pl.col("x") ... .map\_elements(binary\_string, return\_dtype\=pl.String) ... .alias("bin\_x"), ... pl.col("y") ... .map\_elements(binary\_string, return\_dtype\=pl.String) ... .alias("bin\_y"), ... pl.col("x").xor(pl.col("y")).alias("xor\_xy"), ... pl.col("x") ... .xor(pl.col("y")) ... .map\_elements(binary\_string, return\_dtype\=pl.String) ... .alias("bin\_xor\_xy"), ... ) shape: (4, 6) ┌─────┬─────┬──────────┬──────────┬────────┬────────────┐ │ x ┆ y ┆ bin\_x ┆ bin\_y ┆ xor\_xy ┆ bin\_xor\_xy │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ u8 ┆ u8 ┆ str ┆ str ┆ u8 ┆ str │ ╞═════╪═════╪══════════╪══════════╪════════╪════════════╡ │ 10 ┆ 1 ┆ 00001010 ┆ 00000001 ┆ 11 ┆ 00001011 │ │ 8 ┆ 2 ┆ 00001000 ┆ 00000010 ┆ 10 ┆ 00001010 │ │ 250 ┆ 3 ┆ 11111010 ┆ 00000011 ┆ 249 ┆ 11111001 │ │ 66 ┆ 4 ┆ 01000010 ┆ 00000100 ┆ 70 ┆ 01000110 │ └─────┴─────┴──────────┴──────────┴────────┴────────────┘ --- # polars_lazy - Rust [Crate polars\_lazy](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html#) -------------------------------------------------------------------------------- Crate polars\_lazy Copy item path ================================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_lazy/lib.rs.html#1-214) Expand description Lazy API of Polars The lazy API of Polars supports a subset of the eager API. Apart from the distributed compute, it is very similar to [Apache Spark](https://spark.apache.org/) . You write queries in a domain specific language. These queries translate to a logical plan, which represent your query steps. Before execution this logical plan is optimized and may change the order of operations if this will increase performance. Or implicit type casts may be added such that execution of the query won’t lead to a type error (if it can be resolved). [§](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html#lazy-dsl) Lazy DSL ------------------------------------------------------------------------------- The lazy API of polars replaces the eager [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") with the [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") , through which the lazy API is exposed. The [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") represents a logical execution plan: a sequence of operations to perform on a concrete data source. These operations are not executed until we call [`collect`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.collect "method polars_lazy::frame::LazyFrame::collect") . This allows polars to optimize/reorder the query which may lead to faster queries or fewer type errors. In general, a [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") requires a concrete data source — a [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") , a file on disk, etc. — which polars-lazy then applies the user-specified sequence of operations to. To obtain a [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") from an existing [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") , we call the [`lazy`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/trait.IntoLazy.html#tymethod.lazy "method polars_lazy::frame::IntoLazy::lazy") method on the [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") . A [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") can also be obtained through the lazy versions of file readers, such as [`LazyCsvReader`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyCsvReader.html "struct polars_lazy::frame::LazyCsvReader") . The other major component of the polars lazy API is [`Expr`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html "enum polars_lazy::dsl::Expr") , which represents an operation to be performed on a [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") , such as mapping over a column, filtering, or groupby-aggregation. [`Expr`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html "enum polars_lazy::dsl::Expr") and the functions that produce them can be found in the [dsl module](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html "mod polars_lazy::dsl") . Most operations on a [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") consume the [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") and return a new [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") with the updated plan. If you need to use the same [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") multiple times, you should [`clone`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.clone "method polars_lazy::frame::LazyFrame::clone") it, and optionally [`cache`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.cache "method polars_lazy::frame::LazyFrame::cache") it beforehand. ### [§](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html#examples) Examples ##### [§](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html#adding-a-new-column-to-a-lazy-dataframe) Adding a new column to a lazy DataFrame #[macro_use] extern crate polars_core; use polars_core::prelude::*; use polars_lazy::prelude::*; let df = df! { "column_a" => &[1, 2, 3, 4, 5], "column_b" => &["a", "b", "c", "d", "e"] }.unwrap(); let new = df.lazy() // Note the reverse here!! .reverse() .with_column( // always rename a new column (col("column_a") * lit(10)).alias("new_column") ) .collect() .unwrap(); assert!(new.column("new_column") .unwrap() .equals( &Column::new("new_column".into(), &[50, 40, 30, 20, 10]) ) ); ##### [§](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html#modifying-a-column-based-on-some-predicate) Modifying a column based on some predicate #[macro_use] extern crate polars_core; use polars_core::prelude::*; use polars_lazy::prelude::*; let df = df! { "column_a" => &[1, 2, 3, 4, 5], "column_b" => &["a", "b", "c", "d", "e"] }.unwrap(); let new = df.lazy() .with_column( // value = 100 if x < 3 else x when( col("column_a").lt(lit(3)) ).then( lit(100) ).otherwise( col("column_a") ).alias("new_column") ) .collect() .unwrap(); assert!(new.column("new_column") .unwrap() .equals( &Column::new("new_column".into(), &[100, 100, 3, 4, 5]) ) ); ##### [§](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html#groupby--aggregations) Groupby + Aggregations use polars_core::prelude::*; use polars_core::df; use polars_lazy::prelude::*; fn example() -> PolarsResult { let df = df!( "date" => ["2020-08-21", "2020-08-21", "2020-08-22", "2020-08-23", "2020-08-22"], "temp" => [20, 10, 7, 9, 1], "rain" => [0.2, 0.1, 0.3, 0.1, 0.01] )?; df.lazy() .group_by([col("date")]) .agg([\ col("rain").min().alias("min_rain"),\ col("rain").sum().alias("sum_rain"),\ col("rain").quantile(lit(0.5), QuantileMethod::Nearest).alias("median_rain"),\ ]) .sort(["date"], Default::default()) .collect() } ##### [§](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html#calling-any-function) Calling any function Below we lazily call a custom closure of type `Series => Result`. Because the closure changes the type/variant of the Series we also define the return type. This is important because due to the laziness the types should be known beforehand. Note that by applying these custom functions you have access to the whole **eager API** of the Series/ChunkedArrays. #[macro_use] extern crate polars_core; use polars_core::prelude::*; use polars_lazy::prelude::*; let df = df! { "column_a" => &[1, 2, 3, 4, 5], "column_b" => &["a", "b", "c", "d", "e"] }.unwrap(); let new = df.lazy() .with_column( col("column_a") // apply a custom closure Series => Result .map( |_s| Ok(Column::new("".into(), &[6.0f32, 6.0, 6.0, 6.0, 6.0])), // return type of the closure |_, f| Ok(Field::new(f.name().clone(), DataType::Float64)) ).alias("new_column"), ) .collect() .unwrap(); ##### [§](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html#joins-filters-and-projections) Joins, filters and projections In the query below we do a lazy join and afterwards we filter rows based on the predicate `a < 2`. And last we select the columns `"b"` and `"c_first"`. In an eager API this query would be very suboptimal because we join on DataFrames with more columns and rows than needed. In this case the query optimizer will do the selection of the columns (projection) and the filtering of the rows (selection) before the join, thereby reducing the amount of work done by the query. fn example(df_a: DataFrame, df_b: DataFrame) -> LazyFrame { df_a.lazy() .left_join(df_b.lazy(), col("b_left"), col("b_right")) .filter( col("a").lt(lit(2)) ) .group_by([col("b")]) .agg( vec![col("b").first().alias("first_b"), col("c").first().alias("first_c")] ) .select(&[col("b"), col("c_first")]) } If we want to do an aggregation on all columns we can use the wildcard operator `*` to achieve this. fn aggregate_all_columns(df_a: DataFrame) -> LazyFrame { df_a.lazy() .group_by([col("b")]) .agg( vec![col("*").first()] ) } Modules[§](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html#modules) ----------------------------------------------------------------------------- [dsl](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html "mod polars_lazy::dsl") Domain specific language for the Lazy API. [frame](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/index.html "mod polars_lazy::frame") Lazy variant of a [DataFrame](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") . [prelude](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/index.html "mod polars_lazy::prelude") Macros[§](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html#macros) --------------------------------------------------------------------------- [fallible](https://docs.pola.rs/api/rust/dev/polars_lazy/macro.fallible.html "macro polars_lazy::fallible") Helper to delay a failing method until the query plan is collected --- # Metadata — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/stable/reference/metadata.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Metadata[#](https://docs.pola.rs/api/python/stable/reference/metadata.html#metadata "Link to this heading") ============================================================================================================ | | | | --- | --- | | [`build_info`](https://docs.pola.rs/api/python/stable/reference/api/polars.build_info.html#polars.build_info "polars.build_info")
() | Return detailed Polars build information. | | [`get_index_type`](https://docs.pola.rs/api/python/stable/reference/api/polars.get_index_type.html#polars.get_index_type "polars.get_index_type")
() | Return the data type used for Polars indexing. | | [`show_versions`](https://docs.pola.rs/api/python/stable/reference/api/polars.show_versions.html#polars.show_versions "polars.show_versions")
() | Print out the version of Polars and its optional dependencies. | | [`thread_pool_size`](https://docs.pola.rs/api/python/stable/reference/api/polars.thread_pool_size.html#polars.thread_pool_size "polars.thread_pool_size")
() | Return the number of threads in the Polars thread pool. | | [`threadpool_size`](https://docs.pola.rs/api/python/stable/reference/api/polars.threadpool_size.html#polars.threadpool_size "polars.threadpool_size")
() | Return the number of threads in the Polars thread pool. | --- # polars::chunked_array - Rust [Module chunked\_array](https://docs.pola.rs/api/rust/dev/polars/chunked_array/index.html#) -------------------------------------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Module chunked\_array Copy item path ==================================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_core/lib.rs.html#14) Expand description The typed heart of every Series column. Modules[§](https://docs.pola.rs/api/rust/dev/polars/chunked_array/index.html#modules) -------------------------------------------------------------------------------------- [arg\_min\_max](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arg_min_max/index.html "mod polars::chunked_array::arg_min_max") [arithmetic](https://docs.pola.rs/api/rust/dev/polars/chunked_array/arithmetic/index.html "mod polars::chunked_array::arithmetic") Implementations of arithmetic operations on ChunkedArrays. [builder](https://docs.pola.rs/api/rust/dev/polars/chunked_array/builder/index.html "mod polars::chunked_array::builder") [cast](https://docs.pola.rs/api/rust/dev/polars/chunked_array/cast/index.html "mod polars::chunked_array::cast") Implementations of the ChunkCast Trait. [collect](https://docs.pola.rs/api/rust/dev/polars/chunked_array/collect/index.html "mod polars::chunked_array::collect") Methods for collecting into a ChunkedArray. [comparison](https://docs.pola.rs/api/rust/dev/polars/chunked_array/comparison/index.html "mod polars::chunked_array::comparison") [flags](https://docs.pola.rs/api/rust/dev/polars/chunked_array/flags/index.html "mod polars::chunked_array::flags") [float](https://docs.pola.rs/api/rust/dev/polars/chunked_array/float/index.html "mod polars::chunked_array::float") [from\_iterator\_par](https://docs.pola.rs/api/rust/dev/polars/chunked_array/from_iterator_par/index.html "mod polars::chunked_array::from_iterator_par") Implementations of upstream traits for [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") [iterator](https://docs.pola.rs/api/rust/dev/polars/chunked_array/iterator/index.html "mod polars::chunked_array::iterator") [object](https://docs.pola.rs/api/rust/dev/polars/chunked_array/object/index.html "mod polars::chunked_array::object") `object` [ops](https://docs.pola.rs/api/rust/dev/polars/chunked_array/ops/index.html "mod polars::chunked_array::ops") Traits for miscellaneous operations on ChunkedArray [temporal](https://docs.pola.rs/api/rust/dev/polars/chunked_array/temporal/index.html "mod polars::chunked_array::temporal") `temporal` or `dtype-datetime` or `dtype-date` Traits and utilities for temporal data. Structs[§](https://docs.pola.rs/api/rust/dev/polars/chunked_array/index.html#structs) -------------------------------------------------------------------------------------- [ChunkedArray](https://docs.pola.rs/api/rust/dev/polars/chunked_array/struct.ChunkedArray.html "struct polars::chunked_array::ChunkedArray") ChunkedArray Enums[§](https://docs.pola.rs/api/rust/dev/polars/chunked_array/index.html#enums) ---------------------------------------------------------------------------------- [ChunkedArrayLayout](https://docs.pola.rs/api/rust/dev/polars/chunked_array/enum.ChunkedArrayLayout.html "enum polars::chunked_array::ChunkedArrayLayout") Type Aliases[§](https://docs.pola.rs/api/rust/dev/polars/chunked_array/index.html#types) ----------------------------------------------------------------------------------------- [ChunkLenIter](https://docs.pola.rs/api/rust/dev/polars/chunked_array/type.ChunkLenIter.html "type polars::chunked_array::ChunkLenIter") [StructChunked](https://docs.pola.rs/api/rust/dev/polars/chunked_array/type.StructChunked.html "type polars::chunked_array::StructChunked") --- # polars_time - Rust [Crate polars\_time](https://docs.pola.rs/api/rust/dev/polars_time/index.html#) -------------------------------------------------------------------------------- Crate polars\_time Copy item path ================================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/lib.rs.html#1-55) Modules[§](https://docs.pola.rs/api/rust/dev/polars_time/index.html#modules) ----------------------------------------------------------------------------- [chunkedarray](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/index.html "mod polars_time::chunkedarray") Traits and utilities for temporal data. [prelude](https://docs.pola.rs/api/rust/dev/polars_time/prelude/index.html "mod polars_time::prelude") [series](https://docs.pola.rs/api/rust/dev/polars_time/series/index.html "mod polars_time::series") Structs[§](https://docs.pola.rs/api/rust/dev/polars_time/index.html#structs) ----------------------------------------------------------------------------- [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") Represents a window in time Enums[§](https://docs.pola.rs/api/rust/dev/polars_time/index.html#enums) ------------------------------------------------------------------------- [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") Traits[§](https://docs.pola.rs/api/rust/dev/polars_time/index.html#traits) --------------------------------------------------------------------------- [PolarsRound](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html "trait polars_time::PolarsRound") [PolarsUpsample](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html "trait polars_time::PolarsUpsample") --- # polars_io - Rust [Crate polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html#) ---------------------------------------------------------------------------- Crate polars\_io Copy item path =============================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/lib.rs.html#1-68) Re-exports[§](https://docs.pola.rs/api/rust/dev/polars_io/index.html#reexports) -------------------------------------------------------------------------------- `pub use cloud::[glob](https://docs.pola.rs/api/rust/dev/polars_io/cloud/fn.glob.html "fn polars_io::cloud::glob") as async_glob;``cloud` `pub use [path_utils](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/index.html "mod polars_io::path_utils") ::*;` Modules[§](https://docs.pola.rs/api/rust/dev/polars_io/index.html#modules) --------------------------------------------------------------------------- [avro](https://docs.pola.rs/api/rust/dev/polars_io/avro/index.html "mod polars_io::avro") `avro` [catalog](https://docs.pola.rs/api/rust/dev/polars_io/catalog/index.html "mod polars_io::catalog") `catalog` [cloud](https://docs.pola.rs/api/rust/dev/polars_io/cloud/index.html "mod polars_io::cloud") Interface with cloud storage through the object\_store crate. [csv](https://docs.pola.rs/api/rust/dev/polars_io/csv/index.html "mod polars_io::csv") `csv` or `json` Functionality for reading and writing CSV files. [file\_cache](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/index.html "mod polars_io::file_cache") `file_cache` [hive](https://docs.pola.rs/api/rust/dev/polars_io/hive/index.html "mod polars_io::hive") [ipc](https://docs.pola.rs/api/rust/dev/polars_io/ipc/index.html "mod polars_io::ipc") `ipc` or `ipc_streaming` [json](https://docs.pola.rs/api/rust/dev/polars_io/json/index.html "mod polars_io::json") `json` (De)serialize JSON files. [mmap](https://docs.pola.rs/api/rust/dev/polars_io/mmap/index.html "mod polars_io::mmap") [ndjson](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/index.html "mod polars_io::ndjson") `json` [parquet](https://docs.pola.rs/api/rust/dev/polars_io/parquet/index.html "mod polars_io::parquet") `parquet` Functionality for reading and writing Apache Parquet files. [path\_utils](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/index.html "mod polars_io::path_utils") [pl\_async](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/index.html "mod polars_io::pl_async") `async` [predicates](https://docs.pola.rs/api/rust/dev/polars_io/predicates/index.html "mod polars_io::predicates") [prelude](https://docs.pola.rs/api/rust/dev/polars_io/prelude/index.html "mod polars_io::prelude") [scan\_lines](https://docs.pola.rs/api/rust/dev/polars_io/scan_lines/index.html "mod polars_io::scan_lines") `scan_lines` [utils](https://docs.pola.rs/api/rust/dev/polars_io/utils/index.html "mod polars_io::utils") Macros[§](https://docs.pola.rs/api/rust/dev/polars_io/index.html#macros) ------------------------------------------------------------------------- [impl\_page\_walk](https://docs.pola.rs/api/rust/dev/polars_io/macro.impl_page_walk.html "macro polars_io::impl_page_walk") Support for traversing paginated response values that look like: Structs[§](https://docs.pola.rs/api/rust/dev/polars_io/index.html#structs) --------------------------------------------------------------------------- [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") Options for Hive partitioning. [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") Traits[§](https://docs.pola.rs/api/rust/dev/polars_io/index.html#traits) ------------------------------------------------------------------------- [ArrowReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html "trait polars_io::ArrowReader") [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html "trait polars_io::SerReader") [SerWriter](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html "trait polars_io::SerWriter") Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/index.html#functions) ------------------------------------------------------------------------------- [get\_upload\_chunk\_size](https://docs.pola.rs/api/rust/dev/polars_io/fn.get_upload_chunk_size.html "fn polars_io::get_upload_chunk_size") [schema\_to\_arrow\_checked](https://docs.pola.rs/api/rust/dev/polars_io/fn.schema_to_arrow_checked.html "fn polars_io::schema_to_arrow_checked") --- # polars::datatypes - Rust [Module datatypes](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html#) ----------------------------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Module datatypes Copy item path =============================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_core/lib.rs.html#16) Expand description [§](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html#data-types-supported-by-polars) Data types supported by Polars. --------------------------------------------------------------------------------------------------------------------------------- At the moment Polars doesn’t include all data types available by Arrow. The goal is to incrementally support more data types and prioritize these by usability. [See the AnyValue variants](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.AnyValue.html#variants) for the data types that are currently supported. Modules[§](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html#modules) ---------------------------------------------------------------------------------- [categorical](https://docs.pola.rs/api/rust/dev/polars/datatypes/categorical/index.html "mod polars::datatypes::categorical") `dtype-categorical` [time\_unit](https://docs.pola.rs/api/rust/dev/polars/datatypes/time_unit/index.html "mod polars::datatypes::time_unit") [time\_zone](https://docs.pola.rs/api/rust/dev/polars/datatypes/time_zone/index.html "mod polars::datatypes::time_zone") Structs[§](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html#structs) ---------------------------------------------------------------------------------- [BinaryOffsetType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.BinaryOffsetType.html "struct polars::datatypes::BinaryOffsetType") [BinaryType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.BinaryType.html "struct polars::datatypes::BinaryType") [BooleanType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.BooleanType.html "struct polars::datatypes::BooleanType") [Categorical8Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Categorical8Type.html "struct polars::datatypes::Categorical8Type") [Categorical16Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Categorical16Type.html "struct polars::datatypes::Categorical16Type") [Categorical32Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Categorical32Type.html "struct polars::datatypes::Categorical32Type") [CategoricalMapping](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.CategoricalMapping.html "struct polars::datatypes::CategoricalMapping") [CategoricalType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.CategoricalType.html "struct polars::datatypes::CategoricalType") [Categories](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Categories.html "struct polars::datatypes::Categories") A (named) object which is used to indicate which categorical data types have the same mapping. [CompatLevel](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.CompatLevel.html "struct polars::datatypes::CompatLevel") [DateType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.DateType.html "struct polars::datatypes::DateType") [DatetimeType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.DatetimeType.html "struct polars::datatypes::DatetimeType") [DecimalType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.DecimalType.html "struct polars::datatypes::DecimalType") [Dimension](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Dimension.html "struct polars::datatypes::Dimension") [DurationType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.DurationType.html "struct polars::datatypes::DurationType") [FalseT](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.FalseT.html "struct polars::datatypes::FalseT") [Field](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Field.html "struct polars::datatypes::Field") Characterizes the name and the [`DataType`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataType.html "enum polars::prelude::DataType") of a column. [FixedSizeListType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.FixedSizeListType.html "struct polars::datatypes::FixedSizeListType") `dtype-array` [Float16Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Float16Type.html "struct polars::datatypes::Float16Type") [Float32Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Float32Type.html "struct polars::datatypes::Float32Type") [Float64Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Float64Type.html "struct polars::datatypes::Float64Type") [FrozenCategories](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.FrozenCategories.html "struct polars::datatypes::FrozenCategories") An ordered collection of unique strings with an associated pre-computed mapping to go from string <-> index. [Int8Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Int8Type.html "struct polars::datatypes::Int8Type") [Int16Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Int16Type.html "struct polars::datatypes::Int16Type") [Int32Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Int32Type.html "struct polars::datatypes::Int32Type") [Int64Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Int64Type.html "struct polars::datatypes::Int64Type") [Int128Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Int128Type.html "struct polars::datatypes::Int128Type") [ListType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.ListType.html "struct polars::datatypes::ListType") [Logical](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.Logical.html "struct polars::datatypes::Logical") Maps a logical type to a chunked array implementation of the physical type. This saves a lot of compiler bloat and allows us to reuse functionality. [ObjectType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.ObjectType.html "struct polars::datatypes::ObjectType") `object` [OwnedObject](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.OwnedObject.html "struct polars::datatypes::OwnedObject") `object` [PlSmallStr](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.PlSmallStr.html "struct polars::datatypes::PlSmallStr") String type that inlines small strings. [StringType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.StringType.html "struct polars::datatypes::StringType") [StructType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.StructType.html "struct polars::datatypes::StructType") `dtype-struct` [TimeType](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.TimeType.html "struct polars::datatypes::TimeType") [TimeZone](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.TimeZone.html "struct polars::datatypes::TimeZone") [TrueT](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.TrueT.html "struct polars::datatypes::TrueT") [UInt8Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.UInt8Type.html "struct polars::datatypes::UInt8Type") [UInt16Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.UInt16Type.html "struct polars::datatypes::UInt16Type") [UInt32Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.UInt32Type.html "struct polars::datatypes::UInt32Type") [UInt64Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.UInt64Type.html "struct polars::datatypes::UInt64Type") [UInt128Type](https://docs.pola.rs/api/rust/dev/polars/datatypes/struct.UInt128Type.html "struct polars::datatypes::UInt128Type") Enums[§](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html#enums) ------------------------------------------------------------------------------ [AnyValue](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.AnyValue.html "enum polars::datatypes::AnyValue") [ArrowDataType](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.ArrowDataType.html "enum polars::datatypes::ArrowDataType") The set of supported logical types in this crate. [ArrowTimeUnit](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.ArrowTimeUnit.html "enum polars::datatypes::ArrowTimeUnit") The time units defined in Arrow. [CategoricalPhysical](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.CategoricalPhysical.html "enum polars::datatypes::CategoricalPhysical") The physical datatype backing a categorical / enum. [DataType](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.DataType.html "enum polars::datatypes::DataType") [ReshapeDimension](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.ReshapeDimension.html "enum polars::datatypes::ReshapeDimension") A dimension in a reshape. [TimeUnit](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.TimeUnit.html "enum polars::datatypes::TimeUnit") [UnknownKind](https://docs.pola.rs/api/rust/dev/polars/datatypes/enum.UnknownKind.html "enum polars::datatypes::UnknownKind") Constants[§](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html#constants) -------------------------------------------------------------------------------------- [IDX\_DTYPE](https://docs.pola.rs/api/rust/dev/polars/datatypes/constant.IDX_DTYPE.html "constant polars::datatypes::IDX_DTYPE") Statics[§](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html#statics) ---------------------------------------------------------------------------------- [POLARS\_OBJECT\_EXTENSION\_NAME](https://docs.pola.rs/api/rust/dev/polars/datatypes/static.POLARS_OBJECT_EXTENSION_NAME.html "static polars::datatypes::POLARS_OBJECT_EXTENSION_NAME") Traits[§](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html#traits) -------------------------------------------------------------------------------- [ArrayCollectIterExt](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.ArrayCollectIterExt.html "trait polars::datatypes::ArrayCollectIterExt") [ArrayFromIter](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.ArrayFromIter.html "trait polars::datatypes::ArrayFromIter") [ArrayFromIterDtype](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.ArrayFromIterDtype.html "trait polars::datatypes::ArrayFromIterDtype") [AsRefDataType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.AsRefDataType.html "trait polars::datatypes::AsRefDataType") [CatNative](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.CatNative.html "trait polars::datatypes::CatNative") [CategoricalPhysicalDtypeExt](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.CategoricalPhysicalDtypeExt.html "trait polars::datatypes::CategoricalPhysicalDtypeExt") [GetAnyValue](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.GetAnyValue.html "trait polars::datatypes::GetAnyValue") [InitHashMaps](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.InitHashMaps.html "trait polars::datatypes::InitHashMaps") [InitHashMaps2](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.InitHashMaps2.html "trait polars::datatypes::InitHashMaps2") [IntoMetadata](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.IntoMetadata.html "trait polars::datatypes::IntoMetadata") [IntoScalar](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.IntoScalar.html "trait polars::datatypes::IntoScalar") [LogicalType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.LogicalType.html "trait polars::datatypes::LogicalType") [MetaDataExt](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.MetaDataExt.html "trait polars::datatypes::MetaDataExt") [NumericNative](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.NumericNative.html "trait polars::datatypes::NumericNative") [PolarsCategoricalType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsCategoricalType.html "trait polars::datatypes::PolarsCategoricalType") `dtype-categorical` Safety [PolarsDataType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsDataType.html "trait polars::datatypes::PolarsDataType") Safety [PolarsFloatType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsFloatType.html "trait polars::datatypes::PolarsFloatType") [PolarsIntegerType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsIntegerType.html "trait polars::datatypes::PolarsIntegerType") [PolarsNumericType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsNumericType.html "trait polars::datatypes::PolarsNumericType") [PolarsPhysicalType](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.PolarsPhysicalType.html "trait polars::datatypes::PolarsPhysicalType") [SchemaExtPl](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.SchemaExtPl.html "trait polars::datatypes::SchemaExtPl") [StaticArray](https://docs.pola.rs/api/rust/dev/polars/datatypes/trait.StaticArray.html "trait polars::datatypes::StaticArray") Functions[§](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html#functions) -------------------------------------------------------------------------------------- [ensure\_same\_categories](https://docs.pola.rs/api/rust/dev/polars/datatypes/fn.ensure_same_categories.html "fn polars::datatypes::ensure_same_categories") [ensure\_same\_frozen\_categories](https://docs.pola.rs/api/rust/dev/polars/datatypes/fn.ensure_same_frozen_categories.html "fn polars::datatypes::ensure_same_frozen_categories") [merge\_dtypes](https://docs.pola.rs/api/rust/dev/polars/datatypes/fn.merge_dtypes.html "fn polars::datatypes::merge_dtypes") [unpack\_dtypes](https://docs.pola.rs/api/rust/dev/polars/datatypes/fn.unpack_dtypes.html "fn polars::datatypes::unpack_dtypes") Type Aliases[§](https://docs.pola.rs/api/rust/dev/polars/datatypes/index.html#types) ------------------------------------------------------------------------------------- [ArrayChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.ArrayChunked.html "type polars::datatypes::ArrayChunked") `dtype-array` [BinaryChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.BinaryChunked.html "type polars::datatypes::BinaryChunked") [BinaryOffsetChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.BinaryOffsetChunked.html "type polars::datatypes::BinaryOffsetChunked") [BooleanChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.BooleanChunked.html "type polars::datatypes::BooleanChunked") [CatSize](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.CatSize.html "type polars::datatypes::CatSize") [Categorical8Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Categorical8Chunked.html "type polars::datatypes::Categorical8Chunked") [Categorical16Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Categorical16Chunked.html "type polars::datatypes::Categorical16Chunked") [Categorical32Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Categorical32Chunked.html "type polars::datatypes::Categorical32Chunked") [CategoricalChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.CategoricalChunked.html "type polars::datatypes::CategoricalChunked") [DateChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.DateChunked.html "type polars::datatypes::DateChunked") [DatetimeChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.DatetimeChunked.html "type polars::datatypes::DatetimeChunked") [DecimalChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.DecimalChunked.html "type polars::datatypes::DecimalChunked") [DurationChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.DurationChunked.html "type polars::datatypes::DurationChunked") [FieldRef](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.FieldRef.html "type polars::datatypes::FieldRef") [Float16Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Float16Chunked.html "type polars::datatypes::Float16Chunked") `dtype-f16` [Float32Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Float32Chunked.html "type polars::datatypes::Float32Chunked") [Float64Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Float64Chunked.html "type polars::datatypes::Float64Chunked") [IdxArr](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.IdxArr.html "type polars::datatypes::IdxArr") [IdxCa](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.IdxCa.html "type polars::datatypes::IdxCa") Non-`bigidx` [IdxType](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.IdxType.html "type polars::datatypes::IdxType") Non-`bigidx` [Int8Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Int8Chunked.html "type polars::datatypes::Int8Chunked") [Int16Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Int16Chunked.html "type polars::datatypes::Int16Chunked") [Int32Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Int32Chunked.html "type polars::datatypes::Int32Chunked") [Int64Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Int64Chunked.html "type polars::datatypes::Int64Chunked") [Int128Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.Int128Chunked.html "type polars::datatypes::Int128Chunked") `dtype-i128` [ListChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.ListChunked.html "type polars::datatypes::ListChunked") [ObjectChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.ObjectChunked.html "type polars::datatypes::ObjectChunked") `object` [PlHashMap](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlHashMap.html "type polars::datatypes::PlHashMap") [PlHashSet](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlHashSet.html "type polars::datatypes::PlHashSet") [PlIdHashMap](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlIdHashMap.html "type polars::datatypes::PlIdHashMap") This hashmap uses an IdHasher [PlIndexMap](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlIndexMap.html "type polars::datatypes::PlIndexMap") [PlIndexSet](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlIndexSet.html "type polars::datatypes::PlIndexSet") [PlRandomState](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.PlRandomState.html "type polars::datatypes::PlRandomState") [StringChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.StringChunked.html "type polars::datatypes::StringChunked") [TimeChunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.TimeChunked.html "type polars::datatypes::TimeChunked") [UInt8Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.UInt8Chunked.html "type polars::datatypes::UInt8Chunked") [UInt16Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.UInt16Chunked.html "type polars::datatypes::UInt16Chunked") [UInt32Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.UInt32Chunked.html "type polars::datatypes::UInt32Chunked") [UInt64Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.UInt64Chunked.html "type polars::datatypes::UInt64Chunked") [UInt128Chunked](https://docs.pola.rs/api/rust/dev/polars/datatypes/type.UInt128Chunked.html "type polars::datatypes::UInt128Chunked") `dtype-u128` --- # polars::docs - Rust [Module docs](https://docs.pola.rs/api/rust/dev/polars/docs/index.html#) ------------------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Module docs Copy item path ========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars/docs/mod.rs.html#1-2) Modules[§](https://docs.pola.rs/api/rust/dev/polars/docs/index.html#modules) ----------------------------------------------------------------------------- [eager](https://docs.pola.rs/api/rust/dev/polars/docs/eager/index.html "mod polars::docs::eager") Polars Eager cookbook [lazy](https://docs.pola.rs/api/rust/dev/polars/docs/lazy/index.html "mod polars::docs::lazy") Polars Lazy cookbook --- # polars::error - Rust [Module error](https://docs.pola.rs/api/rust/dev/polars/error/index.html#) --------------------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Module error Copy item path =========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_core/lib.rs.html#17) Modules[§](https://docs.pola.rs/api/rust/dev/polars/error/index.html#modules) ------------------------------------------------------------------------------ [constants](https://docs.pola.rs/api/rust/dev/polars/error/constants/index.html "mod polars::error::constants") Constant that help with creating error messages dependent on the host language. [signals](https://docs.pola.rs/api/rust/dev/polars/error/signals/index.html "mod polars::error::signals") Macros[§](https://docs.pola.rs/api/rust/dev/polars/error/index.html#macros) ---------------------------------------------------------------------------- [feature\_gated](https://docs.pola.rs/api/rust/dev/polars/error/macro.feature_gated.html "macro polars::error::feature_gated") [polars\_bail](https://docs.pola.rs/api/rust/dev/polars/error/macro.polars_bail.html "macro polars::error::polars_bail") [polars\_ensure](https://docs.pola.rs/api/rust/dev/polars/error/macro.polars_ensure.html "macro polars::error::polars_ensure") [polars\_err](https://docs.pola.rs/api/rust/dev/polars/error/macro.polars_err.html "macro polars::error::polars_err") [polars\_warn](https://docs.pola.rs/api/rust/dev/polars/error/macro.polars_warn.html "macro polars::error::polars_warn") Structs[§](https://docs.pola.rs/api/rust/dev/polars/error/index.html#structs) ------------------------------------------------------------------------------ [ErrString](https://docs.pola.rs/api/rust/dev/polars/error/struct.ErrString.html "struct polars::error::ErrString") Enums[§](https://docs.pola.rs/api/rust/dev/polars/error/index.html#enums) -------------------------------------------------------------------------- [PolarsError](https://docs.pola.rs/api/rust/dev/polars/error/enum.PolarsError.html "enum polars::error::PolarsError") [PolarsWarning](https://docs.pola.rs/api/rust/dev/polars/error/enum.PolarsWarning.html "enum polars::error::PolarsWarning") Functions[§](https://docs.pola.rs/api/rust/dev/polars/error/index.html#functions) ---------------------------------------------------------------------------------- [get\_warning\_function](https://docs.pola.rs/api/rust/dev/polars/error/fn.get_warning_function.html "fn polars::error::get_warning_function") [map\_err](https://docs.pola.rs/api/rust/dev/polars/error/fn.map_err.html "fn polars::error::map_err") [set\_warning\_function](https://docs.pola.rs/api/rust/dev/polars/error/fn.set_warning_function.html "fn polars::error::set_warning_function") Set the function that will be called by the `polars_warn!` macro. You can use this to set logging in polars. [to\_compute\_err](https://docs.pola.rs/api/rust/dev/polars/error/fn.to_compute_err.html "fn polars::error::to_compute_err") Type Aliases[§](https://docs.pola.rs/api/rust/dev/polars/error/index.html#types) --------------------------------------------------------------------------------- [PolarsResult](https://docs.pola.rs/api/rust/dev/polars/error/type.PolarsResult.html "type polars::error::PolarsResult") --- # polars::frame - Rust [Module frame](https://docs.pola.rs/api/rust/dev/polars/frame/index.html#) --------------------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Module frame Copy item path =========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_core/lib.rs.html#19) Expand description DataFrame module. Modules[§](https://docs.pola.rs/api/rust/dev/polars/frame/index.html#modules) ------------------------------------------------------------------------------ [builder](https://docs.pola.rs/api/rust/dev/polars/frame/builder/index.html "mod polars::frame::builder") [column](https://docs.pola.rs/api/rust/dev/polars/frame/column/index.html "mod polars::frame::column") [explode](https://docs.pola.rs/api/rust/dev/polars/frame/explode/index.html "mod polars::frame::explode") [group\_by](https://docs.pola.rs/api/rust/dev/polars/frame/group_by/index.html "mod polars::frame::group_by") `algorithm_group_by` [row](https://docs.pola.rs/api/rust/dev/polars/frame/row/index.html "mod polars::frame::row") `rows` or `object` Structs[§](https://docs.pola.rs/api/rust/dev/polars/frame/index.html#structs) ------------------------------------------------------------------------------ [DataFrame](https://docs.pola.rs/api/rust/dev/polars/frame/struct.DataFrame.html "struct polars::frame::DataFrame") A contiguous growable collection of [`Column`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Column.html "enum polars::prelude::Column") s that have the same length. [PhysRecordBatchIter](https://docs.pola.rs/api/rust/dev/polars/frame/struct.PhysRecordBatchIter.html "struct polars::frame::PhysRecordBatchIter") [RecordBatchIter](https://docs.pola.rs/api/rust/dev/polars/frame/struct.RecordBatchIter.html "struct polars::frame::RecordBatchIter") Enums[§](https://docs.pola.rs/api/rust/dev/polars/frame/index.html#enums) -------------------------------------------------------------------------- [RecordBatchIterWrap](https://docs.pola.rs/api/rust/dev/polars/frame/enum.RecordBatchIterWrap.html "enum polars::frame::RecordBatchIterWrap") [UniqueKeepStrategy](https://docs.pola.rs/api/rust/dev/polars/frame/enum.UniqueKeepStrategy.html "enum polars::frame::UniqueKeepStrategy") Functions[§](https://docs.pola.rs/api/rust/dev/polars/frame/index.html#functions) ---------------------------------------------------------------------------------- [chunk\_df\_for\_writing](https://docs.pola.rs/api/rust/dev/polars/frame/fn.chunk_df_for_writing.html "fn polars::frame::chunk_df_for_writing") Split DataFrame into chunks in preparation for writing. The chunks have a maximum number of rows per chunk to ensure reasonable memory efficiency when reading the resulting file, and a minimum size per chunk to ensure reasonable performance when writing. --- # polars::functions - Rust [Module functions](https://docs.pola.rs/api/rust/dev/polars/functions/index.html#) ----------------------------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Module functions Copy item path =============================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_core/lib.rs.html#20) Expand description [§](https://docs.pola.rs/api/rust/dev/polars/functions/index.html#functions) Functions -------------------------------------------------------------------------------------- Functions that might be useful. Functions[§](https://docs.pola.rs/api/rust/dev/polars/functions/index.html#functions-1) ---------------------------------------------------------------------------------------- [concat\_df\_diagonal](https://docs.pola.rs/api/rust/dev/polars/functions/fn.concat_df_diagonal.html "fn polars::functions::concat_df_diagonal") `diagonal_concat` Concat [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") s diagonally. Concat diagonally thereby combining different schemas. [concat\_df\_horizontal](https://docs.pola.rs/api/rust/dev/polars/functions/fn.concat_df_horizontal.html "fn polars::functions::concat_df_horizontal") Concat [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") s horizontally. --- # polars::series - Rust [Module series](https://docs.pola.rs/api/rust/dev/polars/series/index.html#) ----------------------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Module series Copy item path ============================ [Source](https://docs.pola.rs/api/rust/dev/src/polars_core/lib.rs.html#30) Expand description Type agnostic columnar data structure. Modules[§](https://docs.pola.rs/api/rust/dev/polars/series/index.html#modules) ------------------------------------------------------------------------------- [amortized\_iter](https://docs.pola.rs/api/rust/dev/polars/series/amortized_iter/index.html "mod polars::series::amortized_iter") [arithmetic](https://docs.pola.rs/api/rust/dev/polars/series/arithmetic/index.html "mod polars::series::arithmetic") [builder](https://docs.pola.rs/api/rust/dev/polars/series/builder/index.html "mod polars::series::builder") [categorical\_to\_arrow](https://docs.pola.rs/api/rust/dev/polars/series/categorical_to_arrow/index.html "mod polars::series::categorical_to_arrow") `dtype-categorical` [implementations](https://docs.pola.rs/api/rust/dev/polars/series/implementations/index.html "mod polars::series::implementations") [ops](https://docs.pola.rs/api/rust/dev/polars/series/ops/index.html "mod polars::series::ops") Structs[§](https://docs.pola.rs/api/rust/dev/polars/series/index.html#structs) ------------------------------------------------------------------------------- [Series](https://docs.pola.rs/api/rust/dev/polars/series/struct.Series.html "struct polars::series::Series") Series [SeriesIter](https://docs.pola.rs/api/rust/dev/polars/series/struct.SeriesIter.html "struct polars::series::SeriesIter") [ToArrowConverter](https://docs.pola.rs/api/rust/dev/polars/series/struct.ToArrowConverter.html "struct polars::series::ToArrowConverter") Enums[§](https://docs.pola.rs/api/rust/dev/polars/series/index.html#enums) --------------------------------------------------------------------------- [BitRepr](https://docs.pola.rs/api/rust/dev/polars/series/enum.BitRepr.html "enum polars::series::BitRepr") [IsSorted](https://docs.pola.rs/api/rust/dev/polars/series/enum.IsSorted.html "enum polars::series::IsSorted") Traits[§](https://docs.pola.rs/api/rust/dev/polars/series/index.html#traits) ----------------------------------------------------------------------------- [ChunkCompareEq](https://docs.pola.rs/api/rust/dev/polars/series/trait.ChunkCompareEq.html "trait polars::series::ChunkCompareEq") Compare [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") and [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") ’s and get a `boolean` mask that can be used to filter rows. [IntoSeries](https://docs.pola.rs/api/rust/dev/polars/series/trait.IntoSeries.html "trait polars::series::IntoSeries") Used to convert a [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") , `&dyn SeriesTrait` and [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") into a [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . [SeriesTrait](https://docs.pola.rs/api/rust/dev/polars/series/trait.SeriesTrait.html "trait polars::series::SeriesTrait") Type Aliases[§](https://docs.pola.rs/api/rust/dev/polars/series/index.html#types) ---------------------------------------------------------------------------------- [SeriesPhysIter](https://docs.pola.rs/api/rust/dev/polars/series/type.SeriesPhysIter.html "type polars::series::SeriesPhysIter") --- # polars::prelude - Rust [Module prelude](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html#) ------------------------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Module prelude Copy item path ============================= [Source](https://docs.pola.rs/api/rust/dev/src/polars/prelude.rs.html#1-12) Modules[§](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html#modules) -------------------------------------------------------------------------------- [\_csv\_read\_internal](https://docs.pola.rs/api/rust/dev/polars/prelude/_csv_read_internal/index.html "mod polars::prelude::_csv_read_internal") `polars-io` [\_internal](https://docs.pola.rs/api/rust/dev/polars/prelude/_internal/index.html "mod polars::prelude::_internal") `polars-io` [aggregations](https://docs.pola.rs/api/rust/dev/polars/prelude/aggregations/index.html "mod polars::prelude::aggregations") [anonymous](https://docs.pola.rs/api/rust/dev/polars/prelude/anonymous/index.html "mod polars::prelude::anonymous") `lazy` [arg\_min\_max](https://docs.pola.rs/api/rust/dev/polars/prelude/arg_min_max/index.html "mod polars::prelude::arg_min_max") `polars-ops` [arity](https://docs.pola.rs/api/rust/dev/polars/prelude/arity/index.html "mod polars::prelude::arity") [array](https://docs.pola.rs/api/rust/dev/polars/prelude/array/index.html "mod polars::prelude::array") `polars-ops` and `dtype-array` [binary](https://docs.pola.rs/api/rust/dev/polars/prelude/binary/index.html "mod polars::prelude::binary") `lazy` [buffer](https://docs.pola.rs/api/rust/dev/polars/prelude/buffer/index.html "mod polars::prelude::buffer") `polars-io` [byte\_source](https://docs.pola.rs/api/rust/dev/polars/prelude/byte_source/index.html "mod polars::prelude::byte_source") `polars-io` and `cloud` [cat](https://docs.pola.rs/api/rust/dev/polars/prelude/cat/index.html "mod polars::prelude::cat") `lazy` and `dtype-categorical` [chunkedarray](https://docs.pola.rs/api/rust/dev/polars/prelude/chunkedarray/index.html "mod polars::prelude::chunkedarray") `temporal` Traits and utilities for temporal data. [cloud](https://docs.pola.rs/api/rust/dev/polars/prelude/cloud/index.html "mod polars::prelude::cloud") `polars-io` Interface with cloud storage through the object\_store crate. [compression](https://docs.pola.rs/api/rust/dev/polars/prelude/compression/index.html "mod polars::prelude::compression") `polars-io` [concat\_arr](https://docs.pola.rs/api/rust/dev/polars/prelude/concat_arr/index.html "mod polars::prelude::concat_arr") `polars-ops` and `dtype-array` [datatypes](https://docs.pola.rs/api/rust/dev/polars/prelude/datatypes/index.html "mod polars::prelude::datatypes") Data types supported by Polars. [datetime](https://docs.pola.rs/api/rust/dev/polars/prelude/datetime/index.html "mod polars::prelude::datetime") `polars-ops` and `timezones` [default\_arrays](https://docs.pola.rs/api/rust/dev/polars/prelude/default_arrays/index.html "mod polars::prelude::default_arrays") [default\_values](https://docs.pola.rs/api/rust/dev/polars/prelude/default_values/index.html "mod polars::prelude::default_values") `lazy` [deletion](https://docs.pola.rs/api/rust/dev/polars/prelude/deletion/index.html "mod polars::prelude::deletion") `lazy` [dt](https://docs.pola.rs/api/rust/dev/polars/prelude/dt/index.html "mod polars::prelude::dt") `lazy` and `temporal` [expr](https://docs.pola.rs/api/rust/dev/polars/prelude/expr/index.html "mod polars::prelude::expr") [file](https://docs.pola.rs/api/rust/dev/polars/prelude/file/index.html "mod polars::prelude::file") `polars-io` [file\_provider](https://docs.pola.rs/api/rust/dev/polars/prelude/file_provider/index.html "mod polars::prelude::file_provider") `lazy` [fill\_null](https://docs.pola.rs/api/rust/dev/polars/prelude/fill_null/index.html "mod polars::prelude::fill_null") [fixed\_size\_list](https://docs.pola.rs/api/rust/dev/polars/prelude/fixed_size_list/index.html "mod polars::prelude::fixed_size_list") `dtype-array` [float\_sorted\_arg\_max](https://docs.pola.rs/api/rust/dev/polars/prelude/float_sorted_arg_max/index.html "mod polars::prelude::float_sorted_arg_max") [full](https://docs.pola.rs/api/rust/dev/polars/prelude/full/index.html "mod polars::prelude::full") [function\_expr](https://docs.pola.rs/api/rust/dev/polars/prelude/function_expr/index.html "mod polars::prelude::function_expr") `lazy` [gather](https://docs.pola.rs/api/rust/dev/polars/prelude/gather/index.html "mod polars::prelude::gather") [iceberg](https://docs.pola.rs/api/rust/dev/polars/prelude/iceberg/index.html "mod polars::prelude::iceberg") TODO [interpolate](https://docs.pola.rs/api/rust/dev/polars/prelude/interpolate/index.html "mod polars::prelude::interpolate") `polars-ops` and `interpolate` [interpolate\_by](https://docs.pola.rs/api/rust/dev/polars/prelude/interpolate_by/index.html "mod polars::prelude::interpolate_by") `polars-ops` and `interpolate_by` [merge\_join](https://docs.pola.rs/api/rust/dev/polars/prelude/merge_join/index.html "mod polars::prelude::merge_join") `polars-ops` [mkdir](https://docs.pola.rs/api/rust/dev/polars/prelude/mkdir/index.html "mod polars::prelude::mkdir") `polars-io` [mode](https://docs.pola.rs/api/rust/dev/polars/prelude/mode/index.html "mod polars::prelude::mode") `polars-ops` and `mode` [nan\_propagating\_aggregate](https://docs.pola.rs/api/rust/dev/polars/prelude/nan_propagating_aggregate/index.html "mod polars::prelude::nan_propagating_aggregate") `polars-ops` and `propagate_nans` [null](https://docs.pola.rs/api/rust/dev/polars/prelude/null/index.html "mod polars::prelude::null") [peaks](https://docs.pola.rs/api/rust/dev/polars/prelude/peaks/index.html "mod polars::prelude::peaks") `polars-ops` and `peaks` [replace](https://docs.pola.rs/api/rust/dev/polars/prelude/replace/index.html "mod polars::prelude::replace") `temporal` and (`dtype-date` or `dtype-datetime`) [round](https://docs.pola.rs/api/rust/dev/polars/prelude/round/index.html "mod polars::prelude::round") `polars-ops` and `round_series` [row\_encode](https://docs.pola.rs/api/rust/dev/polars/prelude/row_encode/index.html "mod polars::prelude::row_encode") [schema\_inference](https://docs.pola.rs/api/rust/dev/polars/prelude/schema_inference/index.html "mod polars::prelude::schema_inference") `polars-io` [search\_sorted](https://docs.pola.rs/api/rust/dev/polars/prelude/search_sorted/index.html "mod polars::prelude::search_sorted") [series](https://docs.pola.rs/api/rust/dev/polars/prelude/series/index.html "mod polars::prelude::series") `temporal` [sink](https://docs.pola.rs/api/rust/dev/polars/prelude/sink/index.html "mod polars::prelude::sink") `lazy` [sort](https://docs.pola.rs/api/rust/dev/polars/prelude/sort/index.html "mod polars::prelude::sort") [streaming](https://docs.pola.rs/api/rust/dev/polars/prelude/streaming/index.html "mod polars::prelude::streaming") `polars-io` [strings](https://docs.pola.rs/api/rust/dev/polars/prelude/strings/index.html "mod polars::prelude::strings") `polars-ops` [sync\_on\_close](https://docs.pola.rs/api/rust/dev/polars/prelude/sync_on_close/index.html "mod polars::prelude::sync_on_close") `polars-io` [udf](https://docs.pola.rs/api/rust/dev/polars/prelude/udf/index.html "mod polars::prelude::udf") `lazy` [utf8](https://docs.pola.rs/api/rust/dev/polars/prelude/utf8/index.html "mod polars::prelude::utf8") [zip](https://docs.pola.rs/api/rust/dev/polars/prelude/zip/index.html "mod polars::prelude::zip") `zip_with` Macros[§](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html#macros) ------------------------------------------------------------------------------ [df](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.df.html "macro polars::prelude::df") [polars\_bail](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.polars_bail.html "macro polars::prelude::polars_bail") [polars\_ensure](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.polars_ensure.html "macro polars::prelude::polars_ensure") [polars\_err](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.polars_err.html "macro polars::prelude::polars_err") [polars\_warn](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.polars_warn.html "macro polars::prelude::polars_warn") [with\_match\_categorical\_physical\_type](https://docs.pola.rs/api/rust/dev/polars/prelude/macro.with_match_categorical_physical_type.html "macro polars::prelude::with_match_categorical_physical_type") Structs[§](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html#structs) -------------------------------------------------------------------------------- [AnonymousScanArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.AnonymousScanArgs.html "struct polars::prelude::AnonymousScanArgs") `lazy` [AnonymousScanOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.AnonymousScanOptions.html "struct polars::prelude::AnonymousScanOptions") `lazy` [Arc](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Arc.html "struct polars::prelude::Arc") A thread-safe reference-counting pointer. ‘Arc’ stands for ‘Atomically Reference Counted’. [ArrayNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ArrayNameSpace.html "struct polars::prelude::ArrayNameSpace") `lazy` Specialized expressions for [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") of [`DataType::Array`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataType.html#variant.Array "variant polars::prelude::DataType::Array") . [ArrowField](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ArrowField.html "struct polars::prelude::ArrowField") Represents Arrow’s metadata of a “column”. [AsOfOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.AsOfOptions.html "struct polars::prelude::AsOfOptions") `polars-ops` [BaseColumnUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BaseColumnUdf.html "struct polars::prelude::BaseColumnUdf") `lazy` [BinaryOffsetType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BinaryOffsetType.html "struct polars::prelude::BinaryOffsetType") [BinaryType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BinaryType.html "struct polars::prelude::BinaryType") [BooleanChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BooleanChunkedBuilder.html "struct polars::prelude::BooleanChunkedBuilder") [BooleanType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BooleanType.html "struct polars::prelude::BooleanType") [Bounds](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Bounds.html "struct polars::prelude::Bounds") `temporal` [BoundsIter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.BoundsIter.html "struct polars::prelude::BoundsIter") `temporal` [CallbackSinkType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CallbackSinkType.html "struct polars::prelude::CallbackSinkType") `lazy` [CastColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CastColumnsPolicy.html "struct polars::prelude::CastColumnsPolicy") `lazy` Used by scans. [Categorical8Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Categorical8Type.html "struct polars::prelude::Categorical8Type") [Categorical16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Categorical16Type.html "struct polars::prelude::Categorical16Type") [Categorical32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Categorical32Type.html "struct polars::prelude::Categorical32Type") [CategoricalMapping](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CategoricalMapping.html "struct polars::prelude::CategoricalMapping") [CategoricalNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CategoricalNameSpace.html "struct polars::prelude::CategoricalNameSpace") `lazy` Specialized expressions for Categorical dtypes. [CategoricalType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CategoricalType.html "struct polars::prelude::CategoricalType") [Categories](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Categories.html "struct polars::prelude::Categories") A (named) object which is used to indicate which categorical data types have the same mapping. [ChainedThen](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChainedThen.html "struct polars::prelude::ChainedThen") `lazy` Utility struct for the `when-then-otherwise` expression. [ChainedWhen](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChainedWhen.html "struct polars::prelude::ChainedWhen") `lazy` Utility struct for the `when-then-otherwise` expression. [ChunkId](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkId.html "struct polars::prelude::ChunkId") [ChunkedArray](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") ChunkedArray [CollectBatches](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CollectBatches.html "struct polars::prelude::CollectBatches") `lazy` [CompatLevel](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CompatLevel.html "struct polars::prelude::CompatLevel") [CrossJoinOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CrossJoinOptions.html "struct polars::prelude::CrossJoinOptions") `polars-ops` [CsvParseOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvParseOptions.html "struct polars::prelude::CsvParseOptions") `polars-io` [CsvReadOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReadOptions.html "struct polars::prelude::CsvReadOptions") `polars-io` [CsvReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvReader.html "struct polars::prelude::CsvReader") `polars-io` Create a new DataFrame by reading a csv file. [CsvSerializer](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvSerializer.html "struct polars::prelude::CsvSerializer") `polars-io` Writes CSV from DataFrames. [CsvWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvWriter.html "struct polars::prelude::CsvWriter") `polars-io` Write a DataFrame to csv. [CsvWriterOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.CsvWriterOptions.html "struct polars::prelude::CsvWriterOptions") `polars-io` Options for writing CSV files. [DataFrame](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") A contiguous growable collection of [`Column`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Column.html "enum polars::prelude::Column") s that have the same length. [DateType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DateType.html "struct polars::prelude::DateType") [DatetimeArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DatetimeArgs.html "struct polars::prelude::DatetimeArgs") `lazy` Arguments used by `datetime` in order to produce an [`Expr`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html "enum polars::prelude::Expr") of Datetime [DatetimeType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DatetimeType.html "struct polars::prelude::DatetimeType") [DecimalType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DecimalType.html "struct polars::prelude::DecimalType") [Dimension](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Dimension.html "struct polars::prelude::Dimension") [DistinctOptionsDSL](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DistinctOptionsDSL.html "struct polars::prelude::DistinctOptionsDSL") `lazy` [DslBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DslBuilder.html "struct polars::prelude::DslBuilder") `lazy` [Duration](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Duration.html "struct polars::prelude::Duration") `lazy` [DurationArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DurationArgs.html "struct polars::prelude::DurationArgs") `lazy` Arguments used by `duration` in order to produce an [`Expr`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html "enum polars::prelude::Expr") of [`Duration`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Duration.html "struct polars::prelude::Duration") [DurationType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DurationType.html "struct polars::prelude::DurationType") [DynamicGroupOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DynamicGroupOptions.html "struct polars::prelude::DynamicGroupOptions") `lazy` [ExplodeOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ExplodeOptions.html "struct polars::prelude::ExplodeOptions") [ExprNameNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ExprNameNameSpace.html "struct polars::prelude::ExprNameNameSpace") `lazy` Specialized expressions for modifying the name of existing expressions. [FalseT](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FalseT.html "struct polars::prelude::FalseT") [Field](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Field.html "struct polars::prelude::Field") Characterizes the name and the [`DataType`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataType.html "enum polars::prelude::DataType") of a column. [FileMetadata](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FileMetadata.html "struct polars::prelude::FileMetadata") `polars-io` Metadata for a Parquet file. [FileSinkOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FileSinkOptions.html "struct polars::prelude::FileSinkOptions") `lazy` [FixedSizeListType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FixedSizeListType.html "struct polars::prelude::FixedSizeListType") `dtype-array` [Float16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Float16Type.html "struct polars::prelude::Float16Type") [Float32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Float32Type.html "struct polars::prelude::Float32Type") [Float64Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Float64Type.html "struct polars::prelude::Float64Type") [FrozenCategories](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FrozenCategories.html "struct polars::prelude::FrozenCategories") An ordered collection of unique strings with an associated pre-computed mapping to go from string <-> index. [GroupBy](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupBy.html "struct polars::prelude::GroupBy") Returned by a group\_by operation on a DataFrame. This struct supports several aggregations. [GroupByDynamicWindower](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupByDynamicWindower.html "struct polars::prelude::GroupByDynamicWindower") `temporal` [GroupPositions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupPositions.html "struct polars::prelude::GroupPositions") [GroupbyOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupbyOptions.html "struct polars::prelude::GroupbyOptions") `lazy` [GroupsIdx](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupsIdx.html "struct polars::prelude::GroupsIdx") Indexes of the groups, the first index is stored separately. this make sorting fast. [GroupsTypeIter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupsTypeIter.html "struct polars::prelude::GroupsTypeIter") [GroupsTypeParIter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.GroupsTypeParIter.html "struct polars::prelude::GroupsTypeParIter") [HConcatOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.HConcatOptions.html "struct polars::prelude::HConcatOptions") `lazy` [HiveOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.HiveOptions.html "struct polars::prelude::HiveOptions") `polars-io` Options for Hive partitioning. [IEJoinOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IEJoinOptions.html "struct polars::prelude::IEJoinOptions") `polars-ops` [InProcessQuery](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.InProcessQuery.html "struct polars::prelude::InProcessQuery") `lazy` [Int8Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Int8Type.html "struct polars::prelude::Int8Type") [Int16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Int16Type.html "struct polars::prelude::Int16Type") [Int32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Int32Type.html "struct polars::prelude::Int32Type") [Int64Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Int64Type.html "struct polars::prelude::Int64Type") [Int128Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Int128Type.html "struct polars::prelude::Int128Type") [IpcReadOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcReadOptions.html "struct polars::prelude::IpcReadOptions") `polars-io` [IpcReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcReader.html "struct polars::prelude::IpcReader") `polars-io` Read Arrows IPC format into a DataFrame [IpcReaderAsync](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcReaderAsync.html "struct polars::prelude::IpcReaderAsync") `polars-io` An Arrow IPC reader implemented on top of PolarsObjectStore. [IpcScanOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcScanOptions.html "struct polars::prelude::IpcScanOptions") `polars-io` [IpcStreamReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcStreamReader.html "struct polars::prelude::IpcStreamReader") `polars-io` Read Arrows Stream IPC format into a DataFrame [IpcStreamWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcStreamWriter.html "struct polars::prelude::IpcStreamWriter") `polars-io` Write a DataFrame to Arrow’s Streaming IPC format [IpcStreamWriterOption](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcStreamWriterOption.html "struct polars::prelude::IpcStreamWriterOption") `polars-io` [IpcWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcWriter.html "struct polars::prelude::IpcWriter") `polars-io` Write a DataFrame to Arrow’s IPC format [IpcWriterOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.IpcWriterOptions.html "struct polars::prelude::IpcWriterOptions") `polars-io` [JoinArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JoinArgs.html "struct polars::prelude::JoinArgs") `lazy` [JoinBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JoinBuilder.html "struct polars::prelude::JoinBuilder") `lazy` [JoinOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JoinOptions.html "struct polars::prelude::JoinOptions") `lazy` [JoinOptionsIR](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JoinOptionsIR.html "struct polars::prelude::JoinOptionsIR") `lazy` [JsonLineReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JsonLineReader.html "struct polars::prelude::JsonLineReader") `polars-io` [JsonReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JsonReader.html "struct polars::prelude::JsonReader") `polars-io` Reads JSON in one of the formats in [`JsonFormat`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JsonFormat.html "enum polars::prelude::JsonFormat") into a DataFrame. [JsonWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JsonWriter.html "struct polars::prelude::JsonWriter") `polars-io` Writes a DataFrame to JSON. [JsonWriterOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.JsonWriterOptions.html "struct polars::prelude::JsonWriterOptions") `polars-io` [LazyCsvReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyCsvReader.html "struct polars::prelude::LazyCsvReader") `lazy` and `csv` [LazyFrame](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html "struct polars::prelude::LazyFrame") `lazy` Lazy abstraction over an eager `DataFrame`. [LazyGroupBy](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyGroupBy.html "struct polars::prelude::LazyGroupBy") `lazy` Utility struct for lazy group\_by operation. [LazyJsonLineReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyJsonLineReader.html "struct polars::prelude::LazyJsonLineReader") `lazy` [ListBinaryChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListBinaryChunkedBuilder.html "struct polars::prelude::ListBinaryChunkedBuilder") [ListBooleanChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListBooleanChunkedBuilder.html "struct polars::prelude::ListBooleanChunkedBuilder") [ListNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListNameSpace.html "struct polars::prelude::ListNameSpace") `lazy` Specialized expressions for [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") of [`DataType::List`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataType.html#variant.List "variant polars::prelude::DataType::List") . [ListPrimitiveChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListPrimitiveChunkedBuilder.html "struct polars::prelude::ListPrimitiveChunkedBuilder") [ListStringChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListStringChunkedBuilder.html "struct polars::prelude::ListStringChunkedBuilder") [ListType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ListType.html "struct polars::prelude::ListType") [Logical](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Logical.html "struct polars::prelude::Logical") Maps a logical type to a chunked array implementation of the physical type. This saves a lot of compiler bloat and allows us to reuse functionality. [LogicalPlanUdfOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LogicalPlanUdfOptions.html "struct polars::prelude::LogicalPlanUdfOptions") `lazy` [MatchToSchemaPerColumn](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.MatchToSchemaPerColumn.html "struct polars::prelude::MatchToSchemaPerColumn") `lazy` [MetadataKeyValue](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.MetadataKeyValue.html "struct polars::prelude::MetadataKeyValue") `polars-io` [NDJsonReadOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.NDJsonReadOptions.html "struct polars::prelude::NDJsonReadOptions") `lazy` and `json` [NoNull](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.NoNull.html "struct polars::prelude::NoNull") Just a wrapper structure which is useful for certain impl specializations. [Null](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Null.html "struct polars::prelude::Null") `lazy` The literal Null [NullChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.NullChunked.html "struct polars::prelude::NullChunked") [NullableIdxSize](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.NullableIdxSize.html "struct polars::prelude::NullableIdxSize") [ObjectType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ObjectType.html "struct polars::prelude::ObjectType") `object` [OptFlags](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.OptFlags.html "struct polars::prelude::OptFlags") `lazy` Allowed optimizations. [OwnedObject](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.OwnedObject.html "struct polars::prelude::OwnedObject") `object` [ParquetFieldOverwrites](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetFieldOverwrites.html "struct polars::prelude::ParquetFieldOverwrites") `polars-io` [ParquetMetadataContext](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetMetadataContext.html "struct polars::prelude::ParquetMetadataContext") `polars-io` Context that can be used to construct custom file-level key value metadata for a Parquet file. [ParquetObjectStore](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetObjectStore.html "struct polars::prelude::ParquetObjectStore") `polars-io` [ParquetOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetOptions.html "struct polars::prelude::ParquetOptions") `polars-io` [ParquetReader](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetReader.html "struct polars::prelude::ParquetReader") `polars-io` Read Apache parquet format into a DataFrame. [ParquetWriteOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetWriteOptions.html "struct polars::prelude::ParquetWriteOptions") `polars-io` [ParquetWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ParquetWriter.html "struct polars::prelude::ParquetWriter") `polars-io` Write a DataFrame to Parquet format. [PartitionedSinkOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PartitionedSinkOptions.html "struct polars::prelude::PartitionedSinkOptions") `lazy` [PartitionedSinkOptionsIR](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PartitionedSinkOptionsIR.html "struct polars::prelude::PartitionedSinkOptionsIR") `lazy` [PlRefPath](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PlRefPath.html "struct polars::prelude::PlRefPath") Reference-counted [`PlPath`](https://docs.pola.rs/api/rust/dev/polars_utils/pl_path/struct.PlPath.html "struct polars_utils::pl_path::PlPath") . [PlSmallStr](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PlSmallStr.html "struct polars::prelude::PlSmallStr") String type that inlines small strings. [PlanSerializationContext](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PlanSerializationContext.html "struct polars::prelude::PlanSerializationContext") `lazy` [PredicateFileSkip](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PredicateFileSkip.html "struct polars::prelude::PredicateFileSkip") `lazy` [PrimitiveChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.PrimitiveChunkedBuilder.html "struct polars::prelude::PrimitiveChunkedBuilder") [RankOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RankOptions.html "struct polars::prelude::RankOptions") `lazy` [RollingCovOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingCovOptions.html "struct polars::prelude::RollingCovOptions") `lazy` [RollingGroupOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingGroupOptions.html "struct polars::prelude::RollingGroupOptions") `lazy` [RollingOptionsDynamicWindow](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingOptionsDynamicWindow.html "struct polars::prelude::RollingOptionsDynamicWindow") `temporal` [RollingOptionsFixedWindow](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingOptionsFixedWindow.html "struct polars::prelude::RollingOptionsFixedWindow") [RollingVarParams](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingVarParams.html "struct polars::prelude::RollingVarParams") [RollingWindower](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RollingWindower.html "struct polars::prelude::RollingWindower") `temporal` [RowEncodingOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RowEncodingOptions.html "struct polars::prelude::RowEncodingOptions") Options for the Polars Row Encoding. [RowIndex](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.RowIndex.html "struct polars::prelude::RowIndex") `polars-io` [Scalar](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Scalar.html "struct polars::prelude::Scalar") [ScanArgsAnonymous](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ScanArgsAnonymous.html "struct polars::prelude::ScanArgsAnonymous") `lazy` [ScanArgsParquet](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ScanArgsParquet.html "struct polars::prelude::ScanArgsParquet") `lazy` [ScanFlags](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ScanFlags.html "struct polars::prelude::ScanFlags") `lazy` [ScanSourceIter](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ScanSourceIter.html "struct polars::prelude::ScanSourceIter") `lazy` An iterator for [`ScanSources`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ScanSources.html "enum polars::prelude::ScanSources") [SerializeOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SerializeOptions.html "struct polars::prelude::SerializeOptions") `polars-io` Options to serialize logical types to CSV. [Series](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") Series [SortMultipleOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SortMultipleOptions.html "struct polars::prelude::SortMultipleOptions") Sort options for multi-series sorting. [SortOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SortOptions.html "struct polars::prelude::SortOptions") Options for single series sorting. [SpecialEq](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SpecialEq.html "struct polars::prelude::SpecialEq") `lazy` Wrapper type that has special equality properties depending on the inner type specialization [SplitLines](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SplitLines.html "struct polars::prelude::SplitLines") `polars-io` An adapted version of std::iter::Split. This exists solely because we cannot split the file in lines naively as [SplitNChars](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.SplitNChars.html "struct polars::prelude::SplitNChars") `polars-ops` [StatisticsOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StatisticsOptions.html "struct polars::prelude::StatisticsOptions") `polars-io` The statistics to write [StringType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StringType.html "struct polars::prelude::StringType") [StrptimeOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StrptimeOptions.html "struct polars::prelude::StrptimeOptions") `lazy` [StructArray](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StructArray.html "struct polars::prelude::StructArray") `polars-io` A [`StructArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StructArray.html "struct polars::prelude::StructArray") is a nested \[`Array`\] with an optional validity representing multiple \[`Array`\] with the same number of rows. [StructNameSpace](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StructNameSpace.html "struct polars::prelude::StructNameSpace") `lazy` Specialized expressions for Struct dtypes. [StructType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.StructType.html "struct polars::prelude::StructType") `dtype-struct` [TableStatistics](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.TableStatistics.html "struct polars::prelude::TableStatistics") `lazy` [Then](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Then.html "struct polars::prelude::Then") `lazy` Utility struct for the `when-then-otherwise` expression. [TimeType](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.TimeType.html "struct polars::prelude::TimeType") [TimeUnitSet](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.TimeUnitSet.html "struct polars::prelude::TimeUnitSet") `lazy` [TimeZone](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.TimeZone.html "struct polars::prelude::TimeZone") [TrueT](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.TrueT.html "struct polars::prelude::TrueT") [UInt8Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UInt8Type.html "struct polars::prelude::UInt8Type") [UInt16Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UInt16Type.html "struct polars::prelude::UInt16Type") [UInt32Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UInt32Type.html "struct polars::prelude::UInt32Type") [UInt64Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UInt64Type.html "struct polars::prelude::UInt64Type") [UInt128Type](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UInt128Type.html "struct polars::prelude::UInt128Type") [UnifiedScanArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnifiedScanArgs.html "struct polars::prelude::UnifiedScanArgs") `lazy` Scan arguments shared across different scan types. [UnifiedSinkArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnifiedSinkArgs.html "struct polars::prelude::UnifiedSinkArgs") `lazy` [UnionArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnionArgs.html "struct polars::prelude::UnionArgs") `lazy` [UnionOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnionOptions.html "struct polars::prelude::UnionOptions") `lazy` [UnpivotArgsDSL](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnpivotArgsDSL.html "struct polars::prelude::UnpivotArgsDSL") `lazy` [UnpivotArgsIR](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UnpivotArgsIR.html "struct polars::prelude::UnpivotArgsIR") Arguments for `LazyFrame::unpivot` function [UserDefinedFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.UserDefinedFunction.html "struct polars::prelude::UserDefinedFunction") `lazy` Represents a user-defined function [When](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.When.html "struct polars::prelude::When") `lazy` Utility struct for the `when-then-otherwise` expression. [Window](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Window.html "struct polars::prelude::Window") `temporal` Represents a window in time [pf16](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.pf16.html "struct polars::prelude::pf16") A portable float16 type. Enums[§](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html#enums) ---------------------------------------------------------------------------- [AggExpr](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.AggExpr.html "enum polars::prelude::AggExpr") `lazy` [Ambiguous](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Ambiguous.html "enum polars::prelude::Ambiguous") [AnyValue](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.AnyValue.html "enum polars::prelude::AnyValue") [ArrayDataTypeFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ArrayDataTypeFunction.html "enum polars::prelude::ArrayDataTypeFunction") `lazy` [ArrayFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ArrayFunction.html "enum polars::prelude::ArrayFunction") `lazy` [ArrowDataType](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ArrowDataType.html "enum polars::prelude::ArrowDataType") The set of supported logical types in this crate. [ArrowTimeUnit](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ArrowTimeUnit.html "enum polars::prelude::ArrowTimeUnit") The time units defined in Arrow. [AsofStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.AsofStrategy.html "enum polars::prelude::AsofStrategy") `polars-ops` [BinaryFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.BinaryFunction.html "enum polars::prelude::BinaryFunction") `lazy` [BitwiseFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.BitwiseFunction.html "enum polars::prelude::BitwiseFunction") `lazy` [BooleanFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.BooleanFunction.html "enum polars::prelude::BooleanFunction") `lazy` [CategoricalFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CategoricalFunction.html "enum polars::prelude::CategoricalFunction") `lazy` [CategoricalPhysical](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CategoricalPhysical.html "enum polars::prelude::CategoricalPhysical") The physical datatype backing a categorical / enum. [ChildFieldOverwrites](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ChildFieldOverwrites.html "enum polars::prelude::ChildFieldOverwrites") `polars-io` [ClosedInterval](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ClosedInterval.html "enum polars::prelude::ClosedInterval") `polars-ops` [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ClosedWindow.html "enum polars::prelude::ClosedWindow") `temporal` [CloudScheme](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CloudScheme.html "enum polars::prelude::CloudScheme") [Column](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Column.html "enum polars::prelude::Column") A column within a [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DataFrame.html "struct polars::prelude::DataFrame") . [ColumnMapping](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ColumnMapping.html "enum polars::prelude::ColumnMapping") `lazy` [CommentPrefix](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CommentPrefix.html "enum polars::prelude::CommentPrefix") `polars-io` [CsvCompression](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CsvCompression.html "enum polars::prelude::CsvCompression") `polars-io` Compression options for CSV. [CsvEncoding](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.CsvEncoding.html "enum polars::prelude::CsvEncoding") `polars-io` [DataType](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataType.html "enum polars::prelude::DataType") [DataTypeExpr](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataTypeExpr.html "enum polars::prelude::DataTypeExpr") `lazy` [DataTypeFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataTypeFunction.html "enum polars::prelude::DataTypeFunction") `lazy` [DataTypeSelector](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DataTypeSelector.html "enum polars::prelude::DataTypeSelector") `lazy` [DateRangeArgs](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DateRangeArgs.html "enum polars::prelude::DateRangeArgs") `lazy` and (`dtype-date` or `dtype-datetime`) [DslPlan](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DslPlan.html "enum polars::prelude::DslPlan") `lazy` [Engine](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Engine.html "enum polars::prelude::Engine") `lazy` [EvalVariant](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.EvalVariant.html "enum polars::prelude::EvalVariant") `lazy` [Excluded](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Excluded.html "enum polars::prelude::Excluded") `lazy` [Expr](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Expr.html "enum polars::prelude::Expr") `lazy` Expressions that can be used in various contexts. [ExtraColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ExtraColumnsPolicy.html "enum polars::prelude::ExtraColumnsPolicy") `lazy` [FileScanDsl](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.FileScanDsl.html "enum polars::prelude::FileScanDsl") `lazy` Note: This is cheaply cloneable. [FileScanIR](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.FileScanIR.html "enum polars::prelude::FileScanIR") `lazy` Note: This is cheaply cloneable. [FileWriteFormat](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.FileWriteFormat.html "enum polars::prelude::FileWriteFormat") `lazy` [FillNullStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.FillNullStrategy.html "enum polars::prelude::FillNullStrategy") [FunctionExpr](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.FunctionExpr.html "enum polars::prelude::FunctionExpr") `lazy` [GroupByMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.GroupByMethod.html "enum polars::prelude::GroupByMethod") [GroupsIndicator](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.GroupsIndicator.html "enum polars::prelude::GroupsIndicator") [GroupsType](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.GroupsType.html "enum polars::prelude::GroupsType") [IndexOrder](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.IndexOrder.html "enum polars::prelude::IndexOrder") [InequalityOperator](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.InequalityOperator.html "enum polars::prelude::InequalityOperator") `polars-ops` [InterpolationMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.InterpolationMethod.html "enum polars::prelude::InterpolationMethod") `polars-ops` [IpcCompression](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.IpcCompression.html "enum polars::prelude::IpcCompression") `polars-io` Compression codec [JoinCoalesce](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JoinCoalesce.html "enum polars::prelude::JoinCoalesce") `polars-ops` [JoinType](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JoinType.html "enum polars::prelude::JoinType") `lazy` [JoinTypeOptions](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JoinTypeOptions.html "enum polars::prelude::JoinTypeOptions") `polars-ops` [JoinTypeOptionsIR](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JoinTypeOptionsIR.html "enum polars::prelude::JoinTypeOptionsIR") `lazy` [JoinValidation](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JoinValidation.html "enum polars::prelude::JoinValidation") `lazy` [JsonFormat](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.JsonFormat.html "enum polars::prelude::JsonFormat") `polars-io` The format to use to write the DataFrame to JSON: `Json` (a JSON array) or `JsonLines` (each row output on a separate line). [KeyValueMetadata](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.KeyValueMetadata.html "enum polars::prelude::KeyValueMetadata") `polars-io` Key/value pairs that can be attached to a Parquet file as file-level metadtaa. [Label](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Label.html "enum polars::prelude::Label") `temporal` [LazySerde](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.LazySerde.html "enum polars::prelude::LazySerde") `lazy` [ListFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ListFunction.html "enum polars::prelude::ListFunction") `lazy` [LiteralValue](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.LiteralValue.html "enum polars::prelude::LiteralValue") `lazy` [MaintainOrderJoin](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.MaintainOrderJoin.html "enum polars::prelude::MaintainOrderJoin") `polars-ops` [MissingColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.MissingColumnsPolicy.html "enum polars::prelude::MissingColumnsPolicy") `lazy` [MissingColumnsPolicyOrExpr](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.MissingColumnsPolicyOrExpr.html "enum polars::prelude::MissingColumnsPolicyOrExpr") `lazy` [NonExistent](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.NonExistent.html "enum polars::prelude::NonExistent") [NullStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.NullStrategy.html "enum polars::prelude::NullStrategy") `polars-ops` [NullValues](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.NullValues.html "enum polars::prelude::NullValues") `polars-io` [Operator](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Operator.html "enum polars::prelude::Operator") `lazy` [ParallelStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ParallelStrategy.html "enum polars::prelude::ParallelStrategy") `polars-io` [ParquetCompression](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ParquetCompression.html "enum polars::prelude::ParquetCompression") `polars-io` The compression strategy to use for writing Parquet files. [ParquetStatistics](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ParquetStatistics.html "enum polars::prelude::ParquetStatistics") `polars-io` Parquet statistics for a nesting level [PartitionStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.PartitionStrategy.html "enum polars::prelude::PartitionStrategy") `lazy` [PartitionStrategyIR](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.PartitionStrategyIR.html "enum polars::prelude::PartitionStrategyIR") `lazy` [PlanCallback](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.PlanCallback.html "enum polars::prelude::PlanCallback") `lazy` [PolarsError](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.PolarsError.html "enum polars::prelude::PolarsError") [PowFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.PowFunction.html "enum polars::prelude::PowFunction") `lazy` [QuantileMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.QuantileMethod.html "enum polars::prelude::QuantileMethod") [QuoteStyle](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.QuoteStyle.html "enum polars::prelude::QuoteStyle") `polars-io` Quote style indicating when to insert quotes around a field. [RandomMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RandomMethod.html "enum polars::prelude::RandomMethod") `lazy` [RangeFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RangeFunction.html "enum polars::prelude::RangeFunction") `lazy` [RankMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RankMethod.html "enum polars::prelude::RankMethod") `lazy` [RenameAliasFn](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RenameAliasFn.html "enum polars::prelude::RenameAliasFn") `lazy` [ReshapeDimension](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ReshapeDimension.html "enum polars::prelude::ReshapeDimension") A dimension in a reshape. [RollingFnParams](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RollingFnParams.html "enum polars::prelude::RollingFnParams") [RollingFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RollingFunction.html "enum polars::prelude::RollingFunction") `lazy` [RollingFunctionBy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RollingFunctionBy.html "enum polars::prelude::RollingFunctionBy") `lazy` [RollingRankMethod](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RollingRankMethod.html "enum polars::prelude::RollingRankMethod") [RoundMode](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.RoundMode.html "enum polars::prelude::RoundMode") `polars-ops` [ScanSource](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ScanSource.html "enum polars::prelude::ScanSource") `lazy` A single source to scan from [ScanSourceRef](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ScanSourceRef.html "enum polars::prelude::ScanSourceRef") `lazy` A reference to a single item in [`ScanSources`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ScanSources.html "enum polars::prelude::ScanSources") [ScanSources](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ScanSources.html "enum polars::prelude::ScanSources") `lazy` Set of sources to scan from [SearchSortedSide](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.SearchSortedSide.html "enum polars::prelude::SearchSortedSide") `polars-ops` [Selector](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Selector.html "enum polars::prelude::Selector") `lazy` [SinkDestination](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.SinkDestination.html "enum polars::prelude::SinkDestination") `lazy` [SinkTarget](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.SinkTarget.html "enum polars::prelude::SinkTarget") `lazy` [SinkType](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.SinkType.html "enum polars::prelude::SinkType") `lazy` [SinkTypeIR](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.SinkTypeIR.html "enum polars::prelude::SinkTypeIR") `lazy` [StartBy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.StartBy.html "enum polars::prelude::StartBy") `temporal` [StringFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.StringFunction.html "enum polars::prelude::StringFunction") `lazy` [StructDataTypeFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.StructDataTypeFunction.html "enum polars::prelude::StructDataTypeFunction") `lazy` [StructFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.StructFunction.html "enum polars::prelude::StructFunction") `lazy` [TemporalFunction](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.TemporalFunction.html "enum polars::prelude::TemporalFunction") `lazy` [TimeUnit](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.TimeUnit.html "enum polars::prelude::TimeUnit") [TimeZoneSet](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.TimeZoneSet.html "enum polars::prelude::TimeZoneSet") `lazy` [UniqueKeepStrategy](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.UniqueKeepStrategy.html "enum polars::prelude::UniqueKeepStrategy") [UnknownKind](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.UnknownKind.html "enum polars::prelude::UnknownKind") [UpcastOrForbid](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.UpcastOrForbid.html "enum polars::prelude::UpcastOrForbid") `lazy` [WindowMapping](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.WindowMapping.html "enum polars::prelude::WindowMapping") `lazy` Constants[§](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html#constants) ------------------------------------------------------------------------------------ [BUILD\_STREAMING\_EXECUTOR](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.BUILD_STREAMING_EXECUTOR.html "constant polars::prelude::BUILD_STREAMING_EXECUTOR") `lazy` [DSL\_VERSION](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.DSL_VERSION.html "constant polars::prelude::DSL_VERSION") `lazy` [HIVE\_VALUE\_ENCODE\_CHARSET](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.HIVE_VALUE_ENCODE_CHARSET.html "constant polars::prelude::HIVE_VALUE_ENCODE_CHARSET") `polars-io` Characters to percent-encode for hive values such that they round-trip from bucket storage. [IDX\_DTYPE](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.IDX_DTYPE.html "constant polars::prelude::IDX_DTYPE") [LB\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.LB_NAME.html "constant polars::prelude::LB_NAME") `temporal` [NULL](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.NULL.html "constant polars::prelude::NULL") `lazy` [UB\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.UB_NAME.html "constant polars::prelude::UB_NAME") `temporal` [URL\_ENCODE\_CHARSET](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.URL_ENCODE_CHARSET.html "constant polars::prelude::URL_ENCODE_CHARSET") `polars-io` Excludes only the unreserved URI characters in RFC-3986: [UTF8\_BOM](https://docs.pola.rs/api/rust/dev/polars/prelude/constant.UTF8_BOM.html "constant polars::prelude::UTF8_BOM") `polars-io` Statics[§](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html#statics) -------------------------------------------------------------------------------- [BOOLEAN\_RE](https://docs.pola.rs/api/rust/dev/polars/prelude/static.BOOLEAN_RE.html "static polars::prelude::BOOLEAN_RE") `polars-io` [FLOAT\_RE](https://docs.pola.rs/api/rust/dev/polars/prelude/static.FLOAT_RE.html "static polars::prelude::FLOAT_RE") `polars-io` [FLOAT\_RE\_DECIMAL](https://docs.pola.rs/api/rust/dev/polars/prelude/static.FLOAT_RE_DECIMAL.html "static polars::prelude::FLOAT_RE_DECIMAL") `polars-io` [INTEGER\_RE](https://docs.pola.rs/api/rust/dev/polars/prelude/static.INTEGER_RE.html "static polars::prelude::INTEGER_RE") `polars-io` [POLARS\_OBJECT\_EXTENSION\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/static.POLARS_OBJECT_EXTENSION_NAME.html "static polars::prelude::POLARS_OBJECT_EXTENSION_NAME") [POLARS\_TEMP\_DIR\_BASE\_PATH](https://docs.pola.rs/api/rust/dev/polars/prelude/static.POLARS_TEMP_DIR_BASE_PATH.html "static polars::prelude::POLARS_TEMP_DIR_BASE_PATH") `polars-io` [RLE\_LENGTH\_COLUMN\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/static.RLE_LENGTH_COLUMN_NAME.html "static polars::prelude::RLE_LENGTH_COLUMN_NAME") `polars-ops` [RLE\_VALUE\_COLUMN\_NAME](https://docs.pola.rs/api/rust/dev/polars/prelude/static.RLE_VALUE_COLUMN_NAME.html "static polars::prelude::RLE_VALUE_COLUMN_NAME") `polars-ops` Traits[§](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html#traits) ------------------------------------------------------------------------------ [AnonymousColumnsUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AnonymousColumnsUdf.html "trait polars::prelude::AnonymousColumnsUdf") `lazy` [AnonymousScan](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AnonymousScan.html "trait polars::prelude::AnonymousScan") `lazy` [AnonymousStreamingAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AnonymousStreamingAgg.html "trait polars::prelude::AnonymousStreamingAgg") `lazy` [ArgAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ArgAgg.html "trait polars::prelude::ArgAgg") `polars-ops` Argmin/ Argmax [ArithmeticChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ArithmeticChunked.html "trait polars::prelude::ArithmeticChunked") [ArrayCollectIterExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ArrayCollectIterExt.html "trait polars::prelude::ArrayCollectIterExt") [ArrayFromIter](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ArrayFromIter.html "trait polars::prelude::ArrayFromIter") [ArrayFromIterDtype](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ArrayFromIterDtype.html "trait polars::prelude::ArrayFromIterDtype") [AsBinary](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsBinary.html "trait polars::prelude::AsBinary") `polars-ops` [AsList](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsList.html "trait polars::prelude::AsList") `polars-ops` [AsRefDataType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsRefDataType.html "trait polars::prelude::AsRefDataType") [AsString](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsString.html "trait polars::prelude::AsString") `polars-ops` [AsofJoin](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsofJoin.html "trait polars::prelude::AsofJoin") `polars-ops` [AsofJoinBy](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.AsofJoinBy.html "trait polars::prelude::AsofJoinBy") `polars-ops` [BinaryNameSpaceImpl](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.BinaryNameSpaceImpl.html "trait polars::prelude::BinaryNameSpaceImpl") `polars-ops` [CatNative](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.CatNative.html "trait polars::prelude::CatNative") [CategoricalPhysicalDtypeExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.CategoricalPhysicalDtypeExt.html "trait polars::prelude::CategoricalPhysicalDtypeExt") [ChunkAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkAgg.html "trait polars::prelude::ChunkAgg") Aggregation operations. [ChunkAggSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkAggSeries.html "trait polars::prelude::ChunkAggSeries") Aggregations that return [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") of unit length. Those can be used in broadcasting operations. [ChunkAnyValue](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkAnyValue.html "trait polars::prelude::ChunkAnyValue") [ChunkAnyValueBypassValidity](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkAnyValueBypassValidity.html "trait polars::prelude::ChunkAnyValueBypassValidity") [ChunkApply](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkApply.html "trait polars::prelude::ChunkApply") Fastest way to do elementwise operations on a [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") when the operation is cheaper than branching due to null checking. [ChunkApplyKernel](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkApplyKernel.html "trait polars::prelude::ChunkApplyKernel") Apply kernels on the arrow array chunks in a ChunkedArray. [ChunkApproxNUnique](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkApproxNUnique.html "trait polars::prelude::ChunkApproxNUnique") `approx_unique` [ChunkBitwiseReduce](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkBitwiseReduce.html "trait polars::prelude::ChunkBitwiseReduce") `bitwise` Bitwise Reduction Operations. [ChunkBytes](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkBytes.html "trait polars::prelude::ChunkBytes") [ChunkCast](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkCast.html "trait polars::prelude::ChunkCast") Cast `ChunkedArray` to `ChunkedArray` [ChunkCompareEq](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkCompareEq.html "trait polars::prelude::ChunkCompareEq") Compare [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") and [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") ’s and get a `boolean` mask that can be used to filter rows. [ChunkCompareIneq](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkCompareIneq.html "trait polars::prelude::ChunkCompareIneq") Compare [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") and [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") ’s using inequality operators (`<`, `>=`, etc.) and get a `boolean` mask that can be used to filter rows. [ChunkExpandAtIndex](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkExpandAtIndex.html "trait polars::prelude::ChunkExpandAtIndex") Create a new ChunkedArray filled with values at that index. [ChunkExplode](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkExplode.html "trait polars::prelude::ChunkExplode") Explode/flatten a List or String Series [ChunkFillNullValue](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkFillNullValue.html "trait polars::prelude::ChunkFillNullValue") Replace None values with a value [ChunkFilter](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkFilter.html "trait polars::prelude::ChunkFilter") Filter values by a boolean mask. [ChunkFull](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkFull.html "trait polars::prelude::ChunkFull") Fill a ChunkedArray with one value. [ChunkFullNull](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkFullNull.html "trait polars::prelude::ChunkFullNull") [ChunkNestingUtils](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkNestingUtils.html "trait polars::prelude::ChunkNestingUtils") Utility methods for dealing with nested chunked arrays. [ChunkQuantile](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkQuantile.html "trait polars::prelude::ChunkQuantile") Quantile and median aggregation. [ChunkReverse](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkReverse.html "trait polars::prelude::ChunkReverse") Reverse a [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") [ChunkRollApply](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkRollApply.html "trait polars::prelude::ChunkRollApply") `rolling_window` This differs from ChunkWindowCustom and ChunkWindow by not using a fold aggregator, but reusing a `Series` wrapper and calling `Series` aggregators. This likely is a bit slower than ChunkWindow [ChunkSet](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkSet.html "trait polars::prelude::ChunkSet") Create a `ChunkedArray` with new values by index or by boolean mask. [ChunkShift](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkShift.html "trait polars::prelude::ChunkShift") [ChunkShiftFill](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkShiftFill.html "trait polars::prelude::ChunkShiftFill") Shift the values of a [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") by a number of periods. [ChunkSort](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkSort.html "trait polars::prelude::ChunkSort") Sort operations on `ChunkedArray`. [ChunkTake](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkTake.html "trait polars::prelude::ChunkTake") [ChunkTakeUnchecked](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkTakeUnchecked.html "trait polars::prelude::ChunkTakeUnchecked") [ChunkUnique](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkUnique.html "trait polars::prelude::ChunkUnique") Get unique values in a `ChunkedArray` [ChunkVar](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkVar.html "trait polars::prelude::ChunkVar") Variance and standard deviation aggregation. [ChunkZip](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkZip.html "trait polars::prelude::ChunkZip") Combine two [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") based on some predicate. [ChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkedBuilder.html "trait polars::prelude::ChunkedBuilder") [ChunkedCollectInferIterExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkedCollectInferIterExt.html "trait polars::prelude::ChunkedCollectInferIterExt") [ChunkedCollectIterExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkedCollectIterExt.html "trait polars::prelude::ChunkedCollectIterExt") [ChunkedSet](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ChunkedSet.html "trait polars::prelude::ChunkedSet") `polars-ops` [ColumnsUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ColumnsUdf.html "trait polars::prelude::ColumnsUdf") `lazy` A wrapper trait for any closure `Fn(Vec) -> PolarsResult` [CrossJoin](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.CrossJoin.html "trait polars::prelude::CrossJoin") `polars-ops` [CrossJoinFilter](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.CrossJoinFilter.html "trait polars::prelude::CrossJoinFilter") `polars-ops` [DataFrameJoinOps](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameJoinOps.html "trait polars::prelude::DataFrameJoinOps") `polars-ops` [DataFrameOps](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DataFrameOps.html "trait polars::prelude::DataFrameOps") `polars-ops` [DateMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DateMethods.html "trait polars::prelude::DateMethods") `temporal` [DatetimeMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DatetimeMethods.html "trait polars::prelude::DatetimeMethods") `temporal` [DurationMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.DurationMethods.html "trait polars::prelude::DurationMethods") `temporal` [FromData](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.FromData.html "trait polars::prelude::FromData") [FromDataBinary](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.FromDataBinary.html "trait polars::prelude::FromDataBinary") [FromDataUtf8](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.FromDataUtf8.html "trait polars::prelude::FromDataUtf8") [GetAnyValue](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.GetAnyValue.html "trait polars::prelude::GetAnyValue") [IndexToUsize](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IndexToUsize.html "trait polars::prelude::IndexToUsize") [InitHashMaps](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.InitHashMaps.html "trait polars::prelude::InitHashMaps") [InitHashMaps2](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.InitHashMaps2.html "trait polars::prelude::InitHashMaps2") [IntoColumn](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoColumn.html "trait polars::prelude::IntoColumn") Convert `Self` into a [`Column`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.Column.html "enum polars::prelude::Column") [IntoGroupsType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoGroupsType.html "trait polars::prelude::IntoGroupsType") Used to create the tuples for a group\_by operation. [IntoLazy](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoLazy.html "trait polars::prelude::IntoLazy") `lazy` [IntoMetadata](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoMetadata.html "trait polars::prelude::IntoMetadata") [IntoScalar](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoScalar.html "trait polars::prelude::IntoScalar") [IntoSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoSeries.html "trait polars::prelude::IntoSeries") Used to convert a [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") , `&dyn SeriesTrait` and [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") into a [`Series`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Series.html "struct polars::prelude::Series") . [IntoVec](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IntoVec.html "trait polars::prelude::IntoVec") Convenience for `x.into_iter().map(Into::into).collect()` using an `into_vec()` function. [IsFirstDistinct](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IsFirstDistinct.html "trait polars::prelude::IsFirstDistinct") `is_first_distinct` Mask the first unique values as `true` [IsLastDistinct](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.IsLastDistinct.html "trait polars::prelude::IsLastDistinct") `is_last_distinct` Mask the last unique values as `true` [JoinDispatch](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.JoinDispatch.html "trait polars::prelude::JoinDispatch") `polars-ops` [LazyFileListReader](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.LazyFileListReader.html "trait polars::prelude::LazyFileListReader") `lazy` Reads [LazyFrame](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html "struct polars::prelude::LazyFrame") from a filesystem or a cloud storage. Supports glob patterns. [LhsNumOps](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.LhsNumOps.html "trait polars::prelude::LhsNumOps") [ListBuilderTrait](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ListBuilderTrait.html "trait polars::prelude::ListBuilderTrait") [ListFromIter](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ListFromIter.html "trait polars::prelude::ListFromIter") [ListNameSpaceImpl](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ListNameSpaceImpl.html "trait polars::prelude::ListNameSpaceImpl") `polars-ops` [Literal](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.Literal.html "trait polars::prelude::Literal") `lazy` [LogicalType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.LogicalType.html "trait polars::prelude::LogicalType") [MetaDataExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.MetaDataExt.html "trait polars::prelude::MetaDataExt") [MinMaxHorizontal](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.MinMaxHorizontal.html "trait polars::prelude::MinMaxHorizontal") `polars-ops` [MomentSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.MomentSeries.html "trait polars::prelude::MomentSeries") `polars-ops` [NamedFrom](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NamedFrom.html "trait polars::prelude::NamedFrom") [NamedFromOwned](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NamedFromOwned.html "trait polars::prelude::NamedFromOwned") [NewChunkedArray](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NewChunkedArray.html "trait polars::prelude::NewChunkedArray") [NumOpsDispatch](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NumOpsDispatch.html "trait polars::prelude::NumOpsDispatch") [NumOpsDispatchChecked](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NumOpsDispatchChecked.html "trait polars::prelude::NumOpsDispatchChecked") [NumericNative](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.NumericNative.html "trait polars::prelude::NumericNative") [PolarsCategoricalType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsCategoricalType.html "trait polars::prelude::PolarsCategoricalType") `dtype-categorical` Safety [PolarsDataType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsDataType.html "trait polars::prelude::PolarsDataType") Safety [PolarsFloatType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsFloatType.html "trait polars::prelude::PolarsFloatType") [PolarsIntegerType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsIntegerType.html "trait polars::prelude::PolarsIntegerType") [PolarsIterator](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsIterator.html "trait polars::prelude::PolarsIterator") A [`PolarsIterator`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsIterator.html "trait polars::prelude::PolarsIterator") is an iterator over a [`ChunkedArray`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkedArray.html "struct polars::prelude::ChunkedArray") which contains polars types. A [`PolarsIterator`](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsIterator.html "trait polars::prelude::PolarsIterator") must implement [`ExactSizeIterator`](https://doc.rust-lang.org/nightly/core/iter/traits/exact_size/trait.ExactSizeIterator.html "trait core::iter::traits::exact_size::ExactSizeIterator") and [`DoubleEndedIterator`](https://doc.rust-lang.org/nightly/core/iter/traits/double_ended/trait.DoubleEndedIterator.html "trait core::iter::traits::double_ended::DoubleEndedIterator") . [PolarsNumericType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsNumericType.html "trait polars::prelude::PolarsNumericType") [PolarsObject](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsObject.html "trait polars::prelude::PolarsObject") Values need to implement this so that they can be stored into a Series and DataFrame [PolarsPhysicalType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsPhysicalType.html "trait polars::prelude::PolarsPhysicalType") [PolarsRound](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsRound.html "trait polars::prelude::PolarsRound") `temporal` [PolarsTemporalGroupby](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsTemporalGroupby.html "trait polars::prelude::PolarsTemporalGroupby") `lazy` [PolarsTruncate](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsTruncate.html "trait polars::prelude::PolarsTruncate") `temporal` [PolarsUpsample](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.PolarsUpsample.html "trait polars::prelude::PolarsUpsample") `temporal` [QuantileAggSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.QuantileAggSeries.html "trait polars::prelude::QuantileAggSeries") [Reinterpret](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.Reinterpret.html "trait polars::prelude::Reinterpret") [RoundSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.RoundSeries.html "trait polars::prelude::RoundSeries") `polars-ops` [SchemaExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SchemaExt.html "trait polars::prelude::SchemaExt") [SchemaExtPl](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SchemaExtPl.html "trait polars::prelude::SchemaExtPl") [SchemaNamesAndDtypes](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SchemaNamesAndDtypes.html "trait polars::prelude::SchemaNamesAndDtypes") [SeedableFromU64SeedExt](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeedableFromU64SeedExt.html "trait polars::prelude::SeedableFromU64SeedExt") [SerReader](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SerReader.html "trait polars::prelude::SerReader") `polars-io` [SerWriter](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SerWriter.html "trait polars::prelude::SerWriter") `polars-io` [SeriesJoin](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesJoin.html "trait polars::prelude::SeriesJoin") `polars-ops` [SeriesMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesMethods.html "trait polars::prelude::SeriesMethods") `polars-ops` [SeriesOpsTime](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesOpsTime.html "trait polars::prelude::SeriesOpsTime") `temporal` [SeriesRank](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesRank.html "trait polars::prelude::SeriesRank") `polars-ops` [SeriesSealed](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesSealed.html "trait polars::prelude::SeriesSealed") `polars-ops` [SeriesTrait](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SeriesTrait.html "trait polars::prelude::SeriesTrait") [ShrinkType](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ShrinkType.html "trait polars::prelude::ShrinkType") `polars-ops` [SlicedArray](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SlicedArray.html "trait polars::prelude::SlicedArray") Utility trait to slice concrete arrow arrays whilst keeping their concrete type. E.g. don’t return `Box`. [StaticArray](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.StaticArray.html "trait polars::prelude::StaticArray") [StringMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.StringMethods.html "trait polars::prelude::StringMethods") `temporal` [StringNameSpaceImpl](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.StringNameSpaceImpl.html "trait polars::prelude::StringNameSpaceImpl") `polars-ops` [SumMeanHorizontal](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.SumMeanHorizontal.html "trait polars::prelude::SumMeanHorizontal") `polars-ops` [TakeChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.TakeChunked.html "trait polars::prelude::TakeChunked") `polars-ops` Gather by [`ChunkId`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ChunkId.html "struct polars::prelude::ChunkId") [TakeChunkedHorPar](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.TakeChunkedHorPar.html "trait polars::prelude::TakeChunkedHorPar") `polars-ops` [TemporalMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.TemporalMethods.html "trait polars::prelude::TemporalMethods") `temporal` [TimeMethods](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.TimeMethods.html "trait polars::prelude::TimeMethods") `temporal` [ToDummies](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.ToDummies.html "trait polars::prelude::ToDummies") `polars-ops` [UdfSchema](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.UdfSchema.html "trait polars::prelude::UdfSchema") `lazy` [VarAggSeries](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.VarAggSeries.html "trait polars::prelude::VarAggSeries") [VecHash](https://docs.pola.rs/api/rust/dev/polars/prelude/trait.VecHash.html "trait polars::prelude::VecHash") Functions[§](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html#functions) ------------------------------------------------------------------------------------ [\_coalesce\_full\_join](https://docs.pola.rs/api/rust/dev/polars/prelude/fn._coalesce_full_join.html "fn polars::prelude::_coalesce_full_join") `polars-ops` [\_join\_suffix\_name](https://docs.pola.rs/api/rust/dev/polars/prelude/fn._join_suffix_name.html "fn polars::prelude::_join_suffix_name") `polars-ops` [\_set\_check\_length](https://docs.pola.rs/api/rust/dev/polars/prelude/fn._set_check_length.html "fn polars::prelude::_set_check_length") ⚠ Meant for internal use. In very rare conditions this can be turned off. [abs](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.abs.html "fn polars::prelude::abs") `polars-ops` Convert numerical values to their absolute value. [all](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.all.html "fn polars::prelude::all") `lazy` Selects all columns. [all\_horizontal](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.all_horizontal.html "fn polars::prelude::all_horizontal") `lazy` Create a new column with the bitwise-and of the elements in each row. [any\_horizontal](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.any_horizontal.html "fn polars::prelude::any_horizontal") `lazy` Create a new column with the bitwise-or of the elements in each row. [apply\_multiple](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.apply_multiple.html "fn polars::prelude::apply_multiple") `lazy` Apply a function/closure over the groups of multiple columns. This should only be used in a group\_by aggregation. [apply\_projection](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.apply_projection.html "fn polars::prelude::apply_projection") `polars-io` and (`ipc` or `ipc_streaming` or `parquet` or `avro`) [arange](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.arange.html "fn polars::prelude::arange") `lazy` Generate a range of integers. [arg\_sort\_by](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.arg_sort_by.html "fn polars::prelude::arg_sort_by") `lazy` and `range` Find the indexes that would sort these series in order of appearance. [arg\_where](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.arg_where.html "fn polars::prelude::arg_where") `lazy` and `arg_where` Get the indices where `condition` evaluates `true`. [as\_struct](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.as_struct.html "fn polars::prelude::as_struct") `lazy` Take several expressions and collect them into a [`StructChunked`](https://docs.pola.rs/api/rust/dev/polars/prelude/type.StructChunked.html "type polars::prelude::StructChunked") . [avg](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.avg.html "fn polars::prelude::avg") `lazy` Find the mean of all the values in the column named `name`. Alias for [`mean`](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.mean.html "fn polars::prelude::mean") . [base\_utc\_offset](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.base_utc_offset.html "fn polars::prelude::base_utc_offset") `temporal` and `timezones` [binary\_expr](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.binary_expr.html "fn polars::prelude::binary_expr") `lazy` Compute `op(l, r)` (or equivalently `l op r`). `l` and `r` must have types compatible with the Operator. [by\_name](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.by_name.html "fn polars::prelude::by_name") `lazy` Select multiple columns by dtype. [cast](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cast.html "fn polars::prelude::cast") `lazy` Casts the column given by `Expr` to a different type. [clip](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.clip.html "fn polars::prelude::clip") `polars-ops` Set values outside the given boundaries to the boundary value. [clip\_max](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.clip_max.html "fn polars::prelude::clip_max") `polars-ops` Set values above the given maximum to the maximum value. [clip\_min](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.clip_min.html "fn polars::prelude::clip_min") `polars-ops` Set values below the given minimum to the minimum value. [coalesce](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.coalesce.html "fn polars::prelude::coalesce") `lazy` Folds the expressions from left to right keeping the first non-null values. [coalesce\_columns](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.coalesce_columns.html "fn polars::prelude::coalesce_columns") `polars-ops` [col](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.col.html "fn polars::prelude::col") `lazy` Create a Column Expression based on a column name. [cols](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cols.html "fn polars::prelude::cols") `lazy` Select multiple columns by name. [columns\_to\_projection](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.columns_to_projection.html "fn polars::prelude::columns_to_projection") `polars-io` and (`ipc` or `ipc_streaming` or `avro` or `parquet`) [concat](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat.html "fn polars::prelude::concat") `lazy` Concat multiple [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html "struct polars::prelude::LazyFrame") s vertically. [concat\_arr](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_arr.html "fn polars::prelude::concat_arr") `lazy` Horizontally concatenate columns into a single array-type column. [concat\_expr](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_expr.html "fn polars::prelude::concat_expr") `lazy` [concat\_lf\_diagonal](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_lf_diagonal.html "fn polars::prelude::concat_lf_diagonal") `lazy` and `diagonal_concat` Concat [LazyFrame](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html "struct polars::prelude::LazyFrame") s diagonally. Calls [`concat`](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat.html "fn polars::prelude::concat") internally. [concat\_lf\_horizontal](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_lf_horizontal.html "fn polars::prelude::concat_lf_horizontal") `lazy` Concat [LazyFrame](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.LazyFrame.html "struct polars::prelude::LazyFrame") s horizontally. [concat\_list](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_list.html "fn polars::prelude::concat_list") `lazy` Concat lists entries. [concat\_str](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.concat_str.html "fn polars::prelude::concat_str") `concat_str` and `strings` and `lazy` Horizontally concat string columns in linear time [convert\_inner\_type](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.convert_inner_type.html "fn polars::prelude::convert_inner_type") Cast null arrays to inner type and ensure that all offsets remain correct [convert\_to\_unsigned\_index](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.convert_to_unsigned_index.html "fn polars::prelude::convert_to_unsigned_index") `polars-ops` Convert arbitrary integer Series into IdxCa, using `target_len` as logical length. [count\_ones](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.count_ones.html "fn polars::prelude::count_ones") `polars-ops` [count\_rows](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.count_rows.html "fn polars::prelude::count_rows") `polars-io` Read the number of rows without parsing columns useful for count(\*) queries [count\_rows\_from\_slice\_par](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.count_rows_from_slice_par.html "fn polars::prelude::count_rows_from_slice_par") `polars-io` Read the number of rows without parsing columns useful for count(\*) queries [count\_zeros](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.count_zeros.html "fn polars::prelude::count_zeros") `polars-ops` [create\_sorting\_map](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.create_sorting_map.html "fn polars::prelude::create_sorting_map") `polars-io` [csv\_header](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.csv_header.html "fn polars::prelude::csv_header") `polars-io` Writes a CSV header to `writer`. [cum\_count](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_count.html "fn polars::prelude::cum_count") `polars-ops` [cum\_count\_with\_init](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_count_with_init.html "fn polars::prelude::cum_count_with_init") `polars-ops` [cum\_fold\_exprs](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_fold_exprs.html "fn polars::prelude::cum_fold_exprs") `lazy` and `dtype-struct` Accumulate over multiple columns horizontally / row wise. [cum\_max](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_max.html "fn polars::prelude::cum_max") `polars-ops` Get an array with the cumulative max computed at every element. [cum\_max\_with\_init](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_max_with_init.html "fn polars::prelude::cum_max_with_init") `polars-ops` [cum\_min](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_min.html "fn polars::prelude::cum_min") `polars-ops` Get an array with the cumulative min computed at every element. [cum\_min\_with\_init](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_min_with_init.html "fn polars::prelude::cum_min_with_init") `polars-ops` [cum\_prod](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_prod.html "fn polars::prelude::cum_prod") `polars-ops` Get an array with the cumulative product computed at every element. [cum\_prod\_with\_init](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_prod_with_init.html "fn polars::prelude::cum_prod_with_init") `polars-ops` [cum\_reduce\_exprs](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_reduce_exprs.html "fn polars::prelude::cum_reduce_exprs") `lazy` and `dtype-struct` Accumulate over multiple columns horizontally / row wise. [cum\_sum](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_sum.html "fn polars::prelude::cum_sum") `polars-ops` Get an array with the cumulative sum computed at every element [cum\_sum\_with\_init](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.cum_sum_with_init.html "fn polars::prelude::cum_sum_with_init") `polars-ops` [date\_ranges](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.date_ranges.html "fn polars::prelude::date_ranges") `lazy` and `dtype-date` Create a column of date ranges from `start`, `end`, `interval`, and `num_samples` expressions. [datetime](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime.html "fn polars::prelude::datetime") `lazy` Construct a column of `Datetime` from the provided [`DatetimeArgs`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DatetimeArgs.html "struct polars::prelude::DatetimeArgs") . [datetime\_range](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime_range.html "fn polars::prelude::datetime_range") `lazy` and `dtype-datetime` Create a datetime range from `start`, `end`, `interval`, and `num_samples` expressions. [datetime\_ranges](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime_ranges.html "fn polars::prelude::datetime_ranges") `lazy` and `dtype-datetime` Create a column of datetime ranges from `start`, `end`, `interval`, and `num_samples` expressions. [datetime\_to\_timestamp\_ms](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime_to_timestamp_ms.html "fn polars::prelude::datetime_to_timestamp_ms") [datetime\_to\_timestamp\_ns](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime_to_timestamp_ns.html "fn polars::prelude::datetime_to_timestamp_ns") [datetime\_to\_timestamp\_us](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.datetime_to_timestamp_us.html "fn polars::prelude::datetime_to_timestamp_us") [decode\_json\_response](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.decode_json_response.html "fn polars::prelude::decode_json_response") `polars-io` and `cloud` Utility for decoding JSON that adds the response value to the error message if decoding fails. This makes it much easier to debug errors from parsing network responses. [default\_join\_ids](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.default_join_ids.html "fn polars::prelude::default_join_ids") `polars-ops` [deserialize](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.deserialize.html "fn polars::prelude::deserialize") `polars-io` Deserializes the statistics in the column chunks from a single `row_group` into [`Statistics`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.ParquetStatistics.html "enum polars::prelude::ParquetStatistics") associated from `field`’s name. [diff](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.diff.html "fn polars::prelude::diff") `polars-ops` [dst\_offset](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.dst_offset.html "fn polars::prelude::dst_offset") `temporal` and `timezones` [dtype\_col](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.dtype_col.html "fn polars::prelude::dtype_col") `lazy` Select multiple columns by dtype. [dtype\_cols](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.dtype_cols.html "fn polars::prelude::dtype_cols") `lazy` Select multiple columns by dtype. [duration](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.duration.html "fn polars::prelude::duration") `lazy` and `dtype-duration` Construct a column of [`Duration`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.Duration.html "struct polars::prelude::Duration") from the provided [`DurationArgs`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.DurationArgs.html "struct polars::prelude::DurationArgs") [element](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.element.html "fn polars::prelude::element") `lazy` [empty](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.empty.html "fn polars::prelude::empty") `lazy` Selects no columns. [ensure\_duration\_matches\_dtype](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ensure_duration_matches_dtype.html "fn polars::prelude::ensure_duration_matches_dtype") `temporal` [ensure\_is\_constant\_duration](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ensure_is_constant_duration.html "fn polars::prelude::ensure_is_constant_duration") `temporal` [ensure\_matching\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ensure_matching_schema.html "fn polars::prelude::ensure_matching_schema") [ensure\_same\_categories](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ensure_same_categories.html "fn polars::prelude::ensure_same_categories") [ensure\_same\_frozen\_categories](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ensure_same_frozen_categories.html "fn polars::prelude::ensure_same_frozen_categories") [escape\_regex](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.escape_regex.html "fn polars::prelude::escape_regex") `polars-ops` [escape\_regex\_str](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.escape_regex_str.html "fn polars::prelude::escape_regex_str") `polars-ops` [estimate\_n\_lines\_in\_chunk](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.estimate_n_lines_in_chunk.html "fn polars::prelude::estimate_n_lines_in_chunk") `polars-io` Total len divided by max len of first and last non-empty lines. This is intended to be cheaper than `estimate_n_lines_in_file`. [estimate\_n\_lines\_in\_file](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.estimate_n_lines_in_file.html "fn polars::prelude::estimate_n_lines_in_file") `polars-io` [expand\_paths](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.expand_paths.html "fn polars::prelude::expand_paths") `polars-io` Recursively traverses directories and expands globs if `glob` is `true`. [expand\_paths\_hive](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.expand_paths_hive.html "fn polars::prelude::expand_paths_hive") `polars-io` Recursively traverses directories and expands globs if `glob` is `true`. Returns the expanded paths and the index at which to start parsing hive partitions from the path. [expanded\_from\_single\_directory](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.expanded_from_single_directory.html "fn polars::prelude::expanded_from_single_directory") `polars-io` Returns `true` if `expanded_paths` were expanded from a single directory [first](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.first.html "fn polars::prelude::first") `lazy` First column in a DataFrame. [floor\_div\_series](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.floor_div_series.html "fn polars::prelude::floor_div_series") `polars-ops` [fmt\_group\_by\_column](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.fmt_group_by_column.html "fn polars::prelude::fmt_group_by_column") [fold\_exprs](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.fold_exprs.html "fn polars::prelude::fold_exprs") `lazy` Accumulate over multiple columns horizontally / row wise. [format\_str](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.format_str.html "fn polars::prelude::format_str") `concat_str` and `strings` and `lazy` Format the results of an array of expressions using a format string [get\_column\_write\_options](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.get_column_write_options.html "fn polars::prelude::get_column_write_options") `polars-io` [get\_reader\_bytes](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.get_reader_bytes.html "fn polars::prelude::get_reader_bytes") `polars-io` [get\_strftime\_format](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.get_strftime_format.html "fn polars::prelude::get_strftime_format") [group\_by\_values](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.group_by_values.html "fn polars::prelude::group_by_values") `temporal` Different from `group_by_windows`, where define window buckets and search which values fit that pre-defined bucket. [group\_by\_windows](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.group_by_windows.html "fn polars::prelude::group_by_windows") `temporal` Window boundaries are created based on the given `Window`, which is defined by: [hor\_str\_concat](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.hor_str_concat.html "fn polars::prelude::hor_str_concat") `polars-ops` Horizontally concatenate all strings. [impl\_duration](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.impl_duration.html "fn polars::prelude::impl_duration") `polars-ops` [impl\_replace\_time\_zone](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.impl_replace_time_zone.html "fn polars::prelude::impl_replace_time_zone") `polars-ops` [impl\_replace\_time\_zone\_fast](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.impl_replace_time_zone_fast.html "fn polars::prelude::impl_replace_time_zone_fast") `polars-ops` If `ambiguous` is length-1 and not equal to “null”, we can take a slightly faster path. [in\_nanoseconds\_window](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.in_nanoseconds_window.html "fn polars::prelude::in_nanoseconds_window") `temporal` [index\_cols](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.index_cols.html "fn polars::prelude::index_cols") `lazy` Select multiple columns by index. [indexes\_to\_usizes](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.indexes_to_usizes.html "fn polars::prelude::indexes_to_usizes") [infer\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.infer_schema.html "fn polars::prelude::infer_schema") `polars-io` Infers a [`ArrowSchema`](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ArrowSchema.html "type polars::prelude::ArrowSchema") from parquet’s [`FileMetadata`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.FileMetadata.html "struct polars::prelude::FileMetadata") . [int\_range](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.int_range.html "fn polars::prelude::int_range") `lazy` Generate a range of integers. [int\_ranges](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.int_ranges.html "fn polars::prelude::int_ranges") `lazy` Generate a range of integers for each row of the input columns. [interpolate](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.interpolate.html "fn polars::prelude::interpolate") `polars-ops` [interpolate\_by](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.interpolate_by.html "fn polars::prelude::interpolate_by") `polars-ops` [is\_between](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_between.html "fn polars::prelude::is_between") `polars-ops` [is\_close](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_close.html "fn polars::prelude::is_close") `polars-ops` [is\_first\_distinct](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_first_distinct.html "fn polars::prelude::is_first_distinct") `polars-ops` [is\_in](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_in.html "fn polars::prelude::is_in") `polars-ops` [is\_json\_line](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_json_line.html "fn polars::prelude::is_json_line") `polars-io` [is\_last\_distinct](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_last_distinct.html "fn polars::prelude::is_last_distinct") `polars-ops` [is\_not\_null](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_not_null.html "fn polars::prelude::is_not_null") `lazy` A column which is `false` wherever `expr` is null, `true` elsewhere. [is\_null](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.is_null.html "fn polars::prelude::is_null") `lazy` A column which is `true` wherever `expr` is null, `false` elsewhere. [json\_lines](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.json_lines.html "fn polars::prelude::json_lines") `polars-io` [known\_timezones](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.known_timezones.html "fn polars::prelude::known_timezones") `temporal` and `timezones` [last](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.last.html "fn polars::prelude::last") `lazy` Last column in a DataFrame. [leading\_ones](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.leading_ones.html "fn polars::prelude::leading_ones") `polars-ops` [leading\_zeros](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.leading_zeros.html "fn polars::prelude::leading_zeros") `polars-ops` [len](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.len.html "fn polars::prelude::len") `lazy` Return the number of rows in the context. [linear\_space](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.linear_space.html "fn polars::prelude::linear_space") `lazy` Generate a series of equally-spaced points. [linear\_spaces](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.linear_spaces.html "fn polars::prelude::linear_spaces") `lazy` Create a column of linearly-spaced sequences from ‘start’, ‘end’, and ‘num\_samples’ expressions. [lit](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.lit.html "fn polars::prelude::lit") `lazy` Create a Literal Expression from `L`. A literal expression behaves like a column that contains a single distinct value. [lst\_get](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.lst_get.html "fn polars::prelude::lst_get") `polars-ops` [map\_multiple](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.map_multiple.html "fn polars::prelude::map_multiple") `lazy` Apply a function/closure over multiple columns once the logical plan get executed. [materialize\_empty\_df](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.materialize_empty_df.html "fn polars::prelude::materialize_empty_df") `polars-io` [materialize\_projection](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.materialize_projection.html "fn polars::prelude::materialize_projection") `polars-io` [max](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.max.html "fn polars::prelude::max") `lazy` Find the maximum of all the values in the column named `name`. Shorthand for `col(name).max()`. [mean](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.mean.html "fn polars::prelude::mean") `lazy` Find the mean of all the values in the column named `name`. Shorthand for `col(name).mean()`. [median](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.median.html "fn polars::prelude::median") `lazy` Find the median of all the values in the column named `name`. Shorthand for `col(name).median()`. [merge\_dtypes](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.merge_dtypes.html "fn polars::prelude::merge_dtypes") [min](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.min.html "fn polars::prelude::min") `lazy` Find the minimum of all the values in the column named `name`. Shorthand for `col(name).min()`. [negate](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.negate.html "fn polars::prelude::negate") `polars-ops` [negate\_bitwise](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.negate_bitwise.html "fn polars::prelude::negate_bitwise") `polars-ops` [new\_column\_udf](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.new_column_udf.html "fn polars::prelude::new_column_udf") `lazy` [new\_int\_range](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.new_int_range.html "fn polars::prelude::new_int_range") `polars-ops` [new\_linear\_space\_f32](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.new_linear_space_f32.html "fn polars::prelude::new_linear_space_f32") `polars-ops` [new\_linear\_space\_f64](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.new_linear_space_f64.html "fn polars::prelude::new_linear_space_f64") `polars-ops` [not](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.not.html "fn polars::prelude::not") `lazy` Negates a boolean column. [nth](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.nth.html "fn polars::prelude::nth") `lazy` Nth column in a DataFrame. [overwrite\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.overwrite_schema.html "fn polars::prelude::overwrite_schema") `polars-io` and `json` [parse\_ndjson](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.parse_ndjson.html "fn polars::prelude::parse_ndjson") `polars-io` [prepare\_cloud\_plan](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.prepare_cloud_plan.html "fn polars::prelude::prepare_cloud_plan") `lazy` Prepare the given [`DslPlan`](https://docs.pola.rs/api/rust/dev/polars/prelude/enum.DslPlan.html "enum polars::prelude::DslPlan") for execution on Polars Cloud. [private\_left\_join\_multiple\_keys](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.private_left_join_multiple_keys.html "fn polars::prelude::private_left_join_multiple_keys") `polars-ops` [quantile](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.quantile.html "fn polars::prelude::quantile") `lazy` Find a specific quantile of all the values in the column named `name`. [read\_until\_start\_and\_infer\_schema](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.read_until_start_and_infer_schema.html "fn polars::prelude::read_until_start_and_infer_schema") `polars-io` Reads bytes from `reader` until the CSV starting point is reached depending on the options. [reduce\_exprs](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.reduce_exprs.html "fn polars::prelude::reduce_exprs") `lazy` Analogous to [`Iterator::reduce`](https://doc.rust-lang.org/nightly/core/iter/traits/iterator/trait.Iterator.html#method.reduce "method core::iter::traits::iterator::Iterator::reduce") . [remove\_bom](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.remove_bom.html "fn polars::prelude::remove_bom") `polars-io` [repeat](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.repeat.html "fn polars::prelude::repeat") `lazy` Create a column of length `n` containing `n` copies of the literal `value`. [repeat\_by](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.repeat_by.html "fn polars::prelude::repeat_by") `polars-ops` [replace](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace.html "fn polars::prelude::replace") `polars-ops` Replace values by different values of the same data type. [replace\_date](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace_date.html "fn polars::prelude::replace_date") `temporal` and `dtype-date` Replace specific time component of a `DateChunked` with a specified value. [replace\_datetime](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace_datetime.html "fn polars::prelude::replace_datetime") `temporal` and `dtype-datetime` Replace specific time component of a `DatetimeChunked` with a specified value. [replace\_or\_default](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace_or_default.html "fn polars::prelude::replace_or_default") `polars-ops` Replace all values by different values. [replace\_strict](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace_strict.html "fn polars::prelude::replace_strict") `polars-ops` Replace all values by different values. [replace\_time\_zone](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.replace_time_zone.html "fn polars::prelude::replace_time_zone") `polars-ops` [resolve\_homedir](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.resolve_homedir.html "fn polars::prelude::resolve_homedir") `polars-io` Replaces a “~” in the Path with the home directory. [rle](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.rle.html "fn polars::prelude::rle") `polars-ops` Get the lengths of runs of identical values. [rle\_id](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.rle_id.html "fn polars::prelude::rle_id") `polars-ops` Similar to `rle`, but maps values to run IDs. [rle\_lengths](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.rle_lengths.html "fn polars::prelude::rle_lengths") `polars-ops` Get the run-lengths of values. [rolling\_kurtosis](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.rolling_kurtosis.html "fn polars::prelude::rolling_kurtosis") `polars-ops` and `moment` [rolling\_skew](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.rolling_skew.html "fn polars::prelude::rolling_skew") `polars-ops` and `moment` [search\_sorted](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.search_sorted.html "fn polars::prelude::search_sorted") `polars-ops` [split\_helper](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.split_helper.html "fn polars::prelude::split_helper") `polars-ops` [split\_regex\_helper](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.split_regex_helper.html "fn polars::prelude::split_regex_helper") `polars-ops` [split\_to\_struct](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.split_to_struct.html "fn polars::prelude::split_to_struct") `polars-ops` and `dtype-struct` [str\_format](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.str_format.html "fn polars::prelude::str_format") `polars-ops` [str\_join](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.str_join.html "fn polars::prelude::str_join") `polars-ops` [strip\_chars](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.strip_chars.html "fn polars::prelude::strip_chars") `polars-ops` [strip\_chars\_end](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.strip_chars_end.html "fn polars::prelude::strip_chars_end") `polars-ops` [strip\_chars\_start](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.strip_chars_start.html "fn polars::prelude::strip_chars_start") `polars-ops` [strip\_prefix](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.strip_prefix.html "fn polars::prelude::strip_prefix") `polars-ops` [strip\_suffix](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.strip_suffix.html "fn polars::prelude::strip_suffix") `polars-ops` [substring\_ternary\_offsets\_value](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.substring_ternary_offsets_value.html "fn polars::prelude::substring_ternary_offsets_value") `polars-ops` [sum](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.sum.html "fn polars::prelude::sum") `lazy` Sum all the values in the column named `name`. Shorthand for `col(name).sum()`. [ternary\_expr](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.ternary_expr.html "fn polars::prelude::ternary_expr") `lazy` [time\_ranges](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.time_ranges.html "fn polars::prelude::time_ranges") `lazy` and `dtype-time` Create a column of time ranges from a `start` and `stop` expression. [trailing\_ones](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.trailing_ones.html "fn polars::prelude::trailing_ones") `polars-ops` [trailing\_zeros](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.trailing_zeros.html "fn polars::prelude::trailing_zeros") `polars-ops` [try\_raise\_keyboard\_interrupt](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.try_raise_keyboard_interrupt.html "fn polars::prelude::try_raise_keyboard_interrupt") Checks if the keyboard interrupt flag is set, and if yes panics as a keyboard interrupt. This function is very cheap. [try\_set\_sorted\_flag](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.try_set_sorted_flag.html "fn polars::prelude::try_set_sorted_flag") `polars-io` [unique\_counts](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.unique_counts.html "fn polars::prelude::unique_counts") `polars-ops` Returns a count of the unique values in the order of appearance. [unpack\_dtypes](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.unpack_dtypes.html "fn polars::prelude::unpack_dtypes") [update\_view](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.update_view.html "fn polars::prelude::update_view") `polars-ops` [when](https://docs.pola.rs/api/rust/dev/polars/prelude/fn.when.html "fn polars::prelude::when") `lazy` Start a `when-then-otherwise` expression. Type Aliases[§](https://docs.pola.rs/api/rust/dev/polars/prelude/index.html#types) ----------------------------------------------------------------------------------- [AllowedOptimizations](https://docs.pola.rs/api/rust/dev/polars/prelude/type.AllowedOptimizations.html "type polars::prelude::AllowedOptimizations") `lazy` AllowedOptimizations [ArrayChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ArrayChunked.html "type polars::prelude::ArrayChunked") `dtype-array` [ArrayRef](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ArrayRef.html "type polars::prelude::ArrayRef") [ArrowSchema](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ArrowSchema.html "type polars::prelude::ArrowSchema") An ordered sequence of [`Field`](https://docs.pola.rs/api/rust/dev/polars/prelude/struct.ArrowField.html "struct polars::prelude::ArrowField") s [BinaryChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.BinaryChunked.html "type polars::prelude::BinaryChunked") [BinaryChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/type.BinaryChunkedBuilder.html "type polars::prelude::BinaryChunkedBuilder") [BinaryOffsetChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.BinaryOffsetChunked.html "type polars::prelude::BinaryOffsetChunked") [BooleanChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.BooleanChunked.html "type polars::prelude::BooleanChunked") [BorrowIdxItem](https://docs.pola.rs/api/rust/dev/polars/prelude/type.BorrowIdxItem.html "type polars::prelude::BorrowIdxItem") [CatSize](https://docs.pola.rs/api/rust/dev/polars/prelude/type.CatSize.html "type polars::prelude::CatSize") [Categorical8Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Categorical8Chunked.html "type polars::prelude::Categorical8Chunked") [Categorical16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Categorical16Chunked.html "type polars::prelude::Categorical16Chunked") [Categorical32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Categorical32Chunked.html "type polars::prelude::Categorical32Chunked") [CategoricalChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.CategoricalChunked.html "type polars::prelude::CategoricalChunked") [ChunkJoinOptIds](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ChunkJoinOptIds.html "type polars::prelude::ChunkJoinOptIds") `polars-ops` and `chunked_ids` [DateChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.DateChunked.html "type polars::prelude::DateChunked") [DatetimeChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.DatetimeChunked.html "type polars::prelude::DatetimeChunked") [DecimalChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.DecimalChunked.html "type polars::prelude::DecimalChunked") [DurationChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.DurationChunked.html "type polars::prelude::DurationChunked") [FieldRef](https://docs.pola.rs/api/rust/dev/polars/prelude/type.FieldRef.html "type polars::prelude::FieldRef") [FieldsNameMapper](https://docs.pola.rs/api/rust/dev/polars/prelude/type.FieldsNameMapper.html "type polars::prelude::FieldsNameMapper") `lazy` and `dtype-struct` [FileMetadataRef](https://docs.pola.rs/api/rust/dev/polars/prelude/type.FileMetadataRef.html "type polars::prelude::FileMetadataRef") `polars-io` [FillNullLimit](https://docs.pola.rs/api/rust/dev/polars/prelude/type.FillNullLimit.html "type polars::prelude::FillNullLimit") [Float16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Float16Chunked.html "type polars::prelude::Float16Chunked") `dtype-f16` [Float32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Float32Chunked.html "type polars::prelude::Float32Chunked") [Float64Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Float64Chunked.html "type polars::prelude::Float64Chunked") [GroupsSlice](https://docs.pola.rs/api/rust/dev/polars/prelude/type.GroupsSlice.html "type polars::prelude::GroupsSlice") Every group is indicated by an array where the [IdxArr](https://docs.pola.rs/api/rust/dev/polars/prelude/type.IdxArr.html "type polars::prelude::IdxArr") [IdxCa](https://docs.pola.rs/api/rust/dev/polars/prelude/type.IdxCa.html "type polars::prelude::IdxCa") Non-`bigidx` [IdxItem](https://docs.pola.rs/api/rust/dev/polars/prelude/type.IdxItem.html "type polars::prelude::IdxItem") [IdxSize](https://docs.pola.rs/api/rust/dev/polars/prelude/type.IdxSize.html "type polars::prelude::IdxSize") Non-`bigidx` [IdxType](https://docs.pola.rs/api/rust/dev/polars/prelude/type.IdxType.html "type polars::prelude::IdxType") Non-`bigidx` [InnerJoinIds](https://docs.pola.rs/api/rust/dev/polars/prelude/type.InnerJoinIds.html "type polars::prelude::InnerJoinIds") `polars-ops` [Int8Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Int8Chunked.html "type polars::prelude::Int8Chunked") [Int16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Int16Chunked.html "type polars::prelude::Int16Chunked") [Int32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Int32Chunked.html "type polars::prelude::Int32Chunked") [Int64Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Int64Chunked.html "type polars::prelude::Int64Chunked") [Int128Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Int128Chunked.html "type polars::prelude::Int128Chunked") `dtype-i128` [LargeBinaryArray](https://docs.pola.rs/api/rust/dev/polars/prelude/type.LargeBinaryArray.html "type polars::prelude::LargeBinaryArray") [LargeListArray](https://docs.pola.rs/api/rust/dev/polars/prelude/type.LargeListArray.html "type polars::prelude::LargeListArray") [LargeStringArray](https://docs.pola.rs/api/rust/dev/polars/prelude/type.LargeStringArray.html "type polars::prelude::LargeStringArray") [LeftJoinIds](https://docs.pola.rs/api/rust/dev/polars/prelude/type.LeftJoinIds.html "type polars::prelude::LeftJoinIds") `polars-ops` [ListChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ListChunked.html "type polars::prelude::ListChunked") [ObjectChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.ObjectChunked.html "type polars::prelude::ObjectChunked") `object` [OpaqueColumnUdf](https://docs.pola.rs/api/rust/dev/polars/prelude/type.OpaqueColumnUdf.html "type polars::prelude::OpaqueColumnUdf") `lazy` [OpaqueStreamingAgg](https://docs.pola.rs/api/rust/dev/polars/prelude/type.OpaqueStreamingAgg.html "type polars::prelude::OpaqueStreamingAgg") `lazy` [PlFixedStateQuality](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlFixedStateQuality.html "type polars::prelude::PlFixedStateQuality") [PlHashMap](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlHashMap.html "type polars::prelude::PlHashMap") [PlHashSet](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlHashSet.html "type polars::prelude::PlHashSet") [PlIdHashMap](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlIdHashMap.html "type polars::prelude::PlIdHashMap") This hashmap uses an IdHasher [PlIndexMap](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlIndexMap.html "type polars::prelude::PlIndexMap") [PlIndexSet](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlIndexSet.html "type polars::prelude::PlIndexSet") [PlRandomState](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlRandomState.html "type polars::prelude::PlRandomState") [PlRandomStateQuality](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlRandomStateQuality.html "type polars::prelude::PlRandomStateQuality") [PlSeedableRandomStateQuality](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PlSeedableRandomStateQuality.html "type polars::prelude::PlSeedableRandomStateQuality") [PolarsResult](https://docs.pola.rs/api/rust/dev/polars/prelude/type.PolarsResult.html "type polars::prelude::PolarsResult") [RenameAliasRustFn](https://docs.pola.rs/api/rust/dev/polars/prelude/type.RenameAliasRustFn.html "type polars::prelude::RenameAliasRustFn") `lazy` [RowGroupIterColumns](https://docs.pola.rs/api/rust/dev/polars/prelude/type.RowGroupIterColumns.html "type polars::prelude::RowGroupIterColumns") `polars-io` [Schema](https://docs.pola.rs/api/rust/dev/polars/prelude/type.Schema.html "type polars::prelude::Schema") [SchemaRef](https://docs.pola.rs/api/rust/dev/polars/prelude/type.SchemaRef.html "type polars::prelude::SchemaRef") [StringChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.StringChunked.html "type polars::prelude::StringChunked") [StringChunkedBuilder](https://docs.pola.rs/api/rust/dev/polars/prelude/type.StringChunkedBuilder.html "type polars::prelude::StringChunkedBuilder") [StructChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.StructChunked.html "type polars::prelude::StructChunked") [TimeChunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.TimeChunked.html "type polars::prelude::TimeChunked") [UInt8Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt8Chunked.html "type polars::prelude::UInt8Chunked") [UInt16Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt16Chunked.html "type polars::prelude::UInt16Chunked") [UInt32Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt32Chunked.html "type polars::prelude::UInt32Chunked") [UInt64Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt64Chunked.html "type polars::prelude::UInt64Chunked") [UInt128Chunked](https://docs.pola.rs/api/rust/dev/polars/prelude/type.UInt128Chunked.html "type polars::prelude::UInt128Chunked") `dtype-u128` --- # Schema — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/dev/reference/schema/index.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Schema[#](https://docs.pola.rs/api/python/dev/reference/schema/index.html#schema "Link to this heading") ========================================================================================================= _class_ polars.Schema( _schema: Mapping\[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ , SchemaInitDataType\] | Iterable\[[tuple](https://docs.python.org/3/library/stdtypes.html#tuple "(in Python v3.14)")\ \[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ , SchemaInitDataType\] | ArrowSchemaExportable\] | ArrowSchemaExportable | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, _\*_, _check\_dtypes: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_, )[\[source\]](https://github.com/pola-rs/polars/blob/main/py-polars/src/polars/schema.py#L54-L288) Ordered mapping of column names to their data type. Parameters: **schema** The schema definition given by column names and their associated Polars data type. Accepts a mapping, or an iterable of tuples, or any object implementing the `__arrow_c_schema__` PyCapsule interface (e.g. pyarrow schemas). Examples Define a schema by passing instantiated data types. \>>> schema \= pl.Schema( ... { ... "foo": pl.String(), ... "bar": pl.Duration("us"), ... "baz": pl.Array(pl.Int8, 4), ... } ... ) \>>> schema Schema({'foo': String, 'bar': Duration(time\_unit='us'), 'baz': Array(Int8, shape=(4,))}) Access the data type associated with a specific column name. \>>> schema\["baz"\] Array(Int8, shape=(4,)) Access various schema properties using the `names`, `dtypes`, and `len` methods. \>>> schema.names() \['foo', 'bar', 'baz'\] \>>> schema.dtypes() \[String, Duration(time\_unit='us'), Array(Int8, shape=(4,))\] \>>> schema.len() 3 Import a pyarrow schema. \>>> import pyarrow as pa \>>> pl.Schema(pa.schema(\[pa.field("x", pa.int32())\])) Schema({'x': Int32}) Export a schema to pyarrow. \>>> pa.schema(pl.Schema({"x": pl.Int32})) x: int32 **Methods:** | | | | --- | --- | | `dtypes` | Get the data types of the schema. | | `len` | Get the number of schema entries. | | `names` | Get the column names of the schema. | | `to_arrow` | Convert the schema to a pyarrow schema. | | `to_frame` | Create an empty DataFrame (or LazyFrame) from this Schema. | | `to_python` | Return a dictionary of column names and Python types. | dtypes() → [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[DataType](https://docs.pola.rs/api/python/dev/reference/api/polars.datatypes.DataType.html#polars.datatypes.DataType "polars.datatypes.DataType")\ \][\[source\]](https://github.com/pola-rs/polars/blob/main/py-polars/src/polars/schema.py#L180-L190) Get the data types of the schema. Examples \>>> s \= pl.Schema({"x": pl.UInt8(), "y": pl.List(pl.UInt8)}) \>>> s.dtypes() \[UInt8, List(UInt8)\] len() → [int](https://docs.python.org/3/library/functions.html#int "(in Python v3.14)") [\[source\]](https://github.com/pola-rs/polars/blob/main/py-polars/src/polars/schema.py#L258-L270) Get the number of schema entries. Examples \>>> s \= pl.Schema({"x": pl.Int32(), "y": pl.List(pl.String)}) \>>> s.len() 2 \>>> len(s) 2 names() → [list](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.14)") \[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ \][\[source\]](https://github.com/pola-rs/polars/blob/main/py-polars/src/polars/schema.py#L168-L178) Get the column names of the schema. Examples \>>> s \= pl.Schema({"x": pl.Float64(), "y": pl.Datetime(time\_zone\="UTC")}) \>>> s.names() \['x', 'y'\] to\_arrow( _\*_, _compat\_level: CompatLevel | [None](https://docs.python.org/3/library/constants.html#None "(in Python v3.14)") \= None_, ) → [Schema](https://arrow.apache.org/docs/python/generated/pyarrow.Schema.html#pyarrow.Schema "(in Apache Arrow v22.0.0)") [\[source\]](https://github.com/pola-rs/polars/blob/main/py-polars/src/polars/schema.py#L192-L223) Convert the schema to a pyarrow schema. Parameters: **compat\_level** Use a specific compatibility level when exporting Polars’ internal data types. Examples \>>> pl.Schema({"x": pl.String}).to\_arrow() x: string\_view to\_frame(_\*_, _eager: [bool](https://docs.python.org/3/library/functions.html#bool "(in Python v3.14)") \= True_) → DataFrame | LazyFrame[\[source\]](https://github.com/pola-rs/polars/blob/main/py-polars/src/polars/schema.py#L231-L256) Create an empty DataFrame (or LazyFrame) from this Schema. Parameters: **eager** If True, create a DataFrame; otherwise, create a LazyFrame. Examples \>>> s \= pl.Schema({"x": pl.Int32(), "y": pl.String()}) \>>> s.to\_frame() shape: (0, 2) ┌─────┬─────┐ │ x ┆ y │ │ --- ┆ --- │ │ i32 ┆ str │ ╞═════╪═════╡ └─────┴─────┘ \>>> s.to\_frame(eager\=False) to\_python() → [dict](https://docs.python.org/3/library/stdtypes.html#dict "(in Python v3.14)") \[[str](https://docs.python.org/3/library/stdtypes.html#str "(in Python v3.14)")\ , [type](https://docs.python.org/3/library/functions.html#type "(in Python v3.14)")\ \][\[source\]](https://github.com/pola-rs/polars/blob/main/py-polars/src/polars/schema.py#L272-L288) Return a dictionary of column names and Python types. Examples \>>> s \= pl.Schema( ... { ... "x": pl.Int8(), ... "y": pl.String(), ... "z": pl.Duration("us"), ... } ... ) \>>> s.to\_python() {'x': , 'y': , 'z': } --- # polars::testing - Rust [Module testing](https://docs.pola.rs/api/rust/dev/polars/testing/index.html#) ------------------------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Module testing Copy item path ============================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_core/lib.rs.html#31) Expand description Testing utilities. --- # Input/output — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/dev/reference/io.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Input/output[#](https://docs.pola.rs/api/python/dev/reference/io.html#input-output "Link to this heading") =========================================================================================================== Avro[#](https://docs.pola.rs/api/python/dev/reference/io.html#avro "Link to this heading") ------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_avro`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_avro.html#polars.read_avro "polars.read_avro")
(source, \*\[, columns, n\_rows\]) | Read into a DataFrame from Apache Avro format. | | [`DataFrame.write_avro`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_avro.html#polars.DataFrame.write_avro "polars.DataFrame.write_avro")
(file\[, compression, name\]) | Write to Apache Avro file. | Clipboard[#](https://docs.pola.rs/api/python/dev/reference/io.html#clipboard "Link to this heading") ----------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_clipboard`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_clipboard.html#polars.read_clipboard "polars.read_clipboard")
(\[separator\]) | Read text from clipboard and pass to `read_csv`. | | [`DataFrame.write_clipboard`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_clipboard.html#polars.DataFrame.write_clipboard "polars.DataFrame.write_clipboard")
(\*\[, separator\]) | Copy `DataFrame` in csv format to the system clipboard with `write_csv`. | CSV[#](https://docs.pola.rs/api/python/dev/reference/io.html#csv "Link to this heading") ----------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_csv`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_csv.html#polars.read_csv "polars.read_csv")
(source, \*\[, has\_header, columns, ...\]) | Read a CSV file into a DataFrame. | | [`read_csv_batched`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_csv_batched.html#polars.read_csv_batched "polars.read_csv_batched")
(source, \*\[, has\_header, ...\]) | Read a CSV file in batches. | | [`scan_csv`](https://docs.pola.rs/api/python/dev/reference/api/polars.scan_csv.html#polars.scan_csv "polars.scan_csv")
(source, \*\[, has\_header, separator, ...\]) | Lazily read from a CSV file or multiple files via glob patterns. | | [`DataFrame.write_csv`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_csv.html#polars.DataFrame.write_csv "polars.DataFrame.write_csv")
(\[file, include\_bom, ...\]) | Write to comma-separated values (CSV) file. | | [`LazyFrame.sink_csv`](https://docs.pola.rs/api/python/dev/reference/api/polars.LazyFrame.sink_csv.html#polars.LazyFrame.sink_csv "polars.LazyFrame.sink_csv")
(path, \*\[, include\_bom, ...\]) | Evaluate the query in streaming mode and write to a CSV file. | | | | | --- | --- | | [`BatchedCsvReader.next_batches`](https://docs.pola.rs/api/python/dev/reference/api/polars.io.csv.batched_reader.BatchedCsvReader.next_batches.html#polars.io.csv.batched_reader.BatchedCsvReader.next_batches "polars.io.csv.batched_reader.BatchedCsvReader.next_batches")
(n) | Read `n` batches from the reader. | Database[#](https://docs.pola.rs/api/python/dev/reference/io.html#database "Link to this heading") --------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_database`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_database.html#polars.read_database "polars.read_database")
(query, connection, \*\[, ...\]) | Read the results of a SQL query into a DataFrame, given a connection object. | | [`read_database_uri`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_database_uri.html#polars.read_database_uri "polars.read_database_uri")
(query, uri, \*\[, ...\]) | Read the results of a SQL query into a DataFrame, given a URI. | | [`DataFrame.write_database`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_database.html#polars.DataFrame.write_database "polars.DataFrame.write_database")
(table\_name, ...\[, ...\]) | Write the data in a Polars DataFrame to a database. | Delta Lake[#](https://docs.pola.rs/api/python/dev/reference/io.html#delta-lake "Link to this heading") ------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_delta`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_delta.html#polars.read_delta "polars.read_delta")
(source, \*\[, version, columns, ...\]) | Reads into a DataFrame from a Delta lake table. | | [`scan_delta`](https://docs.pola.rs/api/python/dev/reference/api/polars.scan_delta.html#polars.scan_delta "polars.scan_delta")
(source, \*\[, version, ...\]) | Lazily read from a Delta lake table. | | [`DataFrame.write_delta`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_delta.html#polars.DataFrame.write_delta "polars.DataFrame.write_delta")
(target, \*\[, mode, ...\]) | Write DataFrame as delta table. | Excel / ODS[#](https://docs.pola.rs/api/python/dev/reference/io.html#excel-ods "Link to this heading") ------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_excel`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_excel.html#polars.read_excel "polars.read_excel")
(source, \*\[, sheet\_id, ...\]) | Read Excel spreadsheet data into a DataFrame. | | [`read_ods`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_ods.html#polars.read_ods "polars.read_ods")
(source, \*\[, sheet\_id, sheet\_name, ...\]) | Read OpenOffice (ODS) spreadsheet data into a DataFrame. | | [`DataFrame.write_excel`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_excel.html#polars.DataFrame.write_excel "polars.DataFrame.write_excel")
(\[workbook, worksheet, ...\]) | Write frame data to a table in an Excel workbook/worksheet. | Feather / IPC[#](https://docs.pola.rs/api/python/dev/reference/io.html#feather-ipc "Link to this heading") ----------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_ipc`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_ipc.html#polars.read_ipc "polars.read_ipc")
(source, \*\[, columns, n\_rows, ...\]) | Read into a DataFrame from Arrow IPC (Feather v2) file. | | [`read_ipc_schema`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_ipc_schema.html#polars.read_ipc_schema "polars.read_ipc_schema")
(source) | Get the schema of an IPC file without reading data. | | [`read_ipc_stream`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_ipc_stream.html#polars.read_ipc_stream "polars.read_ipc_stream")
(source, \*\[, columns, ...\]) | Read into a DataFrame from Arrow IPC record batch stream. | | [`scan_ipc`](https://docs.pola.rs/api/python/dev/reference/api/polars.scan_ipc.html#polars.scan_ipc "polars.scan_ipc")
(source, \*\[, n\_rows, cache, ...\]) | Lazily read from an Arrow IPC (Feather v2) file or multiple files via glob patterns. | | [`DataFrame.write_ipc`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_ipc.html#polars.DataFrame.write_ipc "polars.DataFrame.write_ipc")
(file, \*\[, compression, ...\]) | Write to Arrow IPC binary stream or Feather file. | | [`DataFrame.write_ipc_stream`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_ipc_stream.html#polars.DataFrame.write_ipc_stream "polars.DataFrame.write_ipc_stream")
(file, \*\[, ...\]) | Write to Arrow IPC record batch stream. | | [`LazyFrame.sink_ipc`](https://docs.pola.rs/api/python/dev/reference/api/polars.LazyFrame.sink_ipc.html#polars.LazyFrame.sink_ipc "polars.LazyFrame.sink_ipc")
(path, \*\[, compression, ...\]) | Evaluate the query in streaming mode and write to an IPC file. | Iceberg[#](https://docs.pola.rs/api/python/dev/reference/io.html#iceberg "Link to this heading") ------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`scan_iceberg`](https://docs.pola.rs/api/python/dev/reference/api/polars.scan_iceberg.html#polars.scan_iceberg "polars.scan_iceberg")
(source, \*\[, snapshot\_id, ...\]) | Lazily read from an Apache Iceberg table. | | [`DataFrame.write_iceberg`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_iceberg.html#polars.DataFrame.write_iceberg "polars.DataFrame.write_iceberg")
(target, mode) | Write DataFrame to an Iceberg table. | JSON[#](https://docs.pola.rs/api/python/dev/reference/io.html#json "Link to this heading") ------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_json`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_json.html#polars.read_json "polars.read_json")
(source, \*\[, schema, ...\]) | Read into a DataFrame from a JSON file. | | [`read_ndjson`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_ndjson.html#polars.read_ndjson "polars.read_ndjson")
(source, \*\[, schema, ...\]) | Read into a DataFrame from a newline delimited JSON file. | | [`scan_ndjson`](https://docs.pola.rs/api/python/dev/reference/api/polars.scan_ndjson.html#polars.scan_ndjson "polars.scan_ndjson")
(source, \*\[, schema, ...\]) | Lazily read from a newline delimited JSON file or multiple files via glob patterns. | | [`DataFrame.write_json`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_json.html#polars.DataFrame.write_json "polars.DataFrame.write_json")
(\[file\]) | Serialize to JSON representation. | | [`DataFrame.write_ndjson`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_ndjson.html#polars.DataFrame.write_ndjson "polars.DataFrame.write_ndjson")
(\[file\]) | Serialize to newline delimited JSON representation. | | [`LazyFrame.sink_ndjson`](https://docs.pola.rs/api/python/dev/reference/api/polars.LazyFrame.sink_ndjson.html#polars.LazyFrame.sink_ndjson "polars.LazyFrame.sink_ndjson")
(path, \*\[, ...\]) | Evaluate the query in streaming mode and write to an NDJSON file. | Lines[#](https://docs.pola.rs/api/python/dev/reference/io.html#lines "Link to this heading") --------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_lines`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_lines.html#polars.read_lines "polars.read_lines")
(source, \*\[, name, n\_rows, ...\]) | Read lines into a string column from a file. | | [`scan_lines`](https://docs.pola.rs/api/python/dev/reference/api/polars.scan_lines.html#polars.scan_lines "polars.scan_lines")
(source, \*\[, name, n\_rows, ...\]) | Construct a LazyFrame which scans lines into a string column from a file. | Partition[#](https://docs.pola.rs/api/python/dev/reference/io.html#partition "Link to this heading") ----------------------------------------------------------------------------------------------------- Sink to disk with differing partitioning strategies. | | | | --- | --- | | [`PartitionBy`](https://docs.pola.rs/api/python/dev/reference/api/polars.PartitionBy.html#polars.PartitionBy "polars.PartitionBy")
(base\_path, \*\[, ...\]) | Configuration for writing to multiple output files. | | | | | --- | --- | | [`FileProviderArgs`](https://docs.pola.rs/api/python/dev/reference/api/polars.io.partition.FileProviderArgs.html#polars.io.partition.FileProviderArgs "polars.io.partition.FileProviderArgs")
(\*, index\_in\_partition, ...) | Holds information on the file being sinked to. | Parquet[#](https://docs.pola.rs/api/python/dev/reference/io.html#parquet "Link to this heading") ------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`read_parquet`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_parquet.html#polars.read_parquet "polars.read_parquet")
(source, \*\[, columns, n\_rows, ...\]) | Read into a DataFrame from a parquet file. | | [`read_parquet_metadata`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_parquet_metadata.html#polars.read_parquet_metadata "polars.read_parquet_metadata")
(source\[, ...\]) | Get file-level custom metadata of a Parquet file without reading data. | | [`read_parquet_schema`](https://docs.pola.rs/api/python/dev/reference/api/polars.read_parquet_schema.html#polars.read_parquet_schema "polars.read_parquet_schema")
(source) | Get the schema of a Parquet file without reading data. | | [`scan_parquet`](https://docs.pola.rs/api/python/dev/reference/api/polars.scan_parquet.html#polars.scan_parquet "polars.scan_parquet")
(source, \*\[, n\_rows, ...\]) | Lazily read from a local or cloud-hosted parquet file (or files). | | [`DataFrame.write_parquet`](https://docs.pola.rs/api/python/dev/reference/api/polars.DataFrame.write_parquet.html#polars.DataFrame.write_parquet "polars.DataFrame.write_parquet")
(file, \*\[, ...\]) | Write to Apache Parquet file. | | [`LazyFrame.sink_parquet`](https://docs.pola.rs/api/python/dev/reference/api/polars.LazyFrame.sink_parquet.html#polars.LazyFrame.sink_parquet "polars.LazyFrame.sink_parquet")
(path, \*\[, ...\]) | Evaluate the query in streaming mode and write to a Parquet file. | | | | | --- | --- | | [`ParquetFieldOverwrites`](https://docs.pola.rs/api/python/dev/reference/api/polars.io.parquet.ParquetFieldOverwrites.html#polars.io.parquet.ParquetFieldOverwrites "polars.io.parquet.ParquetFieldOverwrites")
(\*\[, name, children, ...\]) | Write-option overwrites for individual Parquet fields. | PyArrow Datasets[#](https://docs.pola.rs/api/python/dev/reference/io.html#pyarrow-datasets "Link to this heading") ------------------------------------------------------------------------------------------------------------------- Connect to pyarrow datasets. | | | | --- | --- | | [`scan_pyarrow_dataset`](https://docs.pola.rs/api/python/dev/reference/api/polars.scan_pyarrow_dataset.html#polars.scan_pyarrow_dataset "polars.scan_pyarrow_dataset")
(source, \*\[, ...\]) | Scan a pyarrow dataset. | Cloud Credentials[#](https://docs.pola.rs/api/python/dev/reference/io.html#cloud-credentials "Link to this heading") --------------------------------------------------------------------------------------------------------------------- Configuration for cloud credential provisioning. | | | | --- | --- | | [`CredentialProvider`](https://docs.pola.rs/api/python/dev/reference/api/polars.CredentialProvider.html#polars.CredentialProvider "polars.CredentialProvider")
() | Base class for credential providers. | | [`CredentialProviderAWS`](https://docs.pola.rs/api/python/dev/reference/api/polars.CredentialProviderAWS.html#polars.CredentialProviderAWS "polars.CredentialProviderAWS")
(\*\[, profile\_name, ...\]) | AWS Credential Provider. | | [`CredentialProviderAzure`](https://docs.pola.rs/api/python/dev/reference/api/polars.CredentialProviderAzure.html#polars.CredentialProviderAzure "polars.CredentialProviderAzure")
(\*\[, scopes, ...\]) | Azure Credential Provider. | | [`CredentialProviderGCP`](https://docs.pola.rs/api/python/dev/reference/api/polars.CredentialProviderGCP.html#polars.CredentialProviderGCP "polars.CredentialProviderGCP")
(\*\[, scopes, request, ...\]) | GCP Credential Provider. | Scan Cast Options[#](https://docs.pola.rs/api/python/dev/reference/io.html#scan-cast-options "Link to this heading") --------------------------------------------------------------------------------------------------------------------- Configuration for type-casting during scans. | | | | --- | --- | | [`ScanCastOptions`](https://docs.pola.rs/api/python/dev/reference/api/polars.ScanCastOptions.html#polars.ScanCastOptions "polars.ScanCastOptions")
(\*\[, integer\_cast, ...\]) | Options for scanning files. | On this page --- # apply_method_all_arrow_series in polars - Rust [apply\_method\_all\_arrow\_series](https://docs.pola.rs/api/rust/dev/polars/macro.apply_method_all_arrow_series.html#) ------------------------------------------------------------------------------------------------------------------------ [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Macro apply\_method\_all\_arrow\_series Copy item path ====================================================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_core/utils/mod.rs.html#720) macro_rules! apply_method_all_arrow_series { ($self:expr, $method:ident, $($args:expr),*) => { ... }; } --- # Catalog — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/dev/reference/catalog/index.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Catalog[#](https://docs.pola.rs/api/python/dev/reference/catalog/index.html#catalog "Link to this heading") ============================================================================================================ Interface with data catalogs. **Unity Catalog** * [Unity Catalog](https://docs.pola.rs/api/python/dev/reference/catalog/unity.html) * [polars.Catalog](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.html) * [`Catalog`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.html#polars.Catalog) * [polars.Catalog.list\_catalogs](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.list_catalogs.html) * [`Catalog.list_catalogs()`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.list_catalogs.html#polars.Catalog.list_catalogs) * [polars.Catalog.list\_namespaces](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.list_namespaces.html) * [`Catalog.list_namespaces()`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.list_namespaces.html#polars.Catalog.list_namespaces) * [polars.Catalog.list\_tables](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.list_tables.html) * [`Catalog.list_tables()`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.list_tables.html#polars.Catalog.list_tables) * [polars.Catalog.get\_table\_info](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.get_table_info.html) * [`Catalog.get_table_info()`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.get_table_info.html#polars.Catalog.get_table_info) * [polars.Catalog.scan\_table](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.scan_table.html) * [`Catalog.scan_table()`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.Catalog.scan_table.html#polars.Catalog.scan_table) * [polars.catalog.unity.CatalogInfo](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.CatalogInfo.html) * [`CatalogInfo`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.CatalogInfo.html#polars.catalog.unity.CatalogInfo) * [polars.catalog.unity.ColumnInfo](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.ColumnInfo.html) * [`ColumnInfo`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.ColumnInfo.html#polars.catalog.unity.ColumnInfo) * [polars.catalog.unity.DataSourceFormat](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.DataSourceFormat.html) * [`DataSourceFormat`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.DataSourceFormat.html#polars.catalog.unity.DataSourceFormat) * [polars.catalog.unity.NamespaceInfo](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.NamespaceInfo.html) * [`NamespaceInfo`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.NamespaceInfo.html#polars.catalog.unity.NamespaceInfo) * [polars.catalog.unity.TableInfo](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.TableInfo.html) * [`TableInfo`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.TableInfo.html#polars.catalog.unity.TableInfo) * [polars.catalog.unity.TableInfo.get\_polars\_schema](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.TableInfo.get_polars_schema.html) * [`TableInfo.get_polars_schema()`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.TableInfo.get_polars_schema.html#polars.catalog.unity.TableInfo.get_polars_schema) * [polars.catalog.unity.TableType](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.TableType.html) * [`TableType`](https://docs.pola.rs/api/python/dev/reference/catalog/api/polars.catalog.unity.TableType.html#polars.catalog.unity.TableType) --- # Extending the API — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/dev/reference/api.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Extending the API[#](https://docs.pola.rs/api/python/dev/reference/api.html#extending-the-api "Link to this heading") ====================================================================================================================== Providing new functionality[#](https://docs.pola.rs/api/python/dev/reference/api.html#providing-new-functionality "Link to this heading") ------------------------------------------------------------------------------------------------------------------------------------------ These functions allow you to register custom functionality in a dedicated namespace on the underlying Polars classes without requiring subclassing or mixins. Expr, DataFrame, LazyFrame, and Series are all supported targets. This feature is primarily intended for use by library authors providing domain-specific capabilities which may not exist (or belong) in the core library. Available registrations[#](https://docs.pola.rs/api/python/dev/reference/api.html#available-registrations "Link to this heading") ---------------------------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`register_expr_namespace`](https://docs.pola.rs/api/python/dev/reference/api/polars.api.register_expr_namespace.html#polars.api.register_expr_namespace "polars.api.register_expr_namespace")
(name) | Decorator for registering custom functionality with a Polars Expr. | | [`register_dataframe_namespace`](https://docs.pola.rs/api/python/dev/reference/api/polars.api.register_dataframe_namespace.html#polars.api.register_dataframe_namespace "polars.api.register_dataframe_namespace")
(name) | Decorator for registering custom functionality with a Polars DataFrame. | | [`register_lazyframe_namespace`](https://docs.pola.rs/api/python/dev/reference/api/polars.api.register_lazyframe_namespace.html#polars.api.register_lazyframe_namespace "polars.api.register_lazyframe_namespace")
(name) | Decorator for registering custom functionality with a Polars LazyFrame. | | [`register_series_namespace`](https://docs.pola.rs/api/python/dev/reference/api/polars.api.register_series_namespace.html#polars.api.register_series_namespace "polars.api.register_series_namespace")
(name) | Decorator for registering custom functionality with a polars Series. | Note You cannot override existing Polars namespaces (such as `.str` or `.dt`), and attempting to do so will raise an [AttributeError](https://docs.python.org/3/library/exceptions.html#AttributeError) . However, you _can_ override other custom namespaces (which will only generate a [UserWarning](https://docs.python.org/3/library/exceptions.html#UserWarning) ). Examples[#](https://docs.pola.rs/api/python/dev/reference/api.html#examples "Link to this heading") ---------------------------------------------------------------------------------------------------- Expr @pl.api.register\_expr\_namespace("greetings") class Greetings: def \_\_init\_\_(self, expr: pl.Expr) \-> None: self.\_expr \= expr def hello(self) \-> pl.Expr: return (pl.lit("Hello ") + self.\_expr).alias("hi there") def goodbye(self) \-> pl.Expr: return (pl.lit("Sayōnara ") + self.\_expr).alias("bye") pl.DataFrame(data\=\["world", "world!", "world!!"\]).select( \[\ pl.all().greetings.hello(),\ pl.all().greetings.goodbye(),\ \] ) \# shape: (3, 1) shape: (3, 2) \# ┌──────────┐ ┌───────────────┬──────────────────┐ \# │ column\_0 │ │ hi there ┆ bye │ \# │ --- │ │ --- ┆ --- │ \# │ str │ │ str ┆ str │ \# ╞══════════╡ >> ╞═══════════════╪══════════════════╡ \# │ world │ │ Hello world ┆ Sayōnara world │ \# │ world! │ │ Hello world! ┆ Sayōnara world! │ \# │ world!! │ │ Hello world!! ┆ Sayōnara world!! │ \# └──────────┘ └───────────────┴──────────────────┘ DataFrame @pl.api.register\_dataframe\_namespace("split") class SplitFrame: def \_\_init\_\_(self, df: pl.DataFrame) \-> None: self.\_df \= df def by\_alternate\_rows(self) \-> list\[pl.DataFrame\]: df \= self.\_df.with\_row\_index(name\="n") return \[\ df.filter((pl.col("n") % 2) \== 0).drop("n"),\ df.filter((pl.col("n") % 2) != 0).drop("n"),\ \] pl.DataFrame( data\=\["aaa", "bbb", "ccc", "ddd", "eee", "fff"\], schema\=\[("txt", pl.String)\], ).split.by\_alternate\_rows() \# \[┌─────┐ ┌─────┐\ \# │ txt │ │ txt │\ \# │ --- │ │ --- │\ \# │ str │ │ str │\ \# ╞═════╡ ╞═════╡\ \# │ aaa │ │ bbb │\ \# │ ccc │ │ ddd │\ \# │ eee │ │ fff │\ \# └─────┘, └─────┘\] LazyFrame @pl.api.register\_lazyframe\_namespace("types") class DTypeOperations: def \_\_init\_\_(self, ldf: pl.LazyFrame) \-> None: self.\_ldf \= ldf def upcast\_integer\_types(self) \-> pl.LazyFrame: return self.\_ldf.with\_columns( pl.col(tp).cast(pl.Int64) for tp in (pl.Int8, pl.Int16, pl.Int32) ) ldf \= pl.DataFrame( data\={"a": \[1, 2\], "b": \[3, 4\], "c": \[5.6, 6.7\]}, schema\=\[("a", pl.Int16), ("b", pl.Int32), ("c", pl.Float32)\], ).lazy() ldf.types.upcast\_integer\_types() \# shape: (2, 3) shape: (2, 3) \# ┌─────┬─────┬─────┐ ┌─────┬─────┬─────┐ \# │ a ┆ b ┆ c │ │ a ┆ b ┆ c │ \# │ --- ┆ --- ┆ --- │ │ --- ┆ --- ┆ --- │ \# │ i16 ┆ i32 ┆ f32 │ >> │ i64 ┆ i64 ┆ f32 │ \# ╞═════╪═════╪═════╡ ╞═════╪═════╪═════╡ \# │ 1 ┆ 3 ┆ 5.6 │ │ 1 ┆ 3 ┆ 5.6 │ \# │ 2 ┆ 4 ┆ 6.7 │ │ 2 ┆ 4 ┆ 6.7 │ \# └─────┴─────┴─────┘ └─────┴─────┴─────┘ Series @pl.api.register\_series\_namespace("math") class MathShortcuts: def \_\_init\_\_(self, s: pl.Series) \-> None: self.\_s \= s def square(self) \-> pl.Series: return self.\_s \* self.\_s def cube(self) \-> pl.Series: return self.\_s \* self.\_s \* self.\_s s \= pl.Series("n", \[1, 2, 3, 4, 5\]) s2 \= s.math.square().rename("n2") s3 \= s.math.cube().rename("n3") \# shape: (5,) shape: (5,) shape: (5,) \# Series: 'n' \[i64\] Series: 'n2' \[i64\] Series: 'n3' \[i64\] \# \[ \[ \[\ \# 1 1 1\ \# 2 4 8\ \# 3 9 27\ \# 4 16 64\ \# 5 25 125\ \# \] \] \] On this page --- # Config — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/dev/reference/config.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Config[#](https://docs.pola.rs/api/python/dev/reference/config.html#config "Link to this heading") =================================================================================================== Config options[#](https://docs.pola.rs/api/python/dev/reference/config.html#config-options "Link to this heading") ------------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`Config.set_ascii_tables`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_ascii_tables.html#polars.Config.set_ascii_tables "polars.Config.set_ascii_tables")
(\[active\]) | Use ASCII characters to display table outlines. | | [`Config.set_auto_structify`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_auto_structify.html#polars.Config.set_auto_structify "polars.Config.set_auto_structify")
(\[active\]) | Allow multi-output expressions to be automatically turned into Structs. | | [`Config.set_decimal_separator`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_decimal_separator.html#polars.Config.set_decimal_separator "polars.Config.set_decimal_separator")
(\[separator\]) | Set the decimal separator character. | | [`Config.set_default_credential_provider`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_default_credential_provider.html#polars.Config.set_default_credential_provider "polars.Config.set_default_credential_provider")
(...) | Set a default credential provider. | | [`Config.set_engine_affinity`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_engine_affinity.html#polars.Config.set_engine_affinity "polars.Config.set_engine_affinity")
(\[engine\]) | Set which engine to use by default. | | [`Config.set_float_precision`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_float_precision.html#polars.Config.set_float_precision "polars.Config.set_float_precision")
(\[precision\]) | Control the number of decimal places displayed for floating point values. | | [`Config.set_fmt_float`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_fmt_float.html#polars.Config.set_fmt_float "polars.Config.set_fmt_float")
(\[fmt\]) | Control how floating point values are displayed. | | [`Config.set_fmt_str_lengths`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_fmt_str_lengths.html#polars.Config.set_fmt_str_lengths "polars.Config.set_fmt_str_lengths")
(n) | Set the number of characters used to display string values. | | [`Config.set_fmt_table_cell_list_len`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_fmt_table_cell_list_len.html#polars.Config.set_fmt_table_cell_list_len "polars.Config.set_fmt_table_cell_list_len")
(n) | Set the number of elements to display for List values. | | [`Config.set_streaming_chunk_size`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_streaming_chunk_size.html#polars.Config.set_streaming_chunk_size "polars.Config.set_streaming_chunk_size")
(size) | Overwrite chunk size used in `streaming` engine. | | [`Config.set_tbl_cell_alignment`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_cell_alignment.html#polars.Config.set_tbl_cell_alignment "polars.Config.set_tbl_cell_alignment")
(format) | Set table cell alignment. | | [`Config.set_tbl_cell_numeric_alignment`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_cell_numeric_alignment.html#polars.Config.set_tbl_cell_numeric_alignment "polars.Config.set_tbl_cell_numeric_alignment")
(format) | Set table cell alignment for numeric columns. | | [`Config.set_tbl_cols`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_cols.html#polars.Config.set_tbl_cols "polars.Config.set_tbl_cols")
(n) | Set the number of columns that are visible when displaying tables. | | [`Config.set_tbl_column_data_type_inline`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_column_data_type_inline.html#polars.Config.set_tbl_column_data_type_inline "polars.Config.set_tbl_column_data_type_inline")
(\[active\]) | Display the data type next to the column name (to the right, in parentheses). | | [`Config.set_tbl_dataframe_shape_below`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_dataframe_shape_below.html#polars.Config.set_tbl_dataframe_shape_below "polars.Config.set_tbl_dataframe_shape_below")
(\[active\]) | Print the DataFrame shape information below the data when displaying tables. | | [`Config.set_tbl_formatting`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_formatting.html#polars.Config.set_tbl_formatting "polars.Config.set_tbl_formatting")
(\[format, ...\]) | Set table formatting style. | | [`Config.set_tbl_hide_column_data_types`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_hide_column_data_types.html#polars.Config.set_tbl_hide_column_data_types "polars.Config.set_tbl_hide_column_data_types")
(\[active\]) | Hide table column data types (i64, f64, str etc.). | | [`Config.set_tbl_hide_column_names`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_hide_column_names.html#polars.Config.set_tbl_hide_column_names "polars.Config.set_tbl_hide_column_names")
(\[active\]) | Hide table column names. | | [`Config.set_tbl_hide_dataframe_shape`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_hide_dataframe_shape.html#polars.Config.set_tbl_hide_dataframe_shape "polars.Config.set_tbl_hide_dataframe_shape")
(\[active\]) | Hide the DataFrame shape information when displaying tables. | | [`Config.set_tbl_hide_dtype_separator`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_hide_dtype_separator.html#polars.Config.set_tbl_hide_dtype_separator "polars.Config.set_tbl_hide_dtype_separator")
(\[active\]) | Hide the '---' separator displayed between the column names and column types. | | [`Config.set_tbl_rows`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_rows.html#polars.Config.set_tbl_rows "polars.Config.set_tbl_rows")
(n) | Set the max number of rows used to draw the table (both Dataframe and Series). | | [`Config.set_tbl_width_chars`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_tbl_width_chars.html#polars.Config.set_tbl_width_chars "polars.Config.set_tbl_width_chars")
(width) | Set the maximum width of a table in characters. | | [`Config.set_thousands_separator`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_thousands_separator.html#polars.Config.set_thousands_separator "polars.Config.set_thousands_separator")
(\[separator\]) | Set the thousands grouping separator character. | | [`Config.set_trim_decimal_zeros`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_trim_decimal_zeros.html#polars.Config.set_trim_decimal_zeros "polars.Config.set_trim_decimal_zeros")
(\[active\]) | Strip trailing zeros from Decimal data type values. | | [`Config.set_verbose`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.set_verbose.html#polars.Config.set_verbose "polars.Config.set_verbose")
(\[active\]) | Enable additional verbose/debug logging. | Config load, save, state[#](https://docs.pola.rs/api/python/dev/reference/config.html#config-load-save-state "Link to this heading") ------------------------------------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`Config.load`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.load.html#polars.Config.load "polars.Config.load")
(cfg) | Load (and set) previously saved Config options from a JSON string. | | [`Config.load_from_file`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.load_from_file.html#polars.Config.load_from_file "polars.Config.load_from_file")
(file) | Load (and set) previously saved Config options from file. | | [`Config.save`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.save.html#polars.Config.save "polars.Config.save")
(\*\[, if\_set\]) | Save the current set of Config options as a JSON string. | | [`Config.save_to_file`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.save_to_file.html#polars.Config.save_to_file "polars.Config.save_to_file")
(file) | Save the current set of Config options as a JSON file. | | [`Config.state`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.state.html#polars.Config.state "polars.Config.state")
(\*\[, if\_set, env\_only\]) | Show the current state of all Config variables in the environment as a dict. | | [`Config.restore_defaults`](https://docs.pola.rs/api/python/dev/reference/api/polars.Config.restore_defaults.html#polars.Config.restore_defaults "polars.Config.restore_defaults")
() | Reset all polars Config settings to their default state. | While it is easy to restore _all_ configuration options to their default value using `restore_defaults`, it can also be useful to reset _individual_ options. This can be done by setting the related value to `None`, eg: pl.Config.set\_tbl\_rows(None) Use as a context manager[#](https://docs.pola.rs/api/python/dev/reference/config.html#use-as-a-context-manager "Link to this heading") --------------------------------------------------------------------------------------------------------------------------------------- Note that `Config` supports setting context-scoped options. These options are valid _only_ during scope lifetime, and are reset to their initial values (whatever they were before entering the new context) on scope exit. You can take advantage of this by initialising a `Config` instance and then explicitly calling one or more of the available “set\_” methods on it… with pl.Config() as cfg: cfg.set\_verbose(True) do\_various\_things() \# on scope exit any modified settings are restored to their previous state …or, often cleaner, by setting the options in the `Config` init directly (optionally omitting the “set\_” prefix for brevity): with pl.Config(verbose\=True): do\_various\_things() Use as a decorator[#](https://docs.pola.rs/api/python/dev/reference/config.html#use-as-a-decorator "Link to this heading") --------------------------------------------------------------------------------------------------------------------------- In the same vein, you can also use a `Config` instance as a function decorator to temporarily set options for the duration of the function call: cfg\_ascii\_frames \= pl.Config(ascii\_tables\=True, apply\_on\_context\_enter\=True) @cfg\_ascii\_frames def write\_markdown\_frame\_to\_stdout(df: pl.DataFrame) \-> None: sys.stdout.write(str(df)) Multiple Config instances[#](https://docs.pola.rs/api/python/dev/reference/config.html#multiple-config-instances "Link to this heading") ----------------------------------------------------------------------------------------------------------------------------------------- You may want to establish related bundles of `Config` options for use in different parts of your code. Usually options are set immediately on `Config` init, meaning the `Config` instance cannot be reused; however, you can defer this so that options are only invoked when entering context scope (which includes function entry if used as a decorator).\_ This allows you to create multiple _reusable_ `Config` instances in one place, update and modify them centrally, and apply them as needed throughout your codebase. cfg\_verbose \= pl.Config(verbose\=True, apply\_on\_context\_enter\=True) cfg\_markdown \= pl.Config(tbl\_formatting\="MARKDOWN", apply\_on\_context\_enter\=True) @cfg\_markdown def write\_markdown\_frame\_to\_stdout(df: pl.DataFrame) \-> None: sys.stdout.write(str(df)) @cfg\_verbose def do\_various\_things(): ... On this page --- # Plugins — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/dev/reference/plugins.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Plugins[#](https://docs.pola.rs/api/python/dev/reference/plugins.html#plugins "Link to this heading") ====================================================================================================== Polars allows you to extend its functionality with either Expression plugins or IO plugins. See the [user guide](https://docs.pola.rs/user-guide/plugins/) for more information and resources. Expression plugins[#](https://docs.pola.rs/api/python/dev/reference/plugins.html#expression-plugins "Link to this heading") ---------------------------------------------------------------------------------------------------------------------------- Expression plugins are the preferred way to create user defined functions. They allow you to compile a Rust function and register that as an expression into the Polars library. The Polars engine will dynamically link your function at runtime and your expression will run almost as fast as native expressions. Note that this works without any interference of Python and thus no GIL contention. See the [expression plugins section of the user guide](https://docs.pola.rs/user-guide/plugins/expr_plugins/) for more information. | | | | --- | --- | | [`plugins.register_plugin_function`](https://docs.pola.rs/api/python/dev/reference/api/polars.plugins.register_plugin_function.html#polars.plugins.register_plugin_function "polars.plugins.register_plugin_function")
(\*, ...\[, ...\]) | Register a plugin function. | IO plugins[#](https://docs.pola.rs/api/python/dev/reference/plugins.html#io-plugins "Link to this heading") ------------------------------------------------------------------------------------------------------------ IO plugins allow you to register different file formats as sources to the Polars engines. See the [IO plugins section of the user guide](https://docs.pola.rs/user-guide/plugins/io_plugins/) for more information. Note The `io.plugins` module is not imported by default in order to optimise import speed of the primary `polars` module. Either import `polars.io.plugins` and _then_ use that namespace, or import `register_io_source` from the full module path, e.g.: from polars.io.plugins import register\_io\_source | | | | --- | --- | | [`io.plugins.register_io_source`](https://docs.pola.rs/api/python/dev/reference/api/polars.io.plugins.register_io_source.html#polars.io.plugins.register_io_source "polars.io.plugins.register_io_source")
(io\_source, \*, ...) | Register your IO plugin and initialize a LazyFrame. | On this page --- # SQL Interface — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/dev/reference/sql/index.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") SQL Interface[#](https://docs.pola.rs/api/python/dev/reference/sql/index.html#sql-interface "Link to this heading") ==================================================================================================================== This page gives an overview of all public SQL functions and operations supported by Polars. **Python API** * [Python API](https://docs.pola.rs/api/python/dev/reference/sql/python_api.html) * [Introduction](https://docs.pola.rs/api/python/dev/reference/sql/python_api.html#introduction) * [Querying](https://docs.pola.rs/api/python/dev/reference/sql/python_api.html#querying) * [Global SQL](https://docs.pola.rs/api/python/dev/reference/sql/python_api.html#global-sql) * [Frame SQL](https://docs.pola.rs/api/python/dev/reference/sql/python_api.html#frame-sql) * [Expression SQL](https://docs.pola.rs/api/python/dev/reference/sql/python_api.html#expression-sql) * [SQLContext](https://docs.pola.rs/api/python/dev/reference/sql/python_api.html#sqlcontext) **SQL Clauses** * [SQL Clauses](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html) * [SELECT](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#select) * [DISTINCT](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#distinct) * [FROM](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#from) * [JOIN](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#join) * [WHERE](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#where) * [GROUP BY](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#group-by) * [HAVING](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#having) * [WINDOW](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#window) * [QUALIFY](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#qualify) * [ORDER BY](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#order-by) * [LIMIT](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#limit) * [OFFSET](https://docs.pola.rs/api/python/dev/reference/sql/clauses.html#offset) **SQL Functions** [Overview](https://docs.pola.rs/api/python/dev/reference/sql/functions/index.html) * [SQL Functions](https://docs.pola.rs/api/python/dev/reference/sql/functions/index.html) * [Aggregate](https://docs.pola.rs/api/python/dev/reference/sql/functions/aggregate.html) * [Array](https://docs.pola.rs/api/python/dev/reference/sql/functions/array.html) * [Bitwise](https://docs.pola.rs/api/python/dev/reference/sql/functions/bitwise.html) * [Conditional](https://docs.pola.rs/api/python/dev/reference/sql/functions/conditional.html) * [Math](https://docs.pola.rs/api/python/dev/reference/sql/functions/math.html) * [String](https://docs.pola.rs/api/python/dev/reference/sql/functions/string.html) * [Temporal](https://docs.pola.rs/api/python/dev/reference/sql/functions/temporal.html) * [Trigonometry](https://docs.pola.rs/api/python/dev/reference/sql/functions/trigonometry.html) * [Types](https://docs.pola.rs/api/python/dev/reference/sql/functions/types.html) * [Window](https://docs.pola.rs/api/python/dev/reference/sql/functions/window.html) **Set Operations** * [Set Operations](https://docs.pola.rs/api/python/dev/reference/sql/set_operations.html) * [EXCEPT](https://docs.pola.rs/api/python/dev/reference/sql/set_operations.html#except) * [INTERSECT](https://docs.pola.rs/api/python/dev/reference/sql/set_operations.html#intersect) * [UNION](https://docs.pola.rs/api/python/dev/reference/sql/set_operations.html#union) * [UNION ALL](https://docs.pola.rs/api/python/dev/reference/sql/set_operations.html#union-all) * [UNION BY NAME](https://docs.pola.rs/api/python/dev/reference/sql/set_operations.html#union-by-name) **Table Operations** * [Table Operations](https://docs.pola.rs/api/python/dev/reference/sql/table_operations.html) * [CREATE TABLE](https://docs.pola.rs/api/python/dev/reference/sql/table_operations.html#create-table) * [DELETE](https://docs.pola.rs/api/python/dev/reference/sql/table_operations.html#delete) * [DROP TABLES](https://docs.pola.rs/api/python/dev/reference/sql/table_operations.html#drop-tables) * [EXPLAIN](https://docs.pola.rs/api/python/dev/reference/sql/table_operations.html#explain) * [SHOW TABLES](https://docs.pola.rs/api/python/dev/reference/sql/table_operations.html#show-tables) * [UNNEST](https://docs.pola.rs/api/python/dev/reference/sql/table_operations.html#unnest) * [TRUNCATE](https://docs.pola.rs/api/python/dev/reference/sql/table_operations.html#truncate) --- # Exceptions — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/dev/reference/exceptions.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Exceptions[#](https://docs.pola.rs/api/python/dev/reference/exceptions.html#exceptions "Link to this heading") =============================================================================================================== Errors[#](https://docs.pola.rs/api/python/dev/reference/exceptions.html#errors "Link to this heading") ------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`PolarsError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.PolarsError.html#polars.exceptions.PolarsError "polars.exceptions.PolarsError") | Base class for all Polars errors. | | [`ColumnNotFoundError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.ColumnNotFoundError.html#polars.exceptions.ColumnNotFoundError "polars.exceptions.ColumnNotFoundError") | Exception raised when a specified column is not found. | | [`ComputeError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.ComputeError.html#polars.exceptions.ComputeError "polars.exceptions.ComputeError") | Exception raised when Polars could not perform an underlying computation. | | [`DuplicateError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.DuplicateError.html#polars.exceptions.DuplicateError "polars.exceptions.DuplicateError") | Exception raised when a column name is duplicated. | | [`InvalidOperationError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.InvalidOperationError.html#polars.exceptions.InvalidOperationError "polars.exceptions.InvalidOperationError") | Exception raised when an operation is not allowed (or possible) against a given object or data structure. | | [`ModuleUpgradeRequiredError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.ModuleUpgradeRequiredError.html#polars.exceptions.ModuleUpgradeRequiredError "polars.exceptions.ModuleUpgradeRequiredError") | Exception raised when a module is installed but needs to be upgraded. | | [`NoDataError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.NoDataError.html#polars.exceptions.NoDataError "polars.exceptions.NoDataError") | Exception raised when an operation cannot be performed on an empty data structure. | | [`NoRowsReturnedError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.NoRowsReturnedError.html#polars.exceptions.NoRowsReturnedError "polars.exceptions.NoRowsReturnedError") | Exception raised when no rows are returned, but at least one row is expected. | | [`OutOfBoundsError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.OutOfBoundsError.html#polars.exceptions.OutOfBoundsError "polars.exceptions.OutOfBoundsError") | Exception raised when the given index is out of bounds. | | [`ParameterCollisionError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.ParameterCollisionError.html#polars.exceptions.ParameterCollisionError "polars.exceptions.ParameterCollisionError") | Exception raised when the same parameter occurs multiple times. | | [`RowsError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.RowsError.html#polars.exceptions.RowsError "polars.exceptions.RowsError") | Exception raised when the number of returned rows does not match expectation. | | [`SQLInterfaceError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.SQLInterfaceError.html#polars.exceptions.SQLInterfaceError "polars.exceptions.SQLInterfaceError") | Exception raised when an error occurs in the SQL interface. | | [`SQLSyntaxError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.SQLSyntaxError.html#polars.exceptions.SQLSyntaxError "polars.exceptions.SQLSyntaxError") | Exception raised from the SQL interface when encountering invalid syntax. | | [`SchemaError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.SchemaError.html#polars.exceptions.SchemaError "polars.exceptions.SchemaError") | Exception raised when an unexpected schema mismatch causes an error. | | [`SchemaFieldNotFoundError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.SchemaFieldNotFoundError.html#polars.exceptions.SchemaFieldNotFoundError "polars.exceptions.SchemaFieldNotFoundError") | Exception raised when a specified schema field is not found. | | [`ShapeError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.ShapeError.html#polars.exceptions.ShapeError "polars.exceptions.ShapeError") | Exception raised when trying to perform operations on data structures with incompatible shapes. | | [`StringCacheMismatchError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.StringCacheMismatchError.html#polars.exceptions.StringCacheMismatchError "polars.exceptions.StringCacheMismatchError") | Exception raised when string caches come from different sources. | | [`StructFieldNotFoundError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.StructFieldNotFoundError.html#polars.exceptions.StructFieldNotFoundError "polars.exceptions.StructFieldNotFoundError") | Exception raised when a specified Struct field is not found. | | [`TooManyRowsReturnedError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.TooManyRowsReturnedError.html#polars.exceptions.TooManyRowsReturnedError "polars.exceptions.TooManyRowsReturnedError") | Exception raised when more rows than expected are returned. | | [`UnsuitableSQLError`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.UnsuitableSQLError.html#polars.exceptions.UnsuitableSQLError "polars.exceptions.UnsuitableSQLError") | Exception raised when unsuitable SQL is given to a database method. | Warnings[#](https://docs.pola.rs/api/python/dev/reference/exceptions.html#warnings "Link to this heading") ----------------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`PolarsWarning`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.PolarsWarning.html#polars.exceptions.PolarsWarning "polars.exceptions.PolarsWarning") | Base class for all Polars warnings. | | [`CategoricalRemappingWarning`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.CategoricalRemappingWarning.html#polars.exceptions.CategoricalRemappingWarning "polars.exceptions.CategoricalRemappingWarning") | Warning issued when a categorical needs to be remapped to be compatible with another categorical. | | [`ChronoFormatWarning`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.ChronoFormatWarning.html#polars.exceptions.ChronoFormatWarning "polars.exceptions.ChronoFormatWarning") | Warning issued when a chrono format string contains dubious patterns. | | [`CustomUFuncWarning`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.CustomUFuncWarning.html#polars.exceptions.CustomUFuncWarning "polars.exceptions.CustomUFuncWarning") | Warning issued when a custom ufunc is handled differently than numpy ufunc would. | | [`DataOrientationWarning`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.DataOrientationWarning.html#polars.exceptions.DataOrientationWarning "polars.exceptions.DataOrientationWarning") | Warning issued to indicate row orientation was inferred from the inputs. | | [`MapWithoutReturnDtypeWarning`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.MapWithoutReturnDtypeWarning.html#polars.exceptions.MapWithoutReturnDtypeWarning "polars.exceptions.MapWithoutReturnDtypeWarning") | Warning issued when `map_elements` is performed without specifying the return dtype. | | [`PerformanceWarning`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.PerformanceWarning.html#polars.exceptions.PerformanceWarning "polars.exceptions.PerformanceWarning") | Warning issued to indicate potential performance pitfalls. | | [`PolarsInefficientMapWarning`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.PolarsInefficientMapWarning.html#polars.exceptions.PolarsInefficientMapWarning "polars.exceptions.PolarsInefficientMapWarning") | Warning issued when a potentially slow `map_*` operation is performed. | | [`UnstableWarning`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.UnstableWarning.html#polars.exceptions.UnstableWarning "polars.exceptions.UnstableWarning") | Warning issued when unstable functionality is used. | Panic[#](https://docs.pola.rs/api/python/dev/reference/exceptions.html#panic "Link to this heading") ----------------------------------------------------------------------------------------------------- | | | | --- | --- | | [`PanicException`](https://docs.pola.rs/api/python/dev/reference/api/polars.exceptions.PanicException.html#polars.exceptions.PanicException "polars.exceptions.PanicException") | Exception raised when an unexpected state causes a panic in the underlying Rust library. | On this page --- # Metadata — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/dev/reference/metadata.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Metadata[#](https://docs.pola.rs/api/python/dev/reference/metadata.html#metadata "Link to this heading") ========================================================================================================= | | | | --- | --- | | [`build_info`](https://docs.pola.rs/api/python/dev/reference/api/polars.build_info.html#polars.build_info "polars.build_info")
() | Return detailed Polars build information. | | [`get_index_type`](https://docs.pola.rs/api/python/dev/reference/api/polars.get_index_type.html#polars.get_index_type "polars.get_index_type")
() | Return the data type used for Polars indexing. | | [`show_versions`](https://docs.pola.rs/api/python/dev/reference/api/polars.show_versions.html#polars.show_versions "polars.show_versions")
() | Print out the version of Polars and its optional dependencies. | | [`thread_pool_size`](https://docs.pola.rs/api/python/dev/reference/api/polars.thread_pool_size.html#polars.thread_pool_size "polars.thread_pool_size")
() | Return the number of threads in the Polars thread pool. | | [`threadpool_size`](https://docs.pola.rs/api/python/dev/reference/api/polars.threadpool_size.html#polars.threadpool_size "polars.threadpool_size")
() | Return the number of threads in the Polars thread pool. | --- # df in polars - Rust [df](https://docs.pola.rs/api/rust/dev/polars/macro.df.html#) -------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Macro df Copy item path ======================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_core/utils/mod.rs.html#795) macro_rules! df { ($($col_name:expr => $slice:expr), + $(,)?) => { ... }; } --- # Testing — Polars documentation [Skip to main content](https://docs.pola.rs/api/python/dev/reference/testing.html#main-content) Back to top Ctrl+K Choose version * [GitHub](https://github.com/pola-rs/polars "GitHub") * [Discord](https://discord.gg/4UfP5cfBE7 "Discord") * [X/Twitter](https://x.com/datapolars "X/Twitter") * [Bluesky](https://bsky.app/profile/pola.rs "Bluesky") Testing[#](https://docs.pola.rs/api/python/dev/reference/testing.html#testing "Link to this heading") ====================================================================================================== The `testing` module provides a number of functions and helpers for use with unit tests. Note The `testing` module is not imported by default in order to optimise import speed of the primary `polars` module. Either import `polars.testing` and _then_ use that namespace, or import the specific functions you need from the full module path, e.g.: from polars.testing import assert\_frame\_equal, assert\_series\_equal Asserts[#](https://docs.pola.rs/api/python/dev/reference/testing.html#asserts "Link to this heading") ------------------------------------------------------------------------------------------------------ Polars provides some standard asserts for use with unit tests: | | | | --- | --- | | [`testing.assert_frame_equal`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.assert_frame_equal.html#polars.testing.assert_frame_equal "polars.testing.assert_frame_equal")
(left, right, \*\[, ...\]) | Assert that the left and right frame are equal. | | [`testing.assert_frame_not_equal`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.assert_frame_not_equal.html#polars.testing.assert_frame_not_equal "polars.testing.assert_frame_not_equal")
(left, right, \*) | Assert that the left and right frame are **not** equal. | | [`testing.assert_series_equal`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.assert_series_equal.html#polars.testing.assert_series_equal "polars.testing.assert_series_equal")
(left, right, \*) | Assert that the left and right Series are equal. | | [`testing.assert_series_not_equal`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.assert_series_not_equal.html#polars.testing.assert_series_not_equal "polars.testing.assert_series_not_equal")
(left, right, \*) | Assert that the left and right Series are **not** equal. | Parametric testing[#](https://docs.pola.rs/api/python/dev/reference/testing.html#parametric-testing "Link to this heading") ---------------------------------------------------------------------------------------------------------------------------- See the Hypothesis library for more details about property-based testing, strategies, and library integrations: * [Overview](https://hypothesis.readthedocs.io/) * [Quick start guide](https://hypothesis.readthedocs.io/en/latest/quickstart.html) ### Polars strategies[#](https://docs.pola.rs/api/python/dev/reference/testing.html#polars-strategies "Link to this heading") Polars provides the following [hypothesis](https://hypothesis.readthedocs.io/) testing strategies: | | | | --- | --- | | [`testing.parametric.dataframes`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.parametric.dataframes.html#polars.testing.parametric.dataframes "polars.testing.parametric.dataframes")
(\[cols, lazy, ...\]) | Hypothesis strategy for producing Polars DataFrames or LazyFrames. | | [`testing.parametric.dtypes`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.parametric.dtypes.html#polars.testing.parametric.dtypes "polars.testing.parametric.dtypes")
(\*\[, ...\]) | Create a strategy for generating Polars `DataType` objects. | | [`testing.parametric.lists`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.parametric.lists.html#polars.testing.parametric.lists "polars.testing.parametric.lists")
(inner\_dtype, \*\[, ...\]) | Create a strategy for generating lists of the given data type. | | [`testing.parametric.series`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.parametric.series.html#polars.testing.parametric.series "polars.testing.parametric.series")
(\*\[, name, dtype, ...\]) | Hypothesis strategy for producing Polars Series. | ### Strategy helpers[#](https://docs.pola.rs/api/python/dev/reference/testing.html#strategy-helpers "Link to this heading") | | | | --- | --- | | [`testing.parametric.column`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.parametric.column.html#polars.testing.parametric.column "polars.testing.parametric.column")
(\[name, dtype, ...\]) | Define a column for use with the `dataframes` strategy. | | [`testing.parametric.columns`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.parametric.columns.html#polars.testing.parametric.columns "polars.testing.parametric.columns")
(\[cols, dtype, ...\]) | Define multiple columns for use with the @dataframes strategy. | | [`testing.parametric.create_list_strategy`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.parametric.create_list_strategy.html#polars.testing.parametric.create_list_strategy "polars.testing.parametric.create_list_strategy")
(\[...\]) | Create a strategy for generating Polars `List` data. | ### Profiles[#](https://docs.pola.rs/api/python/dev/reference/testing.html#profiles "Link to this heading") Several standard/named [hypothesis](https://hypothesis.readthedocs.io/) profiles are provided: * `fast`: runs 100 iterations. * `balanced`: runs 1,000 iterations. * `expensive`: runs 10,000 iterations. The load/set helper functions allow you to access these profiles directly, set your preferred profile (default is `fast`), or set a custom number of iterations. | | | | --- | --- | | [`testing.parametric.load_profile`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.parametric.load_profile.html#polars.testing.parametric.load_profile "polars.testing.parametric.load_profile")
(\[profile, ...\]) | Load a named (or custom) hypothesis profile for use with the parametric tests. | | [`testing.parametric.set_profile`](https://docs.pola.rs/api/python/dev/reference/api/polars.testing.parametric.set_profile.html#polars.testing.parametric.set_profile "polars.testing.parametric.set_profile")
(profile) | Set the env var `POLARS_HYPOTHESIS_PROFILE` to the given profile name/value. | **Approximate profile timings:** Running polars’ own parametric unit tests on `0.17.6` against release and debug builds, on a machine with 12 cores, using `xdist -n auto` results in the following timings (these values are indicative only, and may vary significantly depending on your own hardware setup): | Profile | Iterations | Release | Debug | | --- | --- | --- | --- | | `fast` | 100 | ~6 secs | ~8 secs | | `balanced` | 1,000 | ~22 secs | ~30 secs | | `expensive` | 10,000 | ~3 mins 5 secs | ~4 mins 45 secs | ### Examples[#](https://docs.pola.rs/api/python/dev/reference/testing.html#examples "Link to this heading") **Basic:** Create a parametric unit test that will receive a series of generated DataFrames, each having 5 numeric columns with a 10% chance of any generated value being `null` (this is distinct from `NaN`). import polars as pl from polars.testing.parametric import dataframes from polars import NUMERIC\_DTYPES from hypothesis import given @given( dataframes( cols\=5, allow\_null\=True, allowed\_dtypes\=NUMERIC\_DTYPES, ) ) def test\_numeric(df: pl.DataFrame): assert all(df\[col\].dtype.is\_numeric() for col in df.columns) \# Example frame: \# ┌──────┬────────┬───────┬────────────┬────────────┐ \# │ col0 ┆ col1 ┆ col2 ┆ col3 ┆ col4 │ \# │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ \# │ u8 ┆ i16 ┆ u16 ┆ i32 ┆ f64 │ \# ╞══════╪════════╪═══════╪════════════╪════════════╡ \# │ 54 ┆ -29096 ┆ 485 ┆ 2147483647 ┆ -2.8257e14 │ \# │ null ┆ 7508 ┆ 37338 ┆ 7264 ┆ 1.5 │ \# │ 0 ┆ 321 ┆ null ┆ 16996 ┆ NaN │ \# │ 121 ┆ -361 ┆ 63204 ┆ 1 ┆ 1.1443e235 │ \# └──────┴────────┴───────┴────────────┴────────────┘ **Intermediate:** Integrate hypothesis-native strategies into specifically-named columns, generating a series of LazyFrames, with a minimum size of five rows and values that conform to the given strategies: import polars as pl from polars.testing.parametric import column, dataframes import hypothesis.strategies as st from hypothesis import given from string import ascii\_letters, digits id\_chars \= ascii\_letters + digits @given( dataframes( cols\=\[\ column("id", strategy\=st.text(min\_size\=4, max\_size\=4, alphabet\=id\_chars)),\ column("ccy", strategy\=st.sampled\_from(\["GBP", "EUR", "JPY", "USD"\])),\ column("price", strategy\=st.floats(min\_value\=0.0, max\_value\=1000.0)),\ \], min\_size\=5, lazy\=True, ) ) def test\_price\_calculations(lf: pl.LazyFrame): ... print(lf.collect()) \# Example frame: \# ┌──────┬─────┬─────────┐ \# │ id ┆ ccy ┆ price │ \# │ --- ┆ --- ┆ --- │ \# │ str ┆ str ┆ f64 │ \# ╞══════╪═════╪═════════╡ \# │ A101 ┆ GBP ┆ 1.1 │ \# │ 8nIn ┆ JPY ┆ 1.5 │ \# │ QHoO ┆ EUR ┆ 714.544 │ \# │ i0e0 ┆ GBP ┆ 0.0 │ \# │ 0000 ┆ USD ┆ 999.0 │ \# └──────┴─────┴─────────┘ **Advanced:** Create and use a `List[UInt8]` dtype strategy as a hypothesis [composite](https://hypothesis.readthedocs.io/en/latest/data.html#hypothesis.strategies.composite) that generates pairs of pairs of small integer values in which the first value in each nested pair is always less than or equal to the second value: import polars as pl from polars.testing.parametric import column, dataframes, lists import hypothesis.strategies as st from hypothesis import given @st.composite def uint8\_pairs(draw: st.DrawFn): uints \= lists(pl.UInt8, size\=2) pairs \= list(zip(draw(uints), draw(uints))) return \[sorted(ints) for ints in pairs\] @given( dataframes( cols\=\[\ column("colx", strategy\=uint8\_pairs()),\ column("coly", strategy\=uint8\_pairs()),\ column("colz", strategy\=uint8\_pairs()),\ \], min\_size\=3, max\_size\=3, ) ) def test\_miscellaneous(df: pl.DataFrame): ... \# Example frame: \# ┌─────────────────────────┬─────────────────────────┬──────────────────────────┐ \# │ colx ┆ coly ┆ colz │ \# │ --- ┆ --- ┆ --- │ \# │ list\[list\[i64\]\] ┆ list\[list\[i64\]\] ┆ list\[list\[i64\]\] │ \# ╞═════════════════════════╪═════════════════════════╪══════════════════════════╡ \# │ \[\[143, 235\], \[75, 101\]\] ┆ \[\[143, 235\], \[75, 101\]\] ┆ \[\[31, 41\], \[57, 250\]\] │ \# │ \[\[87, 186\], \[174, 179\]\] ┆ \[\[87, 186\], \[174, 179\]\] ┆ \[\[112, 213\], \[149, 221\]\] │ \# │ \[\[23, 85\], \[7, 86\]\] ┆ \[\[23, 85\], \[7, 86\]\] ┆ \[\[22, 255\], \[27, 28\]\] │ \# └─────────────────────────┴─────────────────────────┴──────────────────────────┘ On this page --- # VERSION in polars - Rust [VERSION](https://docs.pola.rs/api/rust/dev/polars/constant.VERSION.html#) --------------------------------------------------------------------------- [polars](https://docs.pola.rs/api/rust/dev/polars/index.html) Constant VERSION Copy item path =============================== [Source](https://docs.pola.rs/api/rust/dev/src/polars/lib.rs.html#436) pub const VERSION: &str = "0.52.0"; Expand description Polars crate version --- # polars_lazy::dsl - Rust [Module dsl](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html#) ---------------------------------------------------------------------------- [polars\_lazy](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html) Module dsl Copy item path ========================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_lazy/dsl/mod.rs.html#1-39) Expand description Domain specific language for the Lazy API. This DSL revolves around the [`Expr`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html "enum polars_lazy::dsl::Expr") type, which represents an abstract operation on a DataFrame, such as mapping over a column, filtering, group\_by, or aggregation. In general, functions on [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") s consume the [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") and produce a new [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") representing the result of applying the function and passed expressions to the consumed LazyFrame. At runtime, when [`LazyFrame::collect`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.collect "method polars_lazy::frame::LazyFrame::collect") is called, the expressions that comprise the [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") ’s logical plan are materialized on the actual underlying Series. For instance, `let expr = col("x").pow(lit(2)).alias("x2");` would produce an expression representing the abstract operation of squaring the column `"x"` and naming the resulting column `"x2"`, and to apply this operation to a [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") , you’d use `let lazy_df = lazy_df.with_column(expr);`. (Of course, a column named `"x"` must either exist in the original DataFrame or be produced by one of the preceding operations on the [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") .) There are many, many free functions that this module exports that produce an [`Expr`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html "enum polars_lazy::dsl::Expr") from scratch; [`col`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.col.html "fn polars_lazy::dsl::functions::col") and [`lit`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.lit.html "fn polars_lazy::dsl::functions::lit") are two examples. Expressions also have several methods, such as [`pow`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.pow "method polars_lazy::dsl::Expr::pow") and [`alias`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.alias "method polars_lazy::dsl::Expr::alias") , that consume them and produce a new expression. Several expressions are only available when the necessary feature is enabled. Examples of features that unlock specialized expression include `string`, `temporal`, and `dtype-categorical`. These specialized expressions provide implementations of functions that you’d otherwise have to implement by hand. Because of how abstract and flexible the [`Expr`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html "enum polars_lazy::dsl::Expr") type is, care must be take to ensure you only attempt to perform sensible operations with them. For instance, as mentioned above, you have to make sure any columns you reference already exist in the LazyFrame. Furthermore, there is nothing stopping you from calling, for example, [`any`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html#method.any "method polars_lazy::dsl::Expr::any") with an expression that will yield an `f64` column (instead of `bool`), or `col("string") - col("f64")`, which would attempt to subtract an `f64` Series from a `string` Series. These kinds of invalid operations will only yield an error at runtime, when [`collect`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html#method.collect "method polars_lazy::frame::LazyFrame::collect") is called on the [`LazyFrame`](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") . Re-exports[§](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html#reexports) -------------------------------------------------------------------------------------- `pub use [functions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/index.html "mod polars_lazy::dsl::functions") ::*;` Modules[§](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html#modules) --------------------------------------------------------------------------------- [anonymous](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/index.html "mod polars_lazy::dsl::anonymous") [binary](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/binary/index.html "mod polars_lazy::dsl::binary") [cat](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/cat/index.html "mod polars_lazy::dsl::cat") `dtype-categorical` [default\_values](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/default_values/index.html "mod polars_lazy::dsl::default_values") [deletion](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/deletion/index.html "mod polars_lazy::dsl::deletion") [dt](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/index.html "mod polars_lazy::dsl::dt") `temporal` [file\_provider](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/file_provider/index.html "mod polars_lazy::dsl::file_provider") [function\_expr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/index.html "mod polars_lazy::dsl::function_expr") [functions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/index.html "mod polars_lazy::dsl::functions") Functions [python\_dataset](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dataset/index.html "mod polars_lazy::dsl::python_dataset") `python` [python\_dsl](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dsl/index.html "mod polars_lazy::dsl::python_dsl") `python` [sink](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/index.html "mod polars_lazy::dsl::sink") [string](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/index.html "mod polars_lazy::dsl::string") `strings` [udf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/udf/index.html "mod polars_lazy::dsl::udf") Structs[§](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html#structs) --------------------------------------------------------------------------------- [AnonymousScanOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.AnonymousScanOptions.html "struct polars_lazy::dsl::AnonymousScanOptions") [ArrayNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ArrayNameSpace.html "struct polars_lazy::dsl::ArrayNameSpace") Specialized expressions for [`Series`](https://docs.pola.rs/api/rust/dev/polars_core/series/struct.Series.html "struct polars_core::series::Series") of [`DataType::Array`](https://docs.pola.rs/api/rust/dev/polars_core/datatypes/dtype/enum.DataType.html#variant.Array "variant polars_core::datatypes::dtype::DataType::Array") . [BaseColumnUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.BaseColumnUdf.html "struct polars_lazy::dsl::BaseColumnUdf") [CallbackSinkType](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.CallbackSinkType.html "struct polars_lazy::dsl::CallbackSinkType") [CastColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.CastColumnsPolicy.html "struct polars_lazy::dsl::CastColumnsPolicy") Used by scans. [CategoricalNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.CategoricalNameSpace.html "struct polars_lazy::dsl::CategoricalNameSpace") Specialized expressions for Categorical dtypes. [ChainedThen](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ChainedThen.html "struct polars_lazy::dsl::ChainedThen") Utility struct for the `when-then-otherwise` expression. [ChainedWhen](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ChainedWhen.html "struct polars_lazy::dsl::ChainedWhen") Utility struct for the `when-then-otherwise` expression. [DistinctOptionsDSL](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.DistinctOptionsDSL.html "struct polars_lazy::dsl::DistinctOptionsDSL") [DslBuilder](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.DslBuilder.html "struct polars_lazy::dsl::DslBuilder") [ExprNameNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ExprNameNameSpace.html "struct polars_lazy::dsl::ExprNameNameSpace") Specialized expressions for modifying the name of existing expressions. [ExtensionNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ExtensionNameSpace.html "struct polars_lazy::dsl::ExtensionNameSpace") Specialized expressions for Categorical dtypes. [FileSinkOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.FileSinkOptions.html "struct polars_lazy::dsl::FileSinkOptions") [GroupbyOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.GroupbyOptions.html "struct polars_lazy::dsl::GroupbyOptions") [HConcatOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.HConcatOptions.html "struct polars_lazy::dsl::HConcatOptions") [JoinOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.JoinOptions.html "struct polars_lazy::dsl::JoinOptions") [JoinOptionsIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.JoinOptionsIR.html "struct polars_lazy::dsl::JoinOptionsIR") [ListNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ListNameSpace.html "struct polars_lazy::dsl::ListNameSpace") Specialized expressions for [`Series`](https://docs.pola.rs/api/rust/dev/polars_core/series/struct.Series.html "struct polars_core::series::Series") of [`DataType::List`](https://docs.pola.rs/api/rust/dev/polars_core/datatypes/dtype/enum.DataType.html#variant.List "variant polars_core::datatypes::dtype::DataType::List") . [LogicalPlanUdfOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.LogicalPlanUdfOptions.html "struct polars_lazy::dsl::LogicalPlanUdfOptions") [MatchToSchemaPerColumn](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.MatchToSchemaPerColumn.html "struct polars_lazy::dsl::MatchToSchemaPerColumn") [MetaNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.MetaNameSpace.html "struct polars_lazy::dsl::MetaNameSpace") Specialized expressions for Categorical dtypes. [NDJsonReadOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.NDJsonReadOptions.html "struct polars_lazy::dsl::NDJsonReadOptions") `json` [PartitionedSinkOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.PartitionedSinkOptions.html "struct polars_lazy::dsl::PartitionedSinkOptions") [PartitionedSinkOptionsIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.PartitionedSinkOptionsIR.html "struct polars_lazy::dsl::PartitionedSinkOptionsIR") [PlanSerializationContext](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.PlanSerializationContext.html "struct polars_lazy::dsl::PlanSerializationContext") [PredicateFileSkip](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.PredicateFileSkip.html "struct polars_lazy::dsl::PredicateFileSkip") [PythonDatasetProviderVTable](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.PythonDatasetProviderVTable.html "struct polars_lazy::dsl::PythonDatasetProviderVTable") [RollingCovOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.RollingCovOptions.html "struct polars_lazy::dsl::RollingCovOptions") [ScanFlags](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ScanFlags.html "struct polars_lazy::dsl::ScanFlags") [ScanSourceIter](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ScanSourceIter.html "struct polars_lazy::dsl::ScanSourceIter") An iterator for [`ScanSources`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ScanSources.html "enum polars_lazy::dsl::ScanSources") [SpecialEq](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.SpecialEq.html "struct polars_lazy::dsl::SpecialEq") Wrapper type that has special equality properties depending on the inner type specialization [StrptimeOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.StrptimeOptions.html "struct polars_lazy::dsl::StrptimeOptions") [StructNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.StructNameSpace.html "struct polars_lazy::dsl::StructNameSpace") Specialized expressions for Struct dtypes. [TableStatistics](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.TableStatistics.html "struct polars_lazy::dsl::TableStatistics") [Then](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.Then.html "struct polars_lazy::dsl::Then") Utility struct for the `when-then-otherwise` expression. [TimeUnitSet](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.TimeUnitSet.html "struct polars_lazy::dsl::TimeUnitSet") [UnifiedScanArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UnifiedScanArgs.html "struct polars_lazy::dsl::UnifiedScanArgs") Scan arguments shared across different scan types. [UnifiedSinkArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UnifiedSinkArgs.html "struct polars_lazy::dsl::UnifiedSinkArgs") [UnionArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UnionArgs.html "struct polars_lazy::dsl::UnionArgs") [UnionOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UnionOptions.html "struct polars_lazy::dsl::UnionOptions") [UnpivotArgsDSL](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UnpivotArgsDSL.html "struct polars_lazy::dsl::UnpivotArgsDSL") [UserDefinedFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UserDefinedFunction.html "struct polars_lazy::dsl::UserDefinedFunction") Represents a user-defined function [When](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.When.html "struct polars_lazy::dsl::When") Utility struct for the `when-then-otherwise` expression. Enums[§](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html#enums) ----------------------------------------------------------------------------- [AggExpr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.AggExpr.html "enum polars_lazy::dsl::AggExpr") [ArrayDataTypeFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ArrayDataTypeFunction.html "enum polars_lazy::dsl::ArrayDataTypeFunction") [ArrayFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ArrayFunction.html "enum polars_lazy::dsl::ArrayFunction") [BinaryFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.BinaryFunction.html "enum polars_lazy::dsl::BinaryFunction") [BitwiseFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.BitwiseFunction.html "enum polars_lazy::dsl::BitwiseFunction") [BooleanFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.BooleanFunction.html "enum polars_lazy::dsl::BooleanFunction") [BusinessFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.BusinessFunction.html "enum polars_lazy::dsl::BusinessFunction") [CategoricalFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.CategoricalFunction.html "enum polars_lazy::dsl::CategoricalFunction") [ColumnMapping](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ColumnMapping.html "enum polars_lazy::dsl::ColumnMapping") [CorrelationMethod](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.CorrelationMethod.html "enum polars_lazy::dsl::CorrelationMethod") [DataTypeExpr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DataTypeExpr.html "enum polars_lazy::dsl::DataTypeExpr") [DataTypeFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DataTypeFunction.html "enum polars_lazy::dsl::DataTypeFunction") [DataTypeSelector](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DataTypeSelector.html "enum polars_lazy::dsl::DataTypeSelector") [DateRangeArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DateRangeArgs.html "enum polars_lazy::dsl::DateRangeArgs") `dtype-date` or `dtype-datetime` [DslPlan](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DslPlan.html "enum polars_lazy::dsl::DslPlan") [Engine](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Engine.html "enum polars_lazy::dsl::Engine") [EvalVariant](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.EvalVariant.html "enum polars_lazy::dsl::EvalVariant") [Excluded](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Excluded.html "enum polars_lazy::dsl::Excluded") [Expr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html "enum polars_lazy::dsl::Expr") Expressions that can be used in various contexts. [ExtensionFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ExtensionFunction.html "enum polars_lazy::dsl::ExtensionFunction") [ExtraColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ExtraColumnsPolicy.html "enum polars_lazy::dsl::ExtraColumnsPolicy") [FileScanDsl](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.FileScanDsl.html "enum polars_lazy::dsl::FileScanDsl") Note: This is cheaply cloneable. [FileScanIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.FileScanIR.html "enum polars_lazy::dsl::FileScanIR") Note: This is cheaply cloneable. [FileWriteFormat](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.FileWriteFormat.html "enum polars_lazy::dsl::FileWriteFormat") [FunctionExpr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.FunctionExpr.html "enum polars_lazy::dsl::FunctionExpr") [JoinTypeOptionsIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.JoinTypeOptionsIR.html "enum polars_lazy::dsl::JoinTypeOptionsIR") [LazySerde](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.LazySerde.html "enum polars_lazy::dsl::LazySerde") [ListFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ListFunction.html "enum polars_lazy::dsl::ListFunction") [MissingColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.MissingColumnsPolicy.html "enum polars_lazy::dsl::MissingColumnsPolicy") [MissingColumnsPolicyOrExpr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.MissingColumnsPolicyOrExpr.html "enum polars_lazy::dsl::MissingColumnsPolicyOrExpr") [Operator](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Operator.html "enum polars_lazy::dsl::Operator") [PartitionStrategy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.PartitionStrategy.html "enum polars_lazy::dsl::PartitionStrategy") [PartitionStrategyIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.PartitionStrategyIR.html "enum polars_lazy::dsl::PartitionStrategyIR") [PowFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.PowFunction.html "enum polars_lazy::dsl::PowFunction") [RandomMethod](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.RandomMethod.html "enum polars_lazy::dsl::RandomMethod") [RangeFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.RangeFunction.html "enum polars_lazy::dsl::RangeFunction") [RenameAliasFn](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.RenameAliasFn.html "enum polars_lazy::dsl::RenameAliasFn") [ReshapeDimension](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ReshapeDimension.html "enum polars_lazy::dsl::ReshapeDimension") A dimension in a reshape. [RollingFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.RollingFunction.html "enum polars_lazy::dsl::RollingFunction") [RollingFunctionBy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.RollingFunctionBy.html "enum polars_lazy::dsl::RollingFunctionBy") [ScanSource](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ScanSource.html "enum polars_lazy::dsl::ScanSource") A single source to scan from [ScanSourceRef](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ScanSourceRef.html "enum polars_lazy::dsl::ScanSourceRef") A reference to a single item in [`ScanSources`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ScanSources.html "enum polars_lazy::dsl::ScanSources") [ScanSources](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ScanSources.html "enum polars_lazy::dsl::ScanSources") Set of sources to scan from [Selector](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Selector.html "enum polars_lazy::dsl::Selector") [SinkDestination](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.SinkDestination.html "enum polars_lazy::dsl::SinkDestination") [SinkTarget](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.SinkTarget.html "enum polars_lazy::dsl::SinkTarget") [SinkType](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.SinkType.html "enum polars_lazy::dsl::SinkType") [SinkTypeIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.SinkTypeIR.html "enum polars_lazy::dsl::SinkTypeIR") [StringFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.StringFunction.html "enum polars_lazy::dsl::StringFunction") [StructDataTypeFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.StructDataTypeFunction.html "enum polars_lazy::dsl::StructDataTypeFunction") [StructFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.StructFunction.html "enum polars_lazy::dsl::StructFunction") [TemporalFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.TemporalFunction.html "enum polars_lazy::dsl::TemporalFunction") [TimeZoneSet](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.TimeZoneSet.html "enum polars_lazy::dsl::TimeZoneSet") [TrigonometricFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.TrigonometricFunction.html "enum polars_lazy::dsl::TrigonometricFunction") [UpcastOrForbid](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.UpcastOrForbid.html "enum polars_lazy::dsl::UpcastOrForbid") [WindowMapping](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.WindowMapping.html "enum polars_lazy::dsl::WindowMapping") Constants[§](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html#constants) ------------------------------------------------------------------------------------- [DSL\_VERSION](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/constant.DSL_VERSION.html "constant polars_lazy::dsl::DSL_VERSION") Statics[§](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html#statics) --------------------------------------------------------------------------------- [DATASET\_PROVIDER\_VTABLE](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/static.DATASET_PROVIDER_VTABLE.html "static polars_lazy::dsl::DATASET_PROVIDER_VTABLE") This is for `polars-python` to inject so that the implementation can be done there: Traits[§](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html#traits) ------------------------------------------------------------------------------- [AnonymousColumnsUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/trait.AnonymousColumnsUdf.html "trait polars_lazy::dsl::AnonymousColumnsUdf") [AnonymousStreamingAgg](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/trait.AnonymousStreamingAgg.html "trait polars_lazy::dsl::AnonymousStreamingAgg") [ColumnsUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/trait.ColumnsUdf.html "trait polars_lazy::dsl::ColumnsUdf") A wrapper trait for any closure `Fn(Vec) -> PolarsResult` [UdfSchema](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/trait.UdfSchema.html "trait polars_lazy::dsl::UdfSchema") Functions[§](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html#functions) ------------------------------------------------------------------------------------- [apply\_multiple](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.apply_multiple.html "fn polars_lazy::dsl::apply_multiple") Apply a function/closure over the groups of multiple columns. This should only be used in a group\_by aggregation. [binary\_expr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.binary_expr.html "fn polars_lazy::dsl::binary_expr") Compute `op(l, r)` (or equivalently `l op r`). `l` and `r` must have types compatible with the Operator. [map\_multiple](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.map_multiple.html "fn polars_lazy::dsl::map_multiple") Apply a function/closure over multiple columns once the logical plan get executed. [new\_column\_udf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.new_column_udf.html "fn polars_lazy::dsl::new_column_udf") [ternary\_expr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.ternary_expr.html "fn polars_lazy::dsl::ternary_expr") [when](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.when.html "fn polars_lazy::dsl::when") Start a `when-then-otherwise` expression. Type Aliases[§](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html#types) ------------------------------------------------------------------------------------ [DslNameGenerator](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/type.DslNameGenerator.html "type polars_lazy::dsl::DslNameGenerator") `array_to_struct` or `list_to_struct` [FieldsNameMapper](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/type.FieldsNameMapper.html "type polars_lazy::dsl::FieldsNameMapper") `dtype-struct` [OpaqueColumnUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/type.OpaqueColumnUdf.html "type polars_lazy::dsl::OpaqueColumnUdf") [OpaqueStreamingAgg](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/type.OpaqueStreamingAgg.html "type polars_lazy::dsl::OpaqueStreamingAgg") [RenameAliasRustFn](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/type.RenameAliasRustFn.html "type polars_lazy::dsl::RenameAliasRustFn") --- # List of all items in this crate [All](https://docs.pola.rs/api/rust/dev/polars_lazy/all.html#) --------------------------------------------------------------- List of all items ================= ### Structs * [dsl::AnonymousScanOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.AnonymousScanOptions.html) * [dsl::ArrayNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ArrayNameSpace.html) * [dsl::BaseColumnUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.BaseColumnUdf.html) * [dsl::CallbackSinkType](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.CallbackSinkType.html) * [dsl::CastColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.CastColumnsPolicy.html) * [dsl::CategoricalNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.CategoricalNameSpace.html) * [dsl::ChainedThen](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ChainedThen.html) * [dsl::ChainedWhen](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ChainedWhen.html) * [dsl::DistinctOptionsDSL](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.DistinctOptionsDSL.html) * [dsl::DslBuilder](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.DslBuilder.html) * [dsl::ExprNameNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ExprNameNameSpace.html) * [dsl::ExtensionNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ExtensionNameSpace.html) * [dsl::FileSinkOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.FileSinkOptions.html) * [dsl::GroupbyOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.GroupbyOptions.html) * [dsl::HConcatOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.HConcatOptions.html) * [dsl::JoinOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.JoinOptions.html) * [dsl::JoinOptionsIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.JoinOptionsIR.html) * [dsl::ListNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ListNameSpace.html) * [dsl::LogicalPlanUdfOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.LogicalPlanUdfOptions.html) * [dsl::MatchToSchemaPerColumn](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.MatchToSchemaPerColumn.html) * [dsl::MetaNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.MetaNameSpace.html) * [dsl::NDJsonReadOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.NDJsonReadOptions.html) * [dsl::PartitionedSinkOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.PartitionedSinkOptions.html) * [dsl::PartitionedSinkOptionsIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.PartitionedSinkOptionsIR.html) * [dsl::PlanSerializationContext](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.PlanSerializationContext.html) * [dsl::PredicateFileSkip](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.PredicateFileSkip.html) * [dsl::PythonDatasetProviderVTable](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.PythonDatasetProviderVTable.html) * [dsl::RollingCovOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.RollingCovOptions.html) * [dsl::ScanFlags](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ScanFlags.html) * [dsl::ScanSourceIter](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.ScanSourceIter.html) * [dsl::SpecialEq](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.SpecialEq.html) * [dsl::StrptimeOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.StrptimeOptions.html) * [dsl::StructNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.StructNameSpace.html) * [dsl::TableStatistics](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.TableStatistics.html) * [dsl::Then](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.Then.html) * [dsl::TimeUnitSet](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.TimeUnitSet.html) * [dsl::UnifiedScanArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UnifiedScanArgs.html) * [dsl::UnifiedSinkArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UnifiedSinkArgs.html) * [dsl::UnionArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UnionArgs.html) * [dsl::UnionOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UnionOptions.html) * [dsl::UnpivotArgsDSL](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UnpivotArgsDSL.html) * [dsl::UserDefinedFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.UserDefinedFunction.html) * [dsl::When](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/struct.When.html) * [dsl::anonymous::BaseColumnUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/struct.BaseColumnUdf.html) * [dsl::anonymous::SpecialEq](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/struct.SpecialEq.html) * [dsl::binary::BinaryNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/binary/struct.BinaryNameSpace.html) * [dsl::cat::CategoricalNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/cat/struct.CategoricalNameSpace.html) * [dsl::default\_values::IcebergIdentityTransformedPartitionFields](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/default_values/struct.IcebergIdentityTransformedPartitionFields.html) * [dsl::dt::DateLikeNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/dt/struct.DateLikeNameSpace.html) * [dsl::file\_provider::FileProviderArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/file_provider/struct.FileProviderArgs.html) * [dsl::file\_provider::HivePathProvider](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/file_provider/struct.HivePathProvider.html) * [dsl::functions::ChainedThen](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/struct.ChainedThen.html) * [dsl::functions::ChainedWhen](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/struct.ChainedWhen.html) * [dsl::functions::DatetimeArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/struct.DatetimeArgs.html) * [dsl::functions::DurationArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/struct.DurationArgs.html) * [dsl::functions::Then](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/struct.Then.html) * [dsl::functions::When](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/struct.When.html) * [dsl::python\_dataset::PythonDatasetProvider](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dataset/struct.PythonDatasetProvider.html) * [dsl::python\_dataset::PythonDatasetProviderVTable](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dataset/struct.PythonDatasetProviderVTable.html) * [dsl::python\_dsl::PythonOptionsDsl](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dsl/struct.PythonOptionsDsl.html) * [dsl::python\_dsl::PythonUdfExpression](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dsl/struct.PythonUdfExpression.html) * [dsl::sink::CallbackSinkType](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/struct.CallbackSinkType.html) * [dsl::sink::FileSinkOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/struct.FileSinkOptions.html) * [dsl::sink::PartitionedSinkOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/struct.PartitionedSinkOptions.html) * [dsl::sink::PartitionedSinkOptionsIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/struct.PartitionedSinkOptionsIR.html) * [dsl::sink::UnifiedSinkArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/struct.UnifiedSinkArgs.html) * [dsl::string::StringNameSpace](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/string/struct.StringNameSpace.html) * [dsl::udf::UserDefinedFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/udf/struct.UserDefinedFunction.html) * [frame::CollectBatches](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.CollectBatches.html) * [frame::InProcessQuery](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.InProcessQuery.html) * [frame::JoinBuilder](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.JoinBuilder.html) * [frame::LazyCsvReader](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyCsvReader.html) * [frame::LazyFrame](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html) * [frame::LazyGroupBy](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyGroupBy.html) * [frame::LazyJsonLineReader](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyJsonLineReader.html) * [frame::OptFlags](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.OptFlags.html) * [frame::ScanArgsAnonymous](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.ScanArgsAnonymous.html) * [frame::ScanArgsParquet](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.ScanArgsParquet.html) * [prelude::AnonymousScanArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.AnonymousScanArgs.html) * [prelude::AnonymousScanOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.AnonymousScanOptions.html) * [prelude::CsvWriterOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.CsvWriterOptions.html) * [prelude::Duration](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.Duration.html) * [prelude::DynamicGroupOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.DynamicGroupOptions.html) * [prelude::IpcWriterOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.IpcWriterOptions.html) * [prelude::JoinArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.JoinArgs.html) * [prelude::JsonWriterOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.JsonWriterOptions.html) * [prelude::Null](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.Null.html) * [prelude::ParquetWriteOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.ParquetWriteOptions.html) * [prelude::RankOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.RankOptions.html) * [prelude::RollingGroupOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.RollingGroupOptions.html) * [prelude::UnionArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.UnionArgs.html) ### Enums * [dsl::AggExpr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.AggExpr.html) * [dsl::ArrayDataTypeFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ArrayDataTypeFunction.html) * [dsl::ArrayFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ArrayFunction.html) * [dsl::BinaryFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.BinaryFunction.html) * [dsl::BitwiseFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.BitwiseFunction.html) * [dsl::BooleanFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.BooleanFunction.html) * [dsl::BusinessFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.BusinessFunction.html) * [dsl::CategoricalFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.CategoricalFunction.html) * [dsl::ColumnMapping](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ColumnMapping.html) * [dsl::CorrelationMethod](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.CorrelationMethod.html) * [dsl::DataTypeExpr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DataTypeExpr.html) * [dsl::DataTypeFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DataTypeFunction.html) * [dsl::DataTypeSelector](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DataTypeSelector.html) * [dsl::DateRangeArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DateRangeArgs.html) * [dsl::DslPlan](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DslPlan.html) * [dsl::Engine](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Engine.html) * [dsl::EvalVariant](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.EvalVariant.html) * [dsl::Excluded](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Excluded.html) * [dsl::Expr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Expr.html) * [dsl::ExtensionFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ExtensionFunction.html) * [dsl::ExtraColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ExtraColumnsPolicy.html) * [dsl::FileScanDsl](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.FileScanDsl.html) * [dsl::FileScanIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.FileScanIR.html) * [dsl::FileWriteFormat](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.FileWriteFormat.html) * [dsl::FunctionExpr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.FunctionExpr.html) * [dsl::JoinTypeOptionsIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.JoinTypeOptionsIR.html) * [dsl::LazySerde](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.LazySerde.html) * [dsl::ListFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ListFunction.html) * [dsl::MissingColumnsPolicy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.MissingColumnsPolicy.html) * [dsl::MissingColumnsPolicyOrExpr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.MissingColumnsPolicyOrExpr.html) * [dsl::Operator](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Operator.html) * [dsl::PartitionStrategy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.PartitionStrategy.html) * [dsl::PartitionStrategyIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.PartitionStrategyIR.html) * [dsl::PowFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.PowFunction.html) * [dsl::RandomMethod](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.RandomMethod.html) * [dsl::RangeFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.RangeFunction.html) * [dsl::RenameAliasFn](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.RenameAliasFn.html) * [dsl::ReshapeDimension](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ReshapeDimension.html) * [dsl::RollingFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.RollingFunction.html) * [dsl::RollingFunctionBy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.RollingFunctionBy.html) * [dsl::ScanSource](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ScanSource.html) * [dsl::ScanSourceRef](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ScanSourceRef.html) * [dsl::ScanSources](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.ScanSources.html) * [dsl::Selector](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.Selector.html) * [dsl::SinkDestination](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.SinkDestination.html) * [dsl::SinkTarget](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.SinkTarget.html) * [dsl::SinkType](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.SinkType.html) * [dsl::SinkTypeIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.SinkTypeIR.html) * [dsl::StringFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.StringFunction.html) * [dsl::StructDataTypeFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.StructDataTypeFunction.html) * [dsl::StructFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.StructFunction.html) * [dsl::TemporalFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.TemporalFunction.html) * [dsl::TimeZoneSet](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.TimeZoneSet.html) * [dsl::TrigonometricFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.TrigonometricFunction.html) * [dsl::UpcastOrForbid](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.UpcastOrForbid.html) * [dsl::WindowMapping](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.WindowMapping.html) * [dsl::default\_values::DefaultFieldValues](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/default_values/enum.DefaultFieldValues.html) * [dsl::deletion::DeletionFilesList](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/deletion/enum.DeletionFilesList.html) * [dsl::file\_provider::FileProviderReturn](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/file_provider/enum.FileProviderReturn.html) * [dsl::file\_provider::FileProviderType](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/file_provider/enum.FileProviderType.html) * [dsl::function\_expr::ArrayFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.ArrayFunction.html) * [dsl::function\_expr::BinaryFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.BinaryFunction.html) * [dsl::function\_expr::BitwiseFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.BitwiseFunction.html) * [dsl::function\_expr::BooleanFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.BooleanFunction.html) * [dsl::function\_expr::BusinessFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.BusinessFunction.html) * [dsl::function\_expr::CategoricalFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.CategoricalFunction.html) * [dsl::function\_expr::CorrelationMethod](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.CorrelationMethod.html) * [dsl::function\_expr::DateRangeArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.DateRangeArgs.html) * [dsl::function\_expr::ExtensionFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.ExtensionFunction.html) * [dsl::function\_expr::FunctionExpr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.FunctionExpr.html) * [dsl::function\_expr::ListFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.ListFunction.html) * [dsl::function\_expr::PowFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.PowFunction.html) * [dsl::function\_expr::RandomMethod](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.RandomMethod.html) * [dsl::function\_expr::RangeFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.RangeFunction.html) * [dsl::function\_expr::ReshapeDimension](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.ReshapeDimension.html) * [dsl::function\_expr::RollingFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.RollingFunction.html) * [dsl::function\_expr::RollingFunctionBy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.RollingFunctionBy.html) * [dsl::function\_expr::StringFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.StringFunction.html) * [dsl::function\_expr::StructFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.StructFunction.html) * [dsl::function\_expr::TemporalFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.TemporalFunction.html) * [dsl::function\_expr::TrigonometricFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/enum.TrigonometricFunction.html) * [dsl::python\_dsl::PythonScanSource](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dsl/enum.PythonScanSource.html) * [dsl::sink::PartitionStrategy](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/enum.PartitionStrategy.html) * [dsl::sink::PartitionStrategyIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/enum.PartitionStrategyIR.html) * [dsl::sink::SinkDestination](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/enum.SinkDestination.html) * [dsl::sink::SinkTarget](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/enum.SinkTarget.html) * [dsl::sink::SinkType](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/enum.SinkType.html) * [dsl::sink::SinkTypeIR](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/sink/enum.SinkTypeIR.html) * [prelude::JoinType](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/enum.JoinType.html) * [prelude::JoinValidation](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/enum.JoinValidation.html) * [prelude::LiteralValue](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/enum.LiteralValue.html) * [prelude::PlanCallback](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/enum.PlanCallback.html) * [prelude::RankMethod](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/enum.RankMethod.html) ### Traits * [dsl::AnonymousColumnsUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/trait.AnonymousColumnsUdf.html) * [dsl::AnonymousStreamingAgg](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/trait.AnonymousStreamingAgg.html) * [dsl::ColumnsUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/trait.ColumnsUdf.html) * [dsl::UdfSchema](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/trait.UdfSchema.html) * [dsl::anonymous::AnonymousColumnsUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/trait.AnonymousColumnsUdf.html) * [dsl::anonymous::AnonymousStreamingAgg](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/trait.AnonymousStreamingAgg.html) * [dsl::anonymous::ColumnsUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/trait.ColumnsUdf.html) * [dsl::anonymous::named\_serde::ExprRegistry](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/named_serde/trait.ExprRegistry.html) * [frame::IntoLazy](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/trait.IntoLazy.html) * [frame::LazyFileListReader](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/trait.LazyFileListReader.html) * [prelude::AnonymousScan](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/trait.AnonymousScan.html) * [prelude::Literal](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/trait.Literal.html) * [prelude::PolarsTemporalGroupby](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/trait.PolarsTemporalGroupby.html) ### Macros * [fallible](https://docs.pola.rs/api/rust/dev/polars_lazy/macro.fallible.html) ### Functions * [dsl::anonymous::named\_serde::set\_named\_serde\_registry](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/named_serde/fn.set_named_serde_registry.html) * [dsl::anonymous::new\_column\_udf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/fn.new_column_udf.html) * [dsl::apply\_multiple](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.apply_multiple.html) * [dsl::binary\_expr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.binary_expr.html) * [dsl::functions::all](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.all.html) * [dsl::functions::all\_horizontal](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.all_horizontal.html) * [dsl::functions::any\_horizontal](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.any_horizontal.html) * [dsl::functions::arange](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.arange.html) * [dsl::functions::arg\_sort\_by](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.arg_sort_by.html) * [dsl::functions::arg\_where](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.arg_where.html) * [dsl::functions::as\_struct](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.as_struct.html) * [dsl::functions::avg](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.avg.html) * [dsl::functions::binary\_expr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.binary_expr.html) * [dsl::functions::business\_day\_count](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.business_day_count.html) * [dsl::functions::by\_name](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.by_name.html) * [dsl::functions::cast](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.cast.html) * [dsl::functions::coalesce](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.coalesce.html) * [dsl::functions::col](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.col.html) * [dsl::functions::cols](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.cols.html) * [dsl::functions::concat](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat.html) * [dsl::functions::concat\_arr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat_arr.html) * [dsl::functions::concat\_expr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat_expr.html) * [dsl::functions::concat\_lf\_diagonal](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat_lf_diagonal.html) * [dsl::functions::concat\_lf\_horizontal](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat_lf_horizontal.html) * [dsl::functions::concat\_list](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat_list.html) * [dsl::functions::concat\_str](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.concat_str.html) * [dsl::functions::cov](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.cov.html) * [dsl::functions::cum\_fold\_exprs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.cum_fold_exprs.html) * [dsl::functions::cum\_reduce\_exprs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.cum_reduce_exprs.html) * [dsl::functions::date\_range](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.date_range.html) * [dsl::functions::date\_ranges](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.date_ranges.html) * [dsl::functions::datetime](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.datetime.html) * [dsl::functions::datetime\_range](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.datetime_range.html) * [dsl::functions::datetime\_ranges](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.datetime_ranges.html) * [dsl::functions::dtype\_col](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.dtype_col.html) * [dsl::functions::dtype\_cols](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.dtype_cols.html) * [dsl::functions::duration](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.duration.html) * [dsl::functions::element](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.element.html) * [dsl::functions::empty](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.empty.html) * [dsl::functions::first](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.first.html) * [dsl::functions::fold\_exprs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.fold_exprs.html) * [dsl::functions::format\_str](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.format_str.html) * [dsl::functions::index\_cols](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.index_cols.html) * [dsl::functions::int\_range](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.int_range.html) * [dsl::functions::int\_ranges](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.int_ranges.html) * [dsl::functions::is\_not\_null](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.is_not_null.html) * [dsl::functions::is\_null](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.is_null.html) * [dsl::functions::last](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.last.html) * [dsl::functions::len](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.len.html) * [dsl::functions::linear\_space](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.linear_space.html) * [dsl::functions::linear\_spaces](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.linear_spaces.html) * [dsl::functions::lit](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.lit.html) * [dsl::functions::max](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.max.html) * [dsl::functions::max\_horizontal](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.max_horizontal.html) * [dsl::functions::mean](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.mean.html) * [dsl::functions::mean\_horizontal](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.mean_horizontal.html) * [dsl::functions::median](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.median.html) * [dsl::functions::min](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.min.html) * [dsl::functions::min\_horizontal](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.min_horizontal.html) * [dsl::functions::not](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.not.html) * [dsl::functions::nth](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.nth.html) * [dsl::functions::pearson\_corr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.pearson_corr.html) * [dsl::functions::quantile](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.quantile.html) * [dsl::functions::reduce\_exprs](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.reduce_exprs.html) * [dsl::functions::repeat](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.repeat.html) * [dsl::functions::rolling\_corr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.rolling_corr.html) * [dsl::functions::rolling\_cov](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.rolling_cov.html) * [dsl::functions::spearman\_rank\_corr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.spearman_rank_corr.html) * [dsl::functions::sum](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.sum.html) * [dsl::functions::sum\_horizontal](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.sum_horizontal.html) * [dsl::functions::ternary\_expr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.ternary_expr.html) * [dsl::functions::time\_range](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.time_range.html) * [dsl::functions::time\_ranges](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.time_ranges.html) * [dsl::functions::when](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/functions/fn.when.html) * [dsl::map\_multiple](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.map_multiple.html) * [dsl::new\_column\_udf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.new_column_udf.html) * [dsl::python\_dataset::dataset\_provider\_vtable](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dataset/fn.dataset_provider_vtable.html) * [dsl::ternary\_expr](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.ternary_expr.html) * [dsl::udf::infer\_udf\_output\_dtype](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/udf/fn.infer_udf_output_dtype.html) * [dsl::udf::try\_infer\_udf\_output\_dtype](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/udf/fn.try_infer_udf_output_dtype.html) * [dsl::when](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/fn.when.html) * [prelude::prepare\_cloud\_plan](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/fn.prepare_cloud_plan.html) ### Type Aliases * [dsl::DslNameGenerator](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/type.DslNameGenerator.html) * [dsl::FieldsNameMapper](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/type.FieldsNameMapper.html) * [dsl::OpaqueColumnUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/type.OpaqueColumnUdf.html) * [dsl::OpaqueStreamingAgg](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/type.OpaqueStreamingAgg.html) * [dsl::RenameAliasRustFn](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/type.RenameAliasRustFn.html) * [dsl::anonymous::OpaqueColumnUdf](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/type.OpaqueColumnUdf.html) * [dsl::anonymous::OpaqueStreamingAgg](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/anonymous/type.OpaqueStreamingAgg.html) * [dsl::file\_provider::FileProviderFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/file_provider/type.FileProviderFunction.html) * [dsl::function\_expr::DslNameGenerator](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/function_expr/type.DslNameGenerator.html) * [dsl::python\_dsl::PythonFunction](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dsl/type.PythonFunction.html) * [frame::AllowedOptimizations](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/type.AllowedOptimizations.html) ### Statics * [dsl::DATASET\_PROVIDER\_VTABLE](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/static.DATASET_PROVIDER_VTABLE.html) * [dsl::python\_dataset::DATASET\_PROVIDER\_VTABLE](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dataset/static.DATASET_PROVIDER_VTABLE.html) * [dsl::python\_dsl::CALL\_COLUMNS\_UDF\_PYTHON](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dsl/static.CALL_COLUMNS_UDF_PYTHON.html) * [dsl::python\_dsl::CALL\_DF\_UDF\_PYTHON](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dsl/static.CALL_DF_UDF_PYTHON.html) * [dsl::python\_dsl::PYTHON3\_VERSION](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dsl/static.PYTHON3_VERSION.html) ### Constants * [dsl::DSL\_VERSION](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/constant.DSL_VERSION.html) * [dsl::python\_dsl::PYTHON\_SERDE\_MAGIC\_BYTE\_MARK](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/python_dsl/constant.PYTHON_SERDE_MAGIC_BYTE_MARK.html) * [frame::BUILD\_STREAMING\_EXECUTOR](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/constant.BUILD_STREAMING_EXECUTOR.html) * [prelude::NULL](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/constant.NULL.html) --- # polars_lazy::frame - Rust [Module frame](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/index.html#) -------------------------------------------------------------------------------- [polars\_lazy](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html) Module frame Copy item path =========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_lazy/frame/mod.rs.html#1-2482) Expand description Lazy variant of a [DataFrame](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") . Structs[§](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/index.html#structs) ----------------------------------------------------------------------------------- [CollectBatches](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.CollectBatches.html "struct polars_lazy::frame::CollectBatches") [InProcessQuery](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.InProcessQuery.html "struct polars_lazy::frame::InProcessQuery") Non-WebAssembly [JoinBuilder](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.JoinBuilder.html "struct polars_lazy::frame::JoinBuilder") [LazyCsvReader](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyCsvReader.html "struct polars_lazy::frame::LazyCsvReader") `csv` [LazyFrame](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") Lazy abstraction over an eager `DataFrame`. [LazyGroupBy](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyGroupBy.html "struct polars_lazy::frame::LazyGroupBy") Utility struct for lazy group\_by operation. [LazyJsonLineReader](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyJsonLineReader.html "struct polars_lazy::frame::LazyJsonLineReader") `json` [OptFlags](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.OptFlags.html "struct polars_lazy::frame::OptFlags") Allowed optimizations. [ScanArgsAnonymous](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.ScanArgsAnonymous.html "struct polars_lazy::frame::ScanArgsAnonymous") [ScanArgsParquet](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.ScanArgsParquet.html "struct polars_lazy::frame::ScanArgsParquet") `parquet` Constants[§](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/index.html#constants) --------------------------------------------------------------------------------------- [BUILD\_STREAMING\_EXECUTOR](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/constant.BUILD_STREAMING_EXECUTOR.html "constant polars_lazy::frame::BUILD_STREAMING_EXECUTOR") Traits[§](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/index.html#traits) --------------------------------------------------------------------------------- [IntoLazy](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/trait.IntoLazy.html "trait polars_lazy::frame::IntoLazy") [LazyFileListReader](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/trait.LazyFileListReader.html "trait polars_lazy::frame::LazyFileListReader") Reads [LazyFrame](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/struct.LazyFrame.html "struct polars_lazy::frame::LazyFrame") from a filesystem or a cloud storage. Supports glob patterns. Type Aliases[§](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/index.html#types) -------------------------------------------------------------------------------------- [AllowedOptimizations](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/type.AllowedOptimizations.html "type polars_lazy::frame::AllowedOptimizations") AllowedOptimizations --- # fallible in polars_lazy - Rust [fallible](https://docs.pola.rs/api/rust/dev/polars_lazy/macro.fallible.html#) ------------------------------------------------------------------------------- [polars\_lazy](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html) Macro fallible Copy item path ============================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_lazy/frame/err.rs.html#3-17) macro_rules! fallible { ($e:expr, $lf:expr) => { ... }; } Expand description Helper to delay a failing method until the query plan is collected --- # polars_lazy::prelude - Rust [Module prelude](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/index.html#) ------------------------------------------------------------------------------------ [polars\_lazy](https://docs.pola.rs/api/rust/dev/polars_lazy/index.html) Module prelude Copy item path ============================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_lazy/prelude.rs.html#1-27) Re-exports[§](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/index.html#reexports) ------------------------------------------------------------------------------------------ `pub use crate::[dsl](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/index.html "mod polars_lazy::dsl") ::*;` `pub use crate::[frame](https://docs.pola.rs/api/rust/dev/polars_lazy/frame/index.html "mod polars_lazy::frame") ::*;` Structs[§](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/index.html#structs) ------------------------------------------------------------------------------------- [AnonymousScanArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.AnonymousScanArgs.html "struct polars_lazy::prelude::AnonymousScanArgs") [AnonymousScanOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.AnonymousScanOptions.html "struct polars_lazy::prelude::AnonymousScanOptions") [CsvWriterOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.CsvWriterOptions.html "struct polars_lazy::prelude::CsvWriterOptions") `csv` Options for writing CSV files. [Duration](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.Duration.html "struct polars_lazy::prelude::Duration") `rolling_window_by` [DynamicGroupOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.DynamicGroupOptions.html "struct polars_lazy::prelude::DynamicGroupOptions") `dynamic_group_by` [IpcWriterOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.IpcWriterOptions.html "struct polars_lazy::prelude::IpcWriterOptions") `ipc` [JoinArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.JoinArgs.html "struct polars_lazy::prelude::JoinArgs") [JsonWriterOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.JsonWriterOptions.html "struct polars_lazy::prelude::JsonWriterOptions") `json` [Null](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.Null.html "struct polars_lazy::prelude::Null") The literal Null [ParquetWriteOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.ParquetWriteOptions.html "struct polars_lazy::prelude::ParquetWriteOptions") `parquet` [RankOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.RankOptions.html "struct polars_lazy::prelude::RankOptions") `rank` [RollingGroupOptions](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.RollingGroupOptions.html "struct polars_lazy::prelude::RollingGroupOptions") `dynamic_group_by` [UnionArgs](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/struct.UnionArgs.html "struct polars_lazy::prelude::UnionArgs") Enums[§](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/index.html#enums) --------------------------------------------------------------------------------- [JoinType](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/enum.JoinType.html "enum polars_lazy::prelude::JoinType") [JoinValidation](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/enum.JoinValidation.html "enum polars_lazy::prelude::JoinValidation") [LiteralValue](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/enum.LiteralValue.html "enum polars_lazy::prelude::LiteralValue") [PlanCallback](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/enum.PlanCallback.html "enum polars_lazy::prelude::PlanCallback") [RankMethod](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/enum.RankMethod.html "enum polars_lazy::prelude::RankMethod") `rank` Constants[§](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/index.html#constants) ----------------------------------------------------------------------------------------- [NULL](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/constant.NULL.html "constant polars_lazy::prelude::NULL") Traits[§](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/index.html#traits) ----------------------------------------------------------------------------------- [AnonymousScan](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/trait.AnonymousScan.html "trait polars_lazy::prelude::AnonymousScan") [Literal](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/trait.Literal.html "trait polars_lazy::prelude::Literal") [PolarsTemporalGroupby](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/trait.PolarsTemporalGroupby.html "trait polars_lazy::prelude::PolarsTemporalGroupby") `dynamic_group_by` Functions[§](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/index.html#functions) ----------------------------------------------------------------------------------------- [prepare\_cloud\_plan](https://docs.pola.rs/api/rust/dev/polars_lazy/prelude/fn.prepare_cloud_plan.html "fn polars_lazy::prelude::prepare_cloud_plan") `polars_cloud_client` Prepare the given [`DslPlan`](https://docs.pola.rs/api/rust/dev/polars_lazy/dsl/enum.DslPlan.html "enum polars_lazy::dsl::DslPlan") for execution on Polars Cloud. --- # polars_io::catalog - Rust [Module catalog](https://docs.pola.rs/api/rust/dev/polars_io/catalog/index.html#) ---------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module catalog Copy item path ============================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/catalog/mod.rs.html#1) Available on **crate feature `catalog`** only. Modules[§](https://docs.pola.rs/api/rust/dev/polars_io/catalog/index.html#modules) ----------------------------------------------------------------------------------- [unity](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/index.html "mod polars_io::catalog::unity") --- # polars_io::path_utils - Rust [Module path\_utils](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/index.html#) ----------------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module path\_utils Copy item path ================================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/path_utils/mod.rs.html#1-662) Statics[§](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/index.html#statics) -------------------------------------------------------------------------------------- [POLARS\_TEMP\_DIR\_BASE\_PATH](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/static.POLARS_TEMP_DIR_BASE_PATH.html "static polars_io::path_utils::POLARS_TEMP_DIR_BASE_PATH") Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/index.html#functions) ------------------------------------------------------------------------------------------ [expand\_paths](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/fn.expand_paths.html "fn polars_io::path_utils::expand_paths") Recursively traverses directories and expands globs if `glob` is `true`. [expand\_paths\_hive](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/fn.expand_paths_hive.html "fn polars_io::path_utils::expand_paths_hive") Recursively traverses directories and expands globs if `glob` is `true`. Returns the expanded paths and the index at which to start parsing hive partitions from the path. [expanded\_from\_single\_directory](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/fn.expanded_from_single_directory.html "fn polars_io::path_utils::expanded_from_single_directory") Returns `true` if `expanded_paths` were expanded from a single directory [resolve\_homedir](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/fn.resolve_homedir.html "fn polars_io::path_utils::resolve_homedir") Replaces a “~” in the Path with the home directory. --- # polars_io::avro - Rust [Module avro](https://docs.pola.rs/api/rust/dev/polars_io/avro/index.html#) ---------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module avro Copy item path ========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/avro/mod.rs.html#1-5) Available on **crate feature `avro`** only. Structs[§](https://docs.pola.rs/api/rust/dev/polars_io/avro/index.html#structs) -------------------------------------------------------------------------------- [AvroReader](https://docs.pola.rs/api/rust/dev/polars_io/avro/struct.AvroReader.html "struct polars_io::avro::AvroReader") Read [Apache Avro](https://avro.apache.org/) format into a [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") [AvroWriter](https://docs.pola.rs/api/rust/dev/polars_io/avro/struct.AvroWriter.html "struct polars_io::avro::AvroWriter") Write a [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") to [Apache Avro](https://avro.apache.org/) format Enums[§](https://docs.pola.rs/api/rust/dev/polars_io/avro/index.html#enums) ---------------------------------------------------------------------------- [AvroCompression](https://docs.pola.rs/api/rust/dev/polars_io/avro/enum.AvroCompression.html "enum polars_io::avro::AvroCompression") Valid compressions [Compression](https://docs.pola.rs/api/rust/dev/polars_io/avro/enum.Compression.html "enum polars_io::avro::Compression") Valid compressions --- # polars_io::csv - Rust [Module csv](https://docs.pola.rs/api/rust/dev/polars_io/csv/index.html#) -------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module csv Copy item path ========================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/csv/mod.rs.html#1-4) Available on **crate features `csv` or `json`** only. Expand description Functionality for reading and writing CSV files. Modules[§](https://docs.pola.rs/api/rust/dev/polars_io/csv/index.html#modules) ------------------------------------------------------------------------------- [read](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/index.html "mod polars_io::csv::read") Functionality for reading CSV files. [write](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/index.html "mod polars_io::csv::write") Functionality for writing CSV files. --- # polars_io::cloud - Rust [Module cloud](https://docs.pola.rs/api/rust/dev/polars_io/cloud/index.html#) ------------------------------------------------------------------------------ [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module cloud Copy item path =========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/cloud/mod.rs.html#1-24) Expand description Interface with cloud storage through the object\_store crate. Re-exports[§](https://docs.pola.rs/api/rust/dev/polars_io/cloud/index.html#reexports) -------------------------------------------------------------------------------------- `pub use [options](https://docs.pola.rs/api/rust/dev/polars_io/cloud/options/index.html "mod polars_io::cloud::options") ::*;` Modules[§](https://docs.pola.rs/api/rust/dev/polars_io/cloud/index.html#modules) --------------------------------------------------------------------------------- [credential\_provider](https://docs.pola.rs/api/rust/dev/polars_io/cloud/credential_provider/index.html "mod polars_io::cloud::credential_provider") `cloud` [options](https://docs.pola.rs/api/rust/dev/polars_io/cloud/options/index.html "mod polars_io::cloud::options") Structs[§](https://docs.pola.rs/api/rust/dev/polars_io/cloud/index.html#structs) --------------------------------------------------------------------------------- [BlockingCloudWriter](https://docs.pola.rs/api/rust/dev/polars_io/cloud/struct.BlockingCloudWriter.html "struct polars_io::cloud::BlockingCloudWriter") `cloud` Adaptor which wraps the interface of [ObjectStore::BufWriter](https://docs.rs/object_store/latest/object_store/buffered/struct.BufWriter.html) exposing a synchronous interface which implements `std::io::Write`. [CloudLocation](https://docs.pola.rs/api/rust/dev/polars_io/cloud/struct.CloudLocation.html "struct polars_io::cloud::CloudLocation") `cloud` A location on cloud storage, may have wildcards. [PolarsObjectStore](https://docs.pola.rs/api/rust/dev/polars_io/cloud/struct.PolarsObjectStore.html "struct polars_io::cloud::PolarsObjectStore") Polars wrapper around \[`ObjectStore`\] functionality. This struct is cheaply cloneable. Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/cloud/index.html#functions) ------------------------------------------------------------------------------------- [build\_object\_store](https://docs.pola.rs/api/rust/dev/polars_io/cloud/fn.build_object_store.html "fn polars_io::cloud::build_object_store") `cloud` Build an \[`ObjectStore`\] based on the URL and passed in url. Return the cloud location and an implementation of the object store. [glob](https://docs.pola.rs/api/rust/dev/polars_io/cloud/fn.glob.html "fn polars_io::cloud::glob") `cloud` List files with a prefix derived from the pattern. [object\_path\_from\_str](https://docs.pola.rs/api/rust/dev/polars_io/cloud/fn.object_path_from_str.html "fn polars_io::cloud::object_path_from_str") `cloud` Construct an object\_store `Path` from a string without any encoding/decoding. Type Aliases[§](https://docs.pola.rs/api/rust/dev/polars_io/cloud/index.html#types) ------------------------------------------------------------------------------------ [ObjectStorePath](https://docs.pola.rs/api/rust/dev/polars_io/cloud/type.ObjectStorePath.html "type polars_io::cloud::ObjectStorePath") `cloud` --- # polars_time::chunkedarray - Rust [Module chunkedarray](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/index.html#) ---------------------------------------------------------------------------------------------- [polars\_time](https://docs.pola.rs/api/rust/dev/polars_time/index.html) Module chunkedarray Copy item path ================================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/chunkedarray/mod.rs.html#1-36) Expand description Traits and utilities for temporal data. Re-exports[§](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/index.html#reexports) ----------------------------------------------------------------------------------------------- `pub use string::[StringMethods](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/string/trait.StringMethods.html "trait polars_time::chunkedarray::string::StringMethods") ;` Modules[§](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/index.html#modules) ------------------------------------------------------------------------------------------ [string](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/string/index.html "mod polars_time::chunkedarray::string") --- # polars_io::file_cache - Rust [Module file\_cache](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/index.html#) ----------------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module file\_cache Copy item path ================================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/file_cache/mod.rs.html#1-11) Available on **crate feature `file_cache`** only. Structs[§](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/index.html#structs) -------------------------------------------------------------------------------------- [FileCacheEntry](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/struct.FileCacheEntry.html "struct polars_io::file_cache::FileCacheEntry") Statics[§](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/index.html#statics) -------------------------------------------------------------------------------------- [FILE\_CACHE](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/static.FILE_CACHE.html "static polars_io::file_cache::FILE_CACHE") [FILE\_CACHE\_PREFIX](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/static.FILE_CACHE_PREFIX.html "static polars_io::file_cache::FILE_CACHE_PREFIX") Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/index.html#functions) ------------------------------------------------------------------------------------------ [get\_env\_file\_cache\_ttl](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/fn.get_env_file_cache_ttl.html "fn polars_io::file_cache::get_env_file_cache_ttl") [init\_entries\_from\_uri\_list](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/fn.init_entries_from_uri_list.html "fn polars_io::file_cache::init_entries_from_uri_list") --- # polars_io::hive - Rust [Module hive](https://docs.pola.rs/api/rust/dev/polars_io/hive/index.html#) ---------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module hive Copy item path ========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/hive.rs.html#1-172) Structs[§](https://docs.pola.rs/api/rust/dev/polars_io/hive/index.html#structs) -------------------------------------------------------------------------------- [HivePathFormatter](https://docs.pola.rs/api/rust/dev/polars_io/hive/struct.HivePathFormatter.html "struct polars_io::hive::HivePathFormatter") Panics Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/hive/index.html#functions) ------------------------------------------------------------------------------------ [merge\_sorted\_to\_schema\_order](https://docs.pola.rs/api/rust/dev/polars_io/hive/fn.merge_sorted_to_schema_order.html "fn polars_io::hive::merge_sorted_to_schema_order") Merge 2 lists of columns into one, where each list contains columns ordered such that their indices in the `schema` are in ascending order. [merge\_sorted\_to\_schema\_order\_impl](https://docs.pola.rs/api/rust/dev/polars_io/hive/fn.merge_sorted_to_schema_order_impl.html "fn polars_io::hive::merge_sorted_to_schema_order_impl") --- # polars_io::ipc - Rust [Module ipc](https://docs.pola.rs/api/rust/dev/polars_io/ipc/index.html#) -------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module ipc Copy item path ========================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ipc/mod.rs.html#1-16) Available on **crate features `ipc` or `ipc_streaming`** only. Structs[§](https://docs.pola.rs/api/rust/dev/polars_io/ipc/index.html#structs) ------------------------------------------------------------------------------- [BatchedWriter](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.BatchedWriter.html "struct polars_io::ipc::BatchedWriter") [IpcReadOptions](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcReadOptions.html "struct polars_io::ipc::IpcReadOptions") `cloud` [IpcReader](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcReader.html "struct polars_io::ipc::IpcReader") `ipc` Read Arrows IPC format into a DataFrame [IpcReaderAsync](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcReaderAsync.html "struct polars_io::ipc::IpcReaderAsync") `cloud` An Arrow IPC reader implemented on top of PolarsObjectStore. [IpcScanOptions](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcScanOptions.html "struct polars_io::ipc::IpcScanOptions") `ipc` [IpcStreamReader](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcStreamReader.html "struct polars_io::ipc::IpcStreamReader") `ipc_streaming` Read Arrows Stream IPC format into a DataFrame [IpcStreamWriter](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcStreamWriter.html "struct polars_io::ipc::IpcStreamWriter") `ipc_streaming` Write a DataFrame to Arrow’s Streaming IPC format [IpcStreamWriterOption](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcStreamWriterOption.html "struct polars_io::ipc::IpcStreamWriterOption") `ipc_streaming` [IpcWriter](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcWriter.html "struct polars_io::ipc::IpcWriter") Write a DataFrame to Arrow’s IPC format [IpcWriterOptions](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcWriterOptions.html "struct polars_io::ipc::IpcWriterOptions") Enums[§](https://docs.pola.rs/api/rust/dev/polars_io/ipc/index.html#enums) --------------------------------------------------------------------------- [IpcCompression](https://docs.pola.rs/api/rust/dev/polars_io/ipc/enum.IpcCompression.html "enum polars_io::ipc::IpcCompression") Compression codec --- # polars_io::mmap - Rust [Module mmap](https://docs.pola.rs/api/rust/dev/polars_io/mmap/index.html#) ---------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module mmap Copy item path ========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/mmap.rs.html#1-119) Enums[§](https://docs.pola.rs/api/rust/dev/polars_io/mmap/index.html#enums) ---------------------------------------------------------------------------- [ReaderBytes](https://docs.pola.rs/api/rust/dev/polars_io/mmap/enum.ReaderBytes.html "enum polars_io::mmap::ReaderBytes") Traits[§](https://docs.pola.rs/api/rust/dev/polars_io/mmap/index.html#traits) ------------------------------------------------------------------------------ [MmapBytesReader](https://docs.pola.rs/api/rust/dev/polars_io/mmap/trait.MmapBytesReader.html "trait polars_io::mmap::MmapBytesReader") Trait used to get a hold to file handler or to the underlying bytes without performing a Read. --- # polars_io::ndjson - Rust [Module ndjson](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/index.html#) -------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module ndjson Copy item path ============================ [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ndjson/mod.rs.html#1-54) Available on **crate feature `json`** only. Modules[§](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/index.html#modules) ---------------------------------------------------------------------------------- [core](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/index.html "mod polars_io::ndjson::core") Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/index.html#functions) -------------------------------------------------------------------------------------- [count\_rows](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/fn.count_rows.html "fn polars_io::ndjson::count_rows") Count the number of rows. The slice passed must represent the entire file. This does not check if the lines are valid NDJSON - it assumes that is the case. [count\_rows\_par](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/fn.count_rows_par.html "fn polars_io::ndjson::count_rows_par") Count the number of rows. The slice passed must represent the entire file. This will potentially parallelize using rayon. [infer\_schema](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/fn.infer_schema.html "fn polars_io::ndjson::infer_schema") --- # polars_io::parquet - Rust [Module parquet](https://docs.pola.rs/api/rust/dev/polars_io/parquet/index.html#) ---------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module parquet Copy item path ============================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/parquet/mod.rs.html#1-5) Available on **crate feature `parquet`** only. Expand description Functionality for reading and writing Apache Parquet files. Modules[§](https://docs.pola.rs/api/rust/dev/polars_io/parquet/index.html#modules) ----------------------------------------------------------------------------------- [metadata](https://docs.pola.rs/api/rust/dev/polars_io/parquet/metadata/index.html "mod polars_io::parquet::metadata") Apache Parquet file metadata. [read](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/index.html "mod polars_io::parquet::read") Functionality for reading Apache Parquet files. [write](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/index.html "mod polars_io::parquet::write") Functionality for reading and writing Apache Parquet files. --- # polars_io::scan_lines - Rust [Module scan\_lines](https://docs.pola.rs/api/rust/dev/polars_io/scan_lines/index.html#) ----------------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module scan\_lines Copy item path ================================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/scan_lines.rs.html#1-165) Available on **crate feature `scan_lines`** only. Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/scan_lines/index.html#functions) ------------------------------------------------------------------------------------------ [count\_lines](https://docs.pola.rs/api/rust/dev/polars_io/scan_lines/fn.count_lines.html "fn polars_io::scan_lines::count_lines") [split\_lines\_to\_rows](https://docs.pola.rs/api/rust/dev/polars_io/scan_lines/fn.split_lines_to_rows.html "fn polars_io::scan_lines::split_lines_to_rows") --- # impl_page_walk in polars_io - Rust [impl\_page\_walk](https://docs.pola.rs/api/rust/dev/polars_io/macro.impl_page_walk.html#) ------------------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Macro impl\_page\_walk Copy item path ===================================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/catalog/unity/utils.rs.html#35-73) macro_rules! impl_page_walk { ($S:ty, $T:ty, key_name = $key_name:tt) => { ... }; } Expand description Support for traversing paginated response values that look like: { $key_name: [$T, $T, ...], next_page_token: "token" or null, } --- # polars_io::utils - Rust [Module utils](https://docs.pola.rs/api/rust/dev/polars_io/utils/index.html#) ------------------------------------------------------------------------------ [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module utils Copy item path =========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/utils/mod.rs.html#1-39) Modules[§](https://docs.pola.rs/api/rust/dev/polars_io/utils/index.html#modules) --------------------------------------------------------------------------------- [byte\_source](https://docs.pola.rs/api/rust/dev/polars_io/utils/byte_source/index.html "mod polars_io::utils::byte_source") `cloud` [compression](https://docs.pola.rs/api/rust/dev/polars_io/utils/compression/index.html "mod polars_io::utils::compression") [file](https://docs.pola.rs/api/rust/dev/polars_io/utils/file/index.html "mod polars_io::utils::file") [mkdir](https://docs.pola.rs/api/rust/dev/polars_io/utils/mkdir/index.html "mod polars_io::utils::mkdir") [slice](https://docs.pola.rs/api/rust/dev/polars_io/utils/slice/index.html "mod polars_io::utils::slice") [sync\_on\_close](https://docs.pola.rs/api/rust/dev/polars_io/utils/sync_on_close/index.html "mod polars_io::utils::sync_on_close") Constants[§](https://docs.pola.rs/api/rust/dev/polars_io/utils/index.html#constants) ------------------------------------------------------------------------------------- [HIVE\_VALUE\_ENCODE\_CHARSET](https://docs.pola.rs/api/rust/dev/polars_io/utils/constant.HIVE_VALUE_ENCODE_CHARSET.html "constant polars_io::utils::HIVE_VALUE_ENCODE_CHARSET") Characters to percent-encode for hive values such that they round-trip from bucket storage. [URL\_ENCODE\_CHARSET](https://docs.pola.rs/api/rust/dev/polars_io/utils/constant.URL_ENCODE_CHARSET.html "constant polars_io::utils::URL_ENCODE_CHARSET") Excludes only the unreserved URI characters in RFC-3986: Statics[§](https://docs.pola.rs/api/rust/dev/polars_io/utils/index.html#statics) --------------------------------------------------------------------------------- [BOOLEAN\_RE](https://docs.pola.rs/api/rust/dev/polars_io/utils/static.BOOLEAN_RE.html "static polars_io::utils::BOOLEAN_RE") [FLOAT\_RE](https://docs.pola.rs/api/rust/dev/polars_io/utils/static.FLOAT_RE.html "static polars_io::utils::FLOAT_RE") [FLOAT\_RE\_DECIMAL](https://docs.pola.rs/api/rust/dev/polars_io/utils/static.FLOAT_RE_DECIMAL.html "static polars_io::utils::FLOAT_RE_DECIMAL") [INTEGER\_RE](https://docs.pola.rs/api/rust/dev/polars_io/utils/static.INTEGER_RE.html "static polars_io::utils::INTEGER_RE") Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/utils/index.html#functions) ------------------------------------------------------------------------------------- [apply\_projection](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.apply_projection.html "fn polars_io::utils::apply_projection") `ipc` or `ipc_streaming` or `parquet` or `avro` [columns\_to\_projection](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.columns_to_projection.html "fn polars_io::utils::columns_to_projection") `ipc` or `ipc_streaming` or `avro` or `parquet` [decode\_json\_response](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.decode_json_response.html "fn polars_io::utils::decode_json_response") `cloud` Utility for decoding JSON that adds the response value to the error message if decoding fails. This makes it much easier to debug errors from parsing network responses. [get\_reader\_bytes](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.get_reader_bytes.html "fn polars_io::utils::get_reader_bytes") [materialize\_projection](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.materialize_projection.html "fn polars_io::utils::materialize_projection") [overwrite\_schema](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.overwrite_schema.html "fn polars_io::utils::overwrite_schema") `json` --- # polars_time::series - Rust [Module series](https://docs.pola.rs/api/rust/dev/polars_time/series/index.html#) ---------------------------------------------------------------------------------- [polars\_time](https://docs.pola.rs/api/rust/dev/polars_time/index.html) Module series Copy item path ============================ [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/series/mod.rs.html#1-319) Traits[§](https://docs.pola.rs/api/rust/dev/polars_time/series/index.html#traits) ---------------------------------------------------------------------------------- [AsSeries](https://docs.pola.rs/api/rust/dev/polars_time/series/trait.AsSeries.html "trait polars_time::series::AsSeries") [TemporalMethods](https://docs.pola.rs/api/rust/dev/polars_time/series/trait.TemporalMethods.html "trait polars_time::series::TemporalMethods") --- # get_upload_chunk_size in polars_io - Rust [get\_upload\_chunk\_size](https://docs.pola.rs/api/rust/dev/polars_io/fn.get_upload_chunk_size.html#) ------------------------------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Function get\_upload\_chunk\_size Copy item path ================================================ [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/lib.rs.html#47-68) pub fn get_upload_chunk_size() -> usize --- # polars_io::pl_async - Rust [Module pl\_async](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/index.html#) ------------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module pl\_async Copy item path =============================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/pl_async.rs.html#1-356) Available on **crate feature `async`** only. Structs[§](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/index.html#structs) ------------------------------------------------------------------------------------ [RuntimeManager](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/struct.RuntimeManager.html "struct polars_io::pl_async::RuntimeManager") Traits[§](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/index.html#traits) ---------------------------------------------------------------------------------- [GetSize](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/trait.GetSize.html "trait polars_io::pl_async::GetSize") Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/index.html#functions) ---------------------------------------------------------------------------------------- [get\_runtime](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/fn.get_runtime.html "fn polars_io::pl_async::get_runtime") [tune\_with\_concurrency\_budget](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/fn.tune_with_concurrency_budget.html "fn polars_io::pl_async::tune_with_concurrency_budget") [with\_concurrency\_budget](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/fn.with_concurrency_budget.html "fn polars_io::pl_async::with_concurrency_budget") --- # polars_io::predicates - Rust [Module predicates](https://docs.pola.rs/api/rust/dev/polars_io/predicates/index.html#) ---------------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module predicates Copy item path ================================ [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/predicates.rs.html#1-524) Structs[§](https://docs.pola.rs/api/rust/dev/polars_io/predicates/index.html#structs) -------------------------------------------------------------------------------------- [ColumnPredicateExpr](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.ColumnPredicateExpr.html "struct polars_io::predicates::ColumnPredicateExpr") [ColumnPredicates](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.ColumnPredicates.html "struct polars_io::predicates::ColumnPredicates") [ColumnStatistics](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.ColumnStatistics.html "struct polars_io::predicates::ColumnStatistics") [ColumnStats](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.ColumnStats.html "struct polars_io::predicates::ColumnStats") Statistics of the values in a column. [PhysicalExprWithConstCols](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.PhysicalExprWithConstCols.html "struct polars_io::predicates::PhysicalExprWithConstCols") [ScanIOPredicate](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.ScanIOPredicate.html "struct polars_io::predicates::ScanIOPredicate") Enums[§](https://docs.pola.rs/api/rust/dev/polars_io/predicates/index.html#enums) ---------------------------------------------------------------------------------- [SpecializedColumnPredicate](https://docs.pola.rs/api/rust/dev/polars_io/predicates/enum.SpecializedColumnPredicate.html "enum polars_io::predicates::SpecializedColumnPredicate") Traits[§](https://docs.pola.rs/api/rust/dev/polars_io/predicates/index.html#traits) ------------------------------------------------------------------------------------ [PhysicalIoExpr](https://docs.pola.rs/api/rust/dev/polars_io/predicates/trait.PhysicalIoExpr.html "trait polars_io::predicates::PhysicalIoExpr") [SkipBatchPredicate](https://docs.pola.rs/api/rust/dev/polars_io/predicates/trait.SkipBatchPredicate.html "trait polars_io::predicates::SkipBatchPredicate") Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/predicates/index.html#functions) ------------------------------------------------------------------------------------------ [apply\_predicate](https://docs.pola.rs/api/rust/dev/polars_io/predicates/fn.apply_predicate.html "fn polars_io::predicates::apply_predicate") `parquet` or `ipc` --- # polars_io::json - Rust [Module json](https://docs.pola.rs/api/rust/dev/polars_io/json/index.html#) ---------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module json Copy item path ========================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/json/mod.rs.html#1-478) Available on **crate feature `json`** only. Expand description [§](https://docs.pola.rs/api/rust/dev/polars_io/json/index.html#deserialize-json-files) (De)serialize JSON files. ----------------------------------------------------------------------------------------------------------------- ### [§](https://docs.pola.rs/api/rust/dev/polars_io/json/index.html#read-json-to-a-dataframe) Read JSON to a DataFrame ### [§](https://docs.pola.rs/api/rust/dev/polars_io/json/index.html#example) Example use polars_core::prelude::*; use polars_io::prelude::*; use std::io::Cursor; use std::num::NonZeroUsize; let basic_json = r#"{"a":1, "b":2.0, "c":false, "d":"4"} {"a":-10, "b":-3.5, "c":true, "d":"4"} {"a":2, "b":0.6, "c":false, "d":"text"} {"a":1, "b":2.0, "c":false, "d":"4"} {"a":7, "b":-3.5, "c":true, "d":"4"} {"a":1, "b":0.6, "c":false, "d":"text"} {"a":1, "b":2.0, "c":false, "d":"4"} {"a":5, "b":-3.5, "c":true, "d":"4"} {"a":1, "b":0.6, "c":false, "d":"text"} {"a":1, "b":2.0, "c":false, "d":"4"} {"a":1, "b":-3.5, "c":true, "d":"4"} {"a":1, "b":0.6, "c":false, "d":"text"}"#; let file = Cursor::new(basic_json); let df = JsonReader::new(file) .with_json_format(JsonFormat::JsonLines) .infer_schema_len(NonZeroUsize::new(3)) .with_batch_size(NonZeroUsize::new(3).unwrap()) .finish() .unwrap(); println!("{:?}", df); > > > Outputs: +-----+--------+-------+--------+ | a | b | c | d | | --- | --- | --- | --- | | i64 | f64 | bool | str | +=====+========+=======+========+ | 1 | 2 | false | "4" | +-----+--------+-------+--------+ | -10 | -3.5e0 | true | "4" | +-----+--------+-------+--------+ | 2 | 0.6 | false | "text" | +-----+--------+-------+--------+ | 1 | 2 | false | "4" | +-----+--------+-------+--------+ | 7 | -3.5e0 | true | "4" | +-----+--------+-------+--------+ | 1 | 0.6 | false | "text" | +-----+--------+-------+--------+ | 1 | 2 | false | "4" | +-----+--------+-------+--------+ | 5 | -3.5e0 | true | "4" | +-----+--------+-------+--------+ | 1 | 0.6 | false | "text" | +-----+--------+-------+--------+ | 1 | 2 | false | "4" | +-----+--------+-------+--------+ Structs[§](https://docs.pola.rs/api/rust/dev/polars_io/json/index.html#structs) -------------------------------------------------------------------------------- [BatchedWriter](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.BatchedWriter.html "struct polars_io::json::BatchedWriter") [JsonReader](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonReader.html "struct polars_io::json::JsonReader") Reads JSON in one of the formats in [`JsonFormat`](https://docs.pola.rs/api/rust/dev/polars_io/json/enum.JsonFormat.html "enum polars_io::json::JsonFormat") into a DataFrame. [JsonWriter](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonWriter.html "struct polars_io::json::JsonWriter") Writes a DataFrame to JSON. [JsonWriterOptions](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonWriterOptions.html "struct polars_io::json::JsonWriterOptions") Enums[§](https://docs.pola.rs/api/rust/dev/polars_io/json/index.html#enums) ---------------------------------------------------------------------------- [JsonFormat](https://docs.pola.rs/api/rust/dev/polars_io/json/enum.JsonFormat.html "enum polars_io::json::JsonFormat") The format to use to write the DataFrame to JSON: `Json` (a JSON array) or `JsonLines` (each row output on a separate line). Functions[§](https://docs.pola.rs/api/rust/dev/polars_io/json/index.html#functions) ------------------------------------------------------------------------------------ [remove\_bom](https://docs.pola.rs/api/rust/dev/polars_io/json/fn.remove_bom.html "fn polars_io::json::remove_bom") --- # schema_to_arrow_checked in polars_io - Rust [schema\_to\_arrow\_checked](https://docs.pola.rs/api/rust/dev/polars_io/fn.schema_to_arrow_checked.html#) ----------------------------------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Function schema\_to\_arrow\_checked Copy item path ================================================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/shared.rs.html#109-132) pub fn schema_to_arrow_checked( schema: &Schema, compat_level: CompatLevel, _file_name: &str, ) -> PolarsResult --- # polars_time::prelude - Rust [Module prelude](https://docs.pola.rs/api/rust/dev/polars_time/prelude/index.html#) ------------------------------------------------------------------------------------ [polars\_time](https://docs.pola.rs/api/rust/dev/polars_time/index.html) Module prelude Copy item path ============================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/prelude.rs.html#1-7) Re-exports[§](https://docs.pola.rs/api/rust/dev/polars_time/prelude/index.html#reexports) ------------------------------------------------------------------------------------------ `pub use crate::series::[TemporalMethods](https://docs.pola.rs/api/rust/dev/polars_time/series/trait.TemporalMethods.html "trait polars_time::series::TemporalMethods") ;` `pub use crate::[chunkedarray](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/index.html "mod polars_time::chunkedarray") ::*;` `pub use [crate](https://docs.pola.rs/api/rust/dev/polars_time/index.html "mod polars_time") ::*;` Structs[§](https://docs.pola.rs/api/rust/dev/polars_time/prelude/index.html#structs) ------------------------------------------------------------------------------------- [Bounds](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.Bounds.html "struct polars_time::prelude::Bounds") [BoundsIter](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.BoundsIter.html "struct polars_time::prelude::BoundsIter") [Duration](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.Duration.html "struct polars_time::prelude::Duration") [GroupByDynamicWindower](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.GroupByDynamicWindower.html "struct polars_time::prelude::GroupByDynamicWindower") [RollingWindower](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.RollingWindower.html "struct polars_time::prelude::RollingWindower") [Window](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.Window.html "struct polars_time::prelude::Window") Represents a window in time Enums[§](https://docs.pola.rs/api/rust/dev/polars_time/prelude/index.html#enums) --------------------------------------------------------------------------------- [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/prelude/enum.ClosedWindow.html "enum polars_time::prelude::ClosedWindow") [Label](https://docs.pola.rs/api/rust/dev/polars_time/prelude/enum.Label.html "enum polars_time::prelude::Label") [StartBy](https://docs.pola.rs/api/rust/dev/polars_time/prelude/enum.StartBy.html "enum polars_time::prelude::StartBy") Functions[§](https://docs.pola.rs/api/rust/dev/polars_time/prelude/index.html#functions) ----------------------------------------------------------------------------------------- [ensure\_duration\_matches\_dtype](https://docs.pola.rs/api/rust/dev/polars_time/prelude/fn.ensure_duration_matches_dtype.html "fn polars_time::prelude::ensure_duration_matches_dtype") [ensure\_is\_constant\_duration](https://docs.pola.rs/api/rust/dev/polars_time/prelude/fn.ensure_is_constant_duration.html "fn polars_time::prelude::ensure_is_constant_duration") [group\_by\_values](https://docs.pola.rs/api/rust/dev/polars_time/prelude/fn.group_by_values.html "fn polars_time::prelude::group_by_values") Different from `group_by_windows`, where define window buckets and search which values fit that pre-defined bucket. [group\_by\_windows](https://docs.pola.rs/api/rust/dev/polars_time/prelude/fn.group_by_windows.html "fn polars_time::prelude::group_by_windows") Window boundaries are created based on the given `Window`, which is defined by: --- # PolarsRound in polars_time - Rust [PolarsRound](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#) ------------------------------------------------------------------------------------- [polars\_time](https://docs.pola.rs/api/rust/dev/polars_time/index.html) Trait PolarsRound Copy item path ================================ [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/round.rs.html#15-19) pub trait PolarsRound { // Required method fn round( &self, every: &StringChunked, tz: Option<&Tz>, ) -> PolarsResult where Self: Sized; } Required Methods[§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#required-methods) ----------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/round.rs.html#16-18) #### fn [round](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#tymethod.round) (&self, every: &[StringChunked](https://docs.pola.rs/api/rust/dev/polars_core/datatypes/type.StringChunked.html "type polars_core::datatypes::StringChunked") , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult where Self: [Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , Implementations on Foreign Types[§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#foreign-impls) ------------------------------------------------------------------------------------------------------------------------ [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/round.rs.html#105-158) [§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#impl-PolarsRound-for-Logical%3CDateType,+Int32Type%3E) ### impl [PolarsRound](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html "trait polars_time::PolarsRound") for [DateChunked](https://docs.pola.rs/api/rust/dev/polars_core/chunked_array/logical/date/type.DateChunked.html "type polars_core::chunked_array::logical::date::DateChunked") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/round.rs.html#106-157) [§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#method.round) #### fn [round](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#tymethod.round) (&self, every: &[StringChunked](https://docs.pola.rs/api/rust/dev/polars_core/datatypes/type.StringChunked.html "type polars_core::datatypes::StringChunked") , \_tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/round.rs.html#21-103) [§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#impl-PolarsRound-for-Logical%3CDatetimeType,+Int64Type%3E) ### impl [PolarsRound](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html "trait polars_time::PolarsRound") for [DatetimeChunked](https://docs.pola.rs/api/rust/dev/polars_core/chunked_array/logical/datetime/type.DatetimeChunked.html "type polars_core::chunked_array::logical::datetime::DatetimeChunked") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/round.rs.html#22-102) [§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#method.round-1) #### fn [round](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#tymethod.round) (&self, every: &[StringChunked](https://docs.pola.rs/api/rust/dev/polars_core/datatypes/type.StringChunked.html "type polars_core::datatypes::StringChunked") , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult Implementors[§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html#implementors) --------------------------------------------------------------------------------------------------- --- # ArrowReader in polars_io - Rust [ArrowReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#) ----------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Trait ArrowReader Copy item path ================================ [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/shared.rs.html#42-44) pub trait ArrowReader { // Required method fn next_record_batch(&mut self) -> PolarsResult>; } Required Methods[§](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#required-methods) --------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/shared.rs.html#43) #### fn [next\_record\_batch](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#tymethod.next_record_batch) (&mut self) -> PolarsResult<[Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") > Implementations on Foreign Types[§](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#foreign-impls) ---------------------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ipc/ipc_file.rs.html#220-227) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#impl-ArrowReader-for-FileReader%3CR%3E) ### impl [ArrowReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html "trait polars_io::ArrowReader") for FileReader where R: [Read](https://doc.rust-lang.org/nightly/std/io/trait.Read.html "trait std::io::Read") + [Seek](https://doc.rust-lang.org/nightly/std/io/trait.Seek.html "trait std::io::Seek") + [MmapBytesReader](https://docs.pola.rs/api/rust/dev/polars_io/mmap/trait.MmapBytesReader.html "trait polars_io::mmap::MmapBytesReader") , Available on **crate feature `ipc` and (crate features `ipc` or `ipc_streaming`)** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ipc/ipc_file.rs.html#224-226) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#method.next_record_batch) #### fn [next\_record\_batch](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#tymethod.next_record_batch) (&mut self) -> PolarsResult<[Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") > [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/avro/read.rs.html#73-80) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#impl-ArrowReader-for-Reader%3CR%3E) ### impl [ArrowReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html "trait polars_io::ArrowReader") for Reader where R: [Read](https://doc.rust-lang.org/nightly/std/io/trait.Read.html "trait std::io::Read") + [Seek](https://doc.rust-lang.org/nightly/std/io/trait.Seek.html "trait std::io::Seek") , Available on **crate feature `avro`** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/avro/read.rs.html#77-79) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#method.next_record_batch-1) #### fn [next\_record\_batch](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#tymethod.next_record_batch) (&mut self) -> PolarsResult<[Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") > [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ipc/ipc_stream.rs.html#131-144) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#impl-ArrowReader-for-StreamReader%3CR%3E) ### impl [ArrowReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html "trait polars_io::ArrowReader") for StreamReader where R: [Read](https://doc.rust-lang.org/nightly/std/io/trait.Read.html "trait std::io::Read") + [Seek](https://doc.rust-lang.org/nightly/std/io/trait.Seek.html "trait std::io::Seek") , Available on **crate feature `ipc_streaming` and (crate features `ipc` or `ipc_streaming`)** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ipc/ipc_stream.rs.html#135-143) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#method.next_record_batch-2) #### fn [next\_record\_batch](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#tymethod.next_record_batch) (&mut self) -> PolarsResult<[Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") > Implementors[§](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html#implementors) ------------------------------------------------------------------------------------------------- --- # SerWriter in polars_io - Rust [SerWriter](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html#) ------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Trait SerWriter Copy item path ============================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/shared.rs.html#32-40) pub trait SerWriterwhere W: Write,{ // Required methods fn new(writer: W) -> Self where Self: Sized; fn finish(&mut self, df: &mut DataFrame) -> PolarsResult<()>; } Required Methods[§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html#required-methods) ------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/shared.rs.html#36-38) #### fn [new](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html#tymethod.new) (writer: W) -> Self where Self: [Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/shared.rs.html#39) #### fn [finish](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html#tymethod.finish) (&mut self, df: &mut [DataFrame](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") ) -> PolarsResult<[()](https://doc.rust-lang.org/nightly/std/primitive.unit.html) \> Implementors[§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html#implementors) ----------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/avro/write.rs.html#54-102) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html#impl-SerWriter%3CW%3E-for-AvroWriter%3CW%3E) ### impl [SerWriter](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html "trait polars_io::SerWriter") for [AvroWriter](https://docs.pola.rs/api/rust/dev/polars_io/avro/struct.AvroWriter.html "struct polars_io::avro::AvroWriter") where W: [Write](https://doc.rust-lang.org/nightly/std/io/trait.Write.html "trait std::io::Write") , Available on **crate feature `avro`** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/csv/write/writer.rs.html#29-67) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html#impl-SerWriter%3CW%3E-for-CsvWriter%3CW%3E) ### impl [SerWriter](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html "trait polars_io::SerWriter") for [CsvWriter](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/struct.CsvWriter.html "struct polars_io::csv::write::CsvWriter") where W: [Write](https://doc.rust-lang.org/nightly/std/io/trait.Write.html "trait std::io::Write") , Available on **crate features `csv` or `json`** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ipc/ipc_stream.rs.html#254-289) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html#impl-SerWriter%3CW%3E-for-IpcStreamWriter%3CW%3E) ### impl [SerWriter](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html "trait polars_io::SerWriter") for [IpcStreamWriter](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcStreamWriter.html "struct polars_io::ipc::IpcStreamWriter") where W: [Write](https://doc.rust-lang.org/nightly/std/io/trait.Write.html "trait std::io::Write") , Available on **crate feature `ipc_streaming` and (crate features `ipc` or `ipc_streaming`)** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ipc/write.rs.html#133-175) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html#impl-SerWriter%3CW%3E-for-IpcWriter%3CW%3E) ### impl [SerWriter](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html "trait polars_io::SerWriter") for [IpcWriter](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcWriter.html "struct polars_io::ipc::IpcWriter") where W: [Write](https://doc.rust-lang.org/nightly/std/io/trait.Write.html "trait std::io::Write") , Available on **crate features `ipc` or `ipc_streaming`** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/json/mod.rs.html#132-174) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html#impl-SerWriter%3CW%3E-for-JsonWriter%3CW%3E) ### impl [SerWriter](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html "trait polars_io::SerWriter") for [JsonWriter](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonWriter.html "struct polars_io::json::JsonWriter") where W: [Write](https://doc.rust-lang.org/nightly/std/io/trait.Write.html "trait std::io::Write") , Available on **crate feature `json`** only. --- # SerReader in polars_io - Rust [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#) ------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Trait SerReader Copy item path ============================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/shared.rs.html#11-30) pub trait SerReaderwhere R: Read,{ // Required methods fn new(reader: R) -> Self; fn finish(self) -> PolarsResult; // Provided method fn set_rechunk(self, _rechunk: bool) -> Self where Self: Sized { ... } } Required Methods[§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#required-methods) ------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/shared.rs.html#16) #### fn [new](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#tymethod.new) (reader: R) -> Self Create a new instance of the [`SerReader`](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html "trait polars_io::SerReader") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/shared.rs.html#29) #### fn [finish](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#tymethod.finish) (self) -> PolarsResult<[DataFrame](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") \> Take the SerReader and return a parsed DataFrame. Provided Methods[§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#provided-methods) ------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/shared.rs.html#21-26) #### fn [set\_rechunk](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#method.set_rechunk) (self, \_rechunk: [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) ) -> Self where Self: [Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , Make sure that all columns are contiguous in memory by aggregating the chunks into a single array. Dyn Compatibility[§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#dyn-compatibility) --------------------------------------------------------------------------------------------------------- This trait is **not** [dyn compatible](https://doc.rust-lang.org/nightly/reference/items/traits.html#dyn-compatibility) . _In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe._ Implementors[§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#implementors) ----------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/avro/read.rs.html#82-132) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#impl-SerReader%3CR%3E-for-AvroReader%3CR%3E) ### impl [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html "trait polars_io::SerReader") for [AvroReader](https://docs.pola.rs/api/rust/dev/polars_io/avro/struct.AvroReader.html "struct polars_io::avro::AvroReader") where R: [Read](https://doc.rust-lang.org/nightly/std/io/trait.Read.html "trait std::io::Read") + [Seek](https://doc.rust-lang.org/nightly/std/io/trait.Seek.html "trait std::io::Seek") , Available on **crate feature `avro`** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/csv/read/reader.rs.html#129-164) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#impl-SerReader%3CR%3E-for-CsvReader%3CR%3E) ### impl [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html "trait polars_io::SerReader") for [CsvReader](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/struct.CsvReader.html "struct polars_io::csv::read::CsvReader") where R: [MmapBytesReader](https://docs.pola.rs/api/rust/dev/polars_io/mmap/trait.MmapBytesReader.html "trait polars_io::mmap::MmapBytesReader") , Available on **crate features `csv` or `json`** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ipc/ipc_stream.rs.html#146-194) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#impl-SerReader%3CR%3E-for-IpcStreamReader%3CR%3E) ### impl [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html "trait polars_io::SerReader") for [IpcStreamReader](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcStreamReader.html "struct polars_io::ipc::IpcStreamReader") where R: [Read](https://doc.rust-lang.org/nightly/std/io/trait.Read.html "trait std::io::Read") + [Seek](https://doc.rust-lang.org/nightly/std/io/trait.Seek.html "trait std::io::Seek") , Available on **crate feature `ipc_streaming` and (crate features `ipc` or `ipc_streaming`)** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/json/mod.rs.html#239-419) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#impl-SerReader%3CR%3E-for-JsonReader%3C'_,+R%3E) ### impl [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html "trait polars_io::SerReader") for [JsonReader](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonReader.html "struct polars_io::json::JsonReader") <'\_, R> where R: [MmapBytesReader](https://docs.pola.rs/api/rust/dev/polars_io/mmap/trait.MmapBytesReader.html "trait polars_io::mmap::MmapBytesReader") , Available on **crate feature `json`** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ndjson/core.rs.html#144-192) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#impl-SerReader%3CR%3E-for-JsonLineReader%3C'_,+R%3E) ### impl [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html "trait polars_io::SerReader") for [JsonLineReader](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/struct.JsonLineReader.html "struct polars_io::ndjson::core::JsonLineReader") <'\_, R> where R: [MmapBytesReader](https://docs.pola.rs/api/rust/dev/polars_io/mmap/trait.MmapBytesReader.html "trait polars_io::mmap::MmapBytesReader") , Available on **crate feature `json`** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/ipc/ipc_file.rs.html#229-328) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#impl-SerReader%3CR%3E-for-IpcReader%3CR%3E) ### impl [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html "trait polars_io::SerReader") for [IpcReader](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcReader.html "struct polars_io::ipc::IpcReader") Available on **crate feature `ipc` and (crate features `ipc` or `ipc_streaming`)** only. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/parquet/read/reader.rs.html#179-242) [§](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html#impl-SerReader%3CR%3E-for-ParquetReader%3CR%3E) ### impl [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html "trait polars_io::SerReader") for [ParquetReader](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/struct.ParquetReader.html "struct polars_io::parquet::read::ParquetReader") Available on **crate feature `parquet`** only. --- # PolarsUpsample in polars_time - Rust [PolarsUpsample](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#) ------------------------------------------------------------------------------------------- [polars\_time](https://docs.pola.rs/api/rust/dev/polars_time/index.html) Trait PolarsUpsample Copy item path =================================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/upsample.rs.html#10-89) pub trait PolarsUpsample { // Required methods fn upsample>( &self, by: I, time_column: &str, every: Duration, ) -> PolarsResult; fn upsample_stable>( &self, by: I, time_column: &str, every: Duration, ) -> PolarsResult; } Required Methods[§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#required-methods) -------------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/upsample.rs.html#42-47) #### fn [upsample](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#tymethod.upsample) >( &self, by: I, time\_column: &[str](https://doc.rust-lang.org/nightly/std/primitive.str.html) , every: [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") , ) -> PolarsResult<[DataFrame](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") \> Upsample a [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") at a regular frequency. ##### [§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#arguments) Arguments * `by` - First group by these columns and then upsample for every group * `time_column` - Will be used to determine a date\_range. Note that this column has to be sorted for the output to make sense. * `every` - interval will start ‘every’ duration * `offset` - change the start of the date\_range by this offset. The `every` and `offset` arguments are created with the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) Or combine them: “3d12h4m25s” # 3 days, 12 hours, 4 minutes, and 25 seconds By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, depending on daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/upsample.rs.html#83-88) #### fn [upsample\_stable](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#tymethod.upsample_stable) >( &self, by: I, time\_column: &[str](https://doc.rust-lang.org/nightly/std/primitive.str.html) , every: [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") , ) -> PolarsResult<[DataFrame](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") \> Upsample a [`DataFrame`](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") at a regular frequency. Similar to [`upsample`](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#tymethod.upsample "method polars_time::PolarsUpsample::upsample") , but order of the DataFrame is maintained when `by` is specified. ##### [§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#arguments-1) Arguments * `by` - First group by these columns and then upsample for every group * `time_column` - Will be used to determine a date\_range. Note that this column has to be sorted for the output to make sense. * `every` - interval will start ‘every’ duration * `offset` - change the start of the date\_range by this offset. The `every` and `offset` arguments are created with the following string language: * 1ns (1 nanosecond) * 1us (1 microsecond) * 1ms (1 millisecond) * 1s (1 second) * 1m (1 minute) * 1h (1 hour) * 1d (1 calendar day) * 1w (1 calendar week) * 1mo (1 calendar month) * 1q (1 calendar quarter) * 1y (1 calendar year) * 1i (1 index count) Or combine them: “3d12h4m25s” # 3 days, 12 hours, 4 minutes, and 25 seconds By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, depending on daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. Dyn Compatibility[§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#dyn-compatibility) ---------------------------------------------------------------------------------------------------------------- This trait is **not** [dyn compatible](https://doc.rust-lang.org/nightly/reference/items/traits.html#dyn-compatibility) . _In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe._ Implementations on Foreign Types[§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#foreign-impls) --------------------------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/upsample.rs.html#91-115) [§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#impl-PolarsUpsample-for-DataFrame) ### impl [PolarsUpsample](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html "trait polars_time::PolarsUpsample") for [DataFrame](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/upsample.rs.html#92-102) [§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#method.upsample) #### fn [upsample](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#tymethod.upsample) >( &self, by: I, time\_column: &[str](https://doc.rust-lang.org/nightly/std/primitive.str.html) , every: [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") , ) -> PolarsResult<[DataFrame](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") \> [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/upsample.rs.html#104-114) [§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#method.upsample_stable) #### fn [upsample\_stable](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#tymethod.upsample_stable) >( &self, by: I, time\_column: &[str](https://doc.rust-lang.org/nightly/std/primitive.str.html) , every: [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") , ) -> PolarsResult<[DataFrame](https://docs.pola.rs/api/rust/dev/polars_core/frame/dataframe/struct.DataFrame.html "struct polars_core::frame::dataframe::DataFrame") \> Implementors[§](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html#implementors) ------------------------------------------------------------------------------------------------------ --- # ClosedWindow in polars_time - Rust [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#) -------------------------------------------------------------------------------------- [polars\_time](https://docs.pola.rs/api/rust/dev/polars_time/index.html) Enum ClosedWindow Copy item path ================================ [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#27-32) pub enum ClosedWindow { Left, Right, Both, None, } Variants[§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#variants) ------------------------------------------------------------------------------------------- [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#variant.Left) ### Left [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#variant.Right) ### Right [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#variant.Both) ### Both [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#variant.None) ### None Trait Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#trait-implementations) --------------------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Clone-for-ClosedWindow) ### impl [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.clone) #### fn [clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone) (&self) -> [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") Returns a duplicate of the value. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone) 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#245-247) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.clone_from) #### fn [clone\_from](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from) (&mut self, source: &Self) Performs copy-assignment from `source`. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Debug-for-ClosedWindow) ### impl [Debug](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html "trait core::fmt::Debug") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.fmt) #### fn [fmt](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt) (&self, f: &mut [Formatter](https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html "struct core::fmt::Formatter") <'\_>) -> [Result](https://doc.rust-lang.org/nightly/core/fmt/type.Result.html "type core::fmt::Result") Formats the value using the given formatter. [Read more](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-From%3C%26ClosedWindow%3E-for-%26str) ### impl<'\_derivative\_strum> [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") <&'\_derivative\_strum [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") \> for &'static [str](https://doc.rust-lang.org/nightly/std/primitive.str.html) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.from-1) #### fn [from](https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from) (x: &'\_derivative\_strum [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") ) -> &'static [str](https://doc.rust-lang.org/nightly/std/primitive.str.html) Converts to this type from the input type. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-From%3CClosedWindow%3E-for-%26str) ### impl [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") <[ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") \> for &'static [str](https://doc.rust-lang.org/nightly/std/primitive.str.html) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.from) #### fn [from](https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from) (x: [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") ) -> &'static [str](https://doc.rust-lang.org/nightly/std/primitive.str.html) Converts to this type from the input type. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Hash-for-ClosedWindow) ### impl [Hash](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html "trait core::hash::Hash") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.hash) #### fn [hash](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#tymethod.hash) <\_\_H: [Hasher](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") \>(&self, state: [&mut \_\_H](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) Feeds this value into the given [`Hasher`](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") . [Read more](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#tymethod.hash) 1.3.0 · [Source](https://doc.rust-lang.org/nightly/src/core/hash/mod.rs.html#235-237) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.hash_slice) #### fn [hash\_slice](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice) (data: &\[Self\], state: [&mut H](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) where H: [Hasher](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") , Self: [Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , Feeds a slice of this type into the given [`Hasher`](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") . [Read more](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-PartialEq-for-ClosedWindow) ### impl [PartialEq](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html "trait core::cmp::PartialEq") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.eq) #### fn [eq](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#tymethod.eq) (&self, other: &[ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests for `self` and `other` values to be equal, and is used by `==`. 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#264) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.ne) #### fn [ne](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne) (&self, other: [&Rhs](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests for `!=`. The default implementation is almost always sufficient, and should not be overridden without very good reason. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Copy-for-ClosedWindow) ### impl [Copy](https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html "trait core::marker::Copy") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Eq-for-ClosedWindow) ### impl [Eq](https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html "trait core::cmp::Eq") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/group_by.rs.html#23) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-StructuralPartialEq-for-ClosedWindow) ### impl [StructuralPartialEq](https://doc.rust-lang.org/nightly/core/marker/trait.StructuralPartialEq.html "trait core::marker::StructuralPartialEq") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") Auto Trait Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#synthetic-implementations) ------------------------------------------------------------------------------------------------------------------------------ [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Freeze-for-ClosedWindow) ### impl [Freeze](https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html "trait core::marker::Freeze") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-RefUnwindSafe-for-ClosedWindow) ### impl [RefUnwindSafe](https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html "trait core::panic::unwind_safe::RefUnwindSafe") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Send-for-ClosedWindow) ### impl [Send](https://doc.rust-lang.org/nightly/core/marker/trait.Send.html "trait core::marker::Send") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Sync-for-ClosedWindow) ### impl [Sync](https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html "trait core::marker::Sync") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Unpin-for-ClosedWindow) ### impl [Unpin](https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html "trait core::marker::Unpin") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-UnwindSafe-for-ClosedWindow) ### impl [UnwindSafe](https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html "trait core::panic::unwind_safe::UnwindSafe") for [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") Blanket Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#blanket-implementations) ------------------------------------------------------------------------------------------------------------------------- [Source](https://doc.rust-lang.org/nightly/src/core/any.rs.html#138) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Any-for-T) ### impl [Any](https://doc.rust-lang.org/nightly/core/any/trait.Any.html "trait core::any::Any") for T where T: 'static + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/any.rs.html#139) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.type_id) #### fn [type\_id](https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id) (&self) -> [TypeId](https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html "struct core::any::TypeId") Gets the `TypeId` of `self`. [Read more](https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id) [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#212) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Borrow%3CT%3E-for-T) ### impl [Borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html "trait core::borrow::Borrow") for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#214) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.borrow) #### fn [borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow) (&self) -> [&T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Immutably borrows from an owned value. [Read more](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow) [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-BorrowMut%3CT%3E-for-T) ### impl [BorrowMut](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html "trait core::borrow::BorrowMut") for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#222) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.borrow_mut) #### fn [borrow\_mut](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut) (&mut self) -> [&mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Mutably borrows from an owned value. [Read more](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut) [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#547) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-CloneToUninit-for-T) ### impl [CloneToUninit](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html "trait core::clone::CloneToUninit") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#549) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.clone_to_uninit) #### unsafe fn [clone\_to\_uninit](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html#tymethod.clone_to_uninit) (&self, dest: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) 🔬This is a nightly-only experimental API. (`clone_to_uninit`) Performs copy-assignment from `self` to `dest`. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html#tymethod.clone_to_uninit) [Source](https://docs.rs/dyn-clone/1.0.20/src/dyn_clone/lib.rs.html#196-198) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-DynClone-for-T) ### impl [DynClone](https://docs.rs/dyn-clone/1.0.20/dyn_clone/trait.DynClone.html "trait dyn_clone::DynClone") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://docs.rs/dyn-clone/1.0.20/src/dyn_clone/lib.rs.html#200) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.__clone_box) #### fn [\_\_clone\_box](https://docs.rs/dyn-clone/1.0.20/dyn_clone/trait.DynClone.html#tymethod.__clone_box) (&self, \_: Private) -> [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [()](https://doc.rust-lang.org/nightly/std/primitive.unit.html) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Equivalent%3CK%3E-for-Q) ### impl Equivalent for Q where Q: [Eq](https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html "trait core::cmp::Eq") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , K: [Borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html "trait core::borrow::Borrow") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.equivalent) #### fn equivalent(&self, key: [&K](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Compare self to `key` and return `true` if they are equal. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#785) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-From%3CT%3E-for-T) ### impl [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") for T [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#788) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.from-2) #### fn [from](https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from) (t: T) -> T Returns the argument unchanged. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#767-769) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Into%3CU%3E-for-T) ### impl [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") for T where U: [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#777) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.into) #### fn [into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into) (self) -> U Calls `U::from(self)`. That is, this conversion is whatever the implementation of `[From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") for U` chooses to do. [Source](https://docs.rs/either/1/src/either/into_either.rs.html#64) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-IntoEither-for-T) ### impl [IntoEither](https://docs.rs/either/1/either/into_either/trait.IntoEither.html "trait either::into_either::IntoEither") for T [Source](https://docs.rs/either/1/src/either/into_either.rs.html#29) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.into_either) #### fn [into\_either](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either) (self, into\_left: [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) ) -> [Either](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") Converts `self` into a [`Left`](https://docs.rs/either/1/either/enum.Either.html#variant.Left "variant either::Either::Left") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") if `into_left` is `true`. Converts `self` into a [`Right`](https://docs.rs/either/1/either/enum.Either.html#variant.Right "variant either::Either::Right") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") otherwise. [Read more](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either) [Source](https://docs.rs/either/1/src/either/into_either.rs.html#55-57) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.into_either_with) #### fn [into\_either\_with](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with) (self, into\_left: F) -> [Either](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") where F: [FnOnce](https://doc.rust-lang.org/nightly/core/ops/function/trait.FnOnce.html "trait core::ops::function::FnOnce") (&Self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) , Converts `self` into a [`Left`](https://docs.rs/either/1/either/enum.Either.html#variant.Left "variant either::Either::Left") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") if `into_left(&self)` returns `true`. Converts `self` into a [`Right`](https://docs.rs/either/1/either/enum.Either.html#variant.Right "variant either::Either::Right") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") otherwise. [Read more](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#91) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Key-for-T) ### impl [Key](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html "trait polars_utils::parma::raw::key::Key") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#92) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.align) #### fn [align](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.align) () -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The alignment necessary for the key. Must return a power of two. [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#96) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.size) #### fn [size](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.size) (&self) -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The size of the key in bytes. [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#101) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.init) #### unsafe fn [init](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.init) (&self, ptr: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) Initialize the key in the given memory location. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.init) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#108) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.get) #### unsafe fn [get](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.get) <'a>(ptr: [\*const](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) -> [&'a T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Get a reference to the key from the given memory location. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.get) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#113) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.drop_in_place) #### unsafe fn [drop\_in\_place](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.drop_in_place) (ptr: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) Drop the key in place. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.drop_in_place) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-Pointable-for-T) ### impl Pointable for T [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#associatedconstant.ALIGN) #### const ALIGN: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The alignment of pointer. [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#associatedtype.Init) #### type Init = T The type for initializers. [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.init-1) #### unsafe fn init(init: ::Init) -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) Initializes a with the given initializer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.deref) #### unsafe fn deref<'a>(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) -> [&'a T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Dereferences the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.deref_mut) #### unsafe fn deref\_mut<'a>(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) -> [&'a mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Mutably dereferences the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.drop) #### unsafe fn drop(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) Drops the object pointed to by the given pointer. Read more [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#72-74) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-ToOwned-for-T) ### impl [ToOwned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html "trait alloc::borrow::ToOwned") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#76) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#associatedtype.Owned) #### type [Owned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#associatedtype.Owned) = T The resulting type after obtaining ownership. [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#77) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.to_owned) #### fn [to\_owned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned) (&self) -> T Creates owned data from borrowed data, usually by cloning. [Read more](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned) [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#81) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.clone_into) #### fn [clone\_into](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into) (&self, target: [&mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) Uses borrowed data to replace owned data, usually by cloning. [Read more](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into) [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#827-829) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-TryFrom%3CU%3E-for-T) ### impl [TryFrom](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html "trait core::convert::TryFrom") for T where U: [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#831) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#associatedtype.Error-1) #### type [Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error) = [Infallible](https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html "enum core::convert::Infallible") The type returned in the event of a conversion error. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#834) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.try_from) #### fn [try\_from](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from) (value: U) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") \> Performs the conversion. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#811-813) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-TryInto%3CU%3E-for-T) ### impl [TryInto](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html "trait core::convert::TryInto") for T where U: [TryFrom](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html "trait core::convert::TryFrom") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#815) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#associatedtype.Error) #### type [Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error) = >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") The type returned in the event of a conversion error. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#818) [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.try_into) #### fn [try\_into](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into) (self) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") \> Performs the conversion. [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#impl-VZip%3CV%3E-for-T) ### impl VZip for T where V: MultiLane, [§](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html#method.vzip) #### fn vzip(self) -> V --- # RowIndex in polars_io - Rust [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#) ------------------------------------------------------------------------------ [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Struct RowIndex Copy item path ============================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#10-13) pub struct RowIndex { pub name: PlSmallStr, pub offset: IdxSize, } Fields[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#fields) ----------------------------------------------------------------------------------- [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#structfield.name) `name: [PlSmallStr](https://docs.pola.rs/api/rust/dev/polars_utils/pl_str/struct.PlSmallStr.html "struct polars_utils::pl_str::PlSmallStr") `[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#structfield.offset) `offset: [IdxSize](https://docs.pola.rs/api/rust/dev/polars_utils/index/type.IdxSize.html "type polars_utils::index::IdxSize") ` Trait Implementations[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#trait-implementations) ----------------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#7) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Clone-for-RowIndex) ### impl [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#7) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.clone) #### fn [clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone) (&self) -> [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") Returns a duplicate of the value. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone) 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#245-247) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.clone_from) #### fn [clone\_from](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from) (&mut self, source: &Self) Performs copy-assignment from `source`. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#7) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Debug-for-RowIndex) ### impl [Debug](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html "trait core::fmt::Debug") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#7) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.fmt) #### fn [fmt](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt) (&self, f: &mut [Formatter](https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html "struct core::fmt::Formatter") <'\_>) -> [Result](https://doc.rust-lang.org/nightly/core/fmt/type.Result.html "type core::fmt::Result") Formats the value using the given formatter. [Read more](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#8) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Deserialize%3C'de%3E-for-RowIndex) ### impl<'de> [Deserialize](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html "trait serde_core::de::Deserialize") <'de> for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#8) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.deserialize) #### fn [deserialize](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize) <\_\_D>(\_\_deserializer: \_\_D) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") where \_\_D: [Deserializer](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html "trait serde_core::de::Deserializer") <'de>, Deserialize this value from the given Serde deserializer. [Read more](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#7) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Hash-for-RowIndex) ### impl [Hash](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html "trait core::hash::Hash") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#7) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.hash) #### fn [hash](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#tymethod.hash) <\_\_H: [Hasher](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") \>(&self, state: [&mut \_\_H](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) Feeds this value into the given [`Hasher`](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") . [Read more](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#tymethod.hash) 1.3.0 · [Source](https://doc.rust-lang.org/nightly/src/core/hash/mod.rs.html#235-237) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.hash_slice) #### fn [hash\_slice](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice) (data: &\[Self\], state: [&mut H](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) where H: [Hasher](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") , Self: [Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , Feeds a slice of this type into the given [`Hasher`](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") . [Read more](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#9) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-JsonSchema-for-RowIndex) ### impl JsonSchema for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#9) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.schema_name) #### fn schema\_name() -> [Cow](https://doc.rust-lang.org/nightly/alloc/borrow/enum.Cow.html "enum alloc::borrow::Cow") <'static, [str](https://doc.rust-lang.org/nightly/std/primitive.str.html) \> The name of the generated JSON Schema. Read more [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#9) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.schema_id) #### fn schema\_id() -> [Cow](https://doc.rust-lang.org/nightly/alloc/borrow/enum.Cow.html "enum alloc::borrow::Cow") <'static, [str](https://doc.rust-lang.org/nightly/std/primitive.str.html) \> Returns a string that uniquely identifies the schema produced by this type. Read more [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#9) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.json_schema) #### fn json\_schema(generator: &mut SchemaGenerator) -> Schema Generates a JSON Schema for this type. Read more [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#9) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.inline_schema) #### fn inline\_schema() -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Whether JSON Schemas generated for this type should be included directly in parent schemas, rather than being re-used where possible using the `$ref` keyword. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.always_inline_schema) #### fn always\_inline\_schema() -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) 👎Deprecated: Use `inline_schema()` instead Only included for backward-compatibility - use `inline_schema()` instead“. Read more [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#7) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-PartialEq-for-RowIndex) ### impl [PartialEq](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html "trait core::cmp::PartialEq") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#7) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.eq) #### fn [eq](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#tymethod.eq) (&self, other: &[RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests for `self` and `other` values to be equal, and is used by `==`. 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#264) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.ne) #### fn [ne](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne) (&self, other: [&Rhs](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests for `!=`. The default implementation is almost always sufficient, and should not be overridden without very good reason. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#8) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Serialize-for-RowIndex) ### impl [Serialize](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html "trait serde_core::ser::Serialize") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#8) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.serialize) #### fn [serialize](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize) <\_\_S>(&self, \_\_serializer: \_\_S) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") <\_\_S::[Ok](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html#associatedtype.Ok "type serde_core::ser::Serializer::Ok") , \_\_S::[Error](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html#associatedtype.Error "type serde_core::ser::Serializer::Error") \> where \_\_S: [Serializer](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html "trait serde_core::ser::Serializer") , Serialize this value into the given Serde serializer. [Read more](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#7) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Eq-for-RowIndex) ### impl [Eq](https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html "trait core::cmp::Eq") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#7) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-StructuralPartialEq-for-RowIndex) ### impl [StructuralPartialEq](https://doc.rust-lang.org/nightly/core/marker/trait.StructuralPartialEq.html "trait core::marker::StructuralPartialEq") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") Auto Trait Implementations[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#synthetic-implementations) -------------------------------------------------------------------------------------------------------------------------- [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Freeze-for-RowIndex) ### impl [Freeze](https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html "trait core::marker::Freeze") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-RefUnwindSafe-for-RowIndex) ### impl [RefUnwindSafe](https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html "trait core::panic::unwind_safe::RefUnwindSafe") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Send-for-RowIndex) ### impl [Send](https://doc.rust-lang.org/nightly/core/marker/trait.Send.html "trait core::marker::Send") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Sync-for-RowIndex) ### impl [Sync](https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html "trait core::marker::Sync") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Unpin-for-RowIndex) ### impl [Unpin](https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html "trait core::marker::Unpin") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-UnwindSafe-for-RowIndex) ### impl [UnwindSafe](https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html "trait core::panic::unwind_safe::UnwindSafe") for [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html "struct polars_io::RowIndex") Blanket Implementations[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#blanket-implementations) --------------------------------------------------------------------------------------------------------------------- [Source](https://doc.rust-lang.org/nightly/src/core/any.rs.html#138) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Any-for-T) ### impl [Any](https://doc.rust-lang.org/nightly/core/any/trait.Any.html "trait core::any::Any") for T where T: 'static + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/any.rs.html#139) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.type_id) #### fn [type\_id](https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id) (&self) -> [TypeId](https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html "struct core::any::TypeId") Gets the `TypeId` of `self`. [Read more](https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id) [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#212) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Borrow%3CT%3E-for-T) ### impl [Borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html "trait core::borrow::Borrow") for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#214) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.borrow) #### fn [borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow) (&self) -> [&T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Immutably borrows from an owned value. [Read more](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow) [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-BorrowMut%3CT%3E-for-T) ### impl [BorrowMut](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html "trait core::borrow::BorrowMut") for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#222) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.borrow_mut) #### fn [borrow\_mut](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut) (&mut self) -> [&mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Mutably borrows from an owned value. [Read more](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut) [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#547) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-CloneToUninit-for-T) ### impl [CloneToUninit](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html "trait core::clone::CloneToUninit") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#549) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.clone_to_uninit) #### unsafe fn [clone\_to\_uninit](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html#tymethod.clone_to_uninit) (&self, dest: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) 🔬This is a nightly-only experimental API. (`clone_to_uninit`) Performs copy-assignment from `self` to `dest`. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html#tymethod.clone_to_uninit) [Source](https://docs.rs/dyn-clone/1.0.20/src/dyn_clone/lib.rs.html#196-198) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-DynClone-for-T) ### impl [DynClone](https://docs.rs/dyn-clone/1.0.20/dyn_clone/trait.DynClone.html "trait dyn_clone::DynClone") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://docs.rs/dyn-clone/1.0.20/src/dyn_clone/lib.rs.html#200) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.__clone_box) #### fn [\_\_clone\_box](https://docs.rs/dyn-clone/1.0.20/dyn_clone/trait.DynClone.html#tymethod.__clone_box) (&self, \_: Private) -> [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [()](https://doc.rust-lang.org/nightly/std/primitive.unit.html) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Equivalent%3CK%3E-for-Q) ### impl Equivalent for Q where Q: [Eq](https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html "trait core::cmp::Eq") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , K: [Borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html "trait core::borrow::Borrow") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.equivalent) #### fn equivalent(&self, key: [&K](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Compare self to `key` and return `true` if they are equal. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#785) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-From%3CT%3E-for-T) ### impl [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") for T [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#788) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.from) #### fn [from](https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from) (t: T) -> T Returns the argument unchanged. [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Instrument-for-T) ### impl Instrument for T [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.instrument) #### fn instrument(self, span: Span) -> Instrumented Instruments this type with the provided \[`Span`\], returning an `Instrumented` wrapper. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.in_current_span) #### fn in\_current\_span(self) -> Instrumented Instruments this type with the [current](super::Span::current()) [`Span`](crate::Span) , returning an `Instrumented` wrapper. Read more [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#767-769) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Into%3CU%3E-for-T) ### impl [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") for T where U: [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#777) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.into) #### fn [into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into) (self) -> U Calls `U::from(self)`. That is, this conversion is whatever the implementation of `[From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") for U` chooses to do. [Source](https://docs.rs/either/1/src/either/into_either.rs.html#64) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-IntoEither-for-T) ### impl [IntoEither](https://docs.rs/either/1/either/into_either/trait.IntoEither.html "trait either::into_either::IntoEither") for T [Source](https://docs.rs/either/1/src/either/into_either.rs.html#29) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.into_either) #### fn [into\_either](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either) (self, into\_left: [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) ) -> [Either](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") [ⓘ](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#) Converts `self` into a [`Left`](https://docs.rs/either/1/either/enum.Either.html#variant.Left "variant either::Either::Left") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") if `into_left` is `true`. Converts `self` into a [`Right`](https://docs.rs/either/1/either/enum.Either.html#variant.Right "variant either::Either::Right") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") otherwise. [Read more](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either) [Source](https://docs.rs/either/1/src/either/into_either.rs.html#55-57) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.into_either_with) #### fn [into\_either\_with](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with) (self, into\_left: F) -> [Either](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") [ⓘ](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#) where F: [FnOnce](https://doc.rust-lang.org/nightly/core/ops/function/trait.FnOnce.html "trait core::ops::function::FnOnce") (&Self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) , Converts `self` into a [`Left`](https://docs.rs/either/1/either/enum.Either.html#variant.Left "variant either::Either::Left") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") if `into_left(&self)` returns `true`. Converts `self` into a [`Right`](https://docs.rs/either/1/either/enum.Either.html#variant.Right "variant either::Either::Right") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") otherwise. [Read more](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#91) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Key-for-T) ### impl [Key](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html "trait polars_utils::parma::raw::key::Key") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#92) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.align) #### fn [align](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.align) () -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The alignment necessary for the key. Must return a power of two. [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#96) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.size) #### fn [size](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.size) (&self) -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The size of the key in bytes. [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#101) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.init) #### unsafe fn [init](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.init) (&self, ptr: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) Initialize the key in the given memory location. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.init) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#108) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.get) #### unsafe fn [get](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.get) <'a>(ptr: [\*const](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) -> [&'a T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Get a reference to the key from the given memory location. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.get) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#113) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.drop_in_place) #### unsafe fn [drop\_in\_place](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.drop_in_place) (ptr: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) Drop the key in place. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.drop_in_place) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Pointable-for-T) ### impl Pointable for T [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#associatedconstant.ALIGN) #### const ALIGN: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The alignment of pointer. [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#associatedtype.Init) #### type Init = T The type for initializers. [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.init-1) #### unsafe fn init(init: ::Init) -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) Initializes a with the given initializer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.deref) #### unsafe fn deref<'a>(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) -> [&'a T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Dereferences the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.deref_mut) #### unsafe fn deref\_mut<'a>(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) -> [&'a mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Mutably dereferences the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.drop) #### unsafe fn drop(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) Drops the object pointed to by the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-PolicyExt-for-T) ### impl PolicyExt for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.and) #### fn and(self, other: P) -> And where T: Policy, P: Policy, Create a new `Policy` that returns \[`Action::Follow`\] only if `self` and `other` return `Action::Follow`. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.or) #### fn or(self, other: P) -> Or where T: Policy, P: Policy, Create a new `Policy` that returns \[`Action::Follow`\] if either `self` or `other` returns `Action::Follow`. Read more [Source](https://docs.rs/typenum/1.19.0/src/typenum/type_operators.rs.html#34) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Same-for-T) ### impl [Same](https://docs.rs/typenum/1.19.0/typenum/type_operators/trait.Same.html "trait typenum::type_operators::Same") for T [Source](https://docs.rs/typenum/1.19.0/src/typenum/type_operators.rs.html#35) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#associatedtype.Output) #### type [Output](https://docs.rs/typenum/1.19.0/typenum/type_operators/trait.Same.html#associatedtype.Output) = T Should always be `Self` [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#72-74) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-ToOwned-for-T) ### impl [ToOwned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html "trait alloc::borrow::ToOwned") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#76) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#associatedtype.Owned) #### type [Owned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#associatedtype.Owned) = T The resulting type after obtaining ownership. [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#77) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.to_owned) #### fn [to\_owned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned) (&self) -> T Creates owned data from borrowed data, usually by cloning. [Read more](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned) [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#81) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.clone_into) #### fn [clone\_into](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into) (&self, target: [&mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) Uses borrowed data to replace owned data, usually by cloning. [Read more](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into) [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#827-829) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-TryFrom%3CU%3E-for-T) ### impl [TryFrom](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html "trait core::convert::TryFrom") for T where U: [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#831) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#associatedtype.Error-1) #### type [Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error) = [Infallible](https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html "enum core::convert::Infallible") The type returned in the event of a conversion error. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#834) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.try_from) #### fn [try\_from](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from) (value: U) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") \> Performs the conversion. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#811-813) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-TryInto%3CU%3E-for-T) ### impl [TryInto](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html "trait core::convert::TryInto") for T where U: [TryFrom](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html "trait core::convert::TryFrom") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#815) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#associatedtype.Error) #### type [Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error) = >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") The type returned in the event of a conversion error. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#818) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.try_into) #### fn [try\_into](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into) (self) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") \> Performs the conversion. [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-VZip%3CV%3E-for-T) ### impl VZip for T where V: MultiLane, [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.vzip) #### fn vzip(self) -> V [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-WithSubscriber-for-T) ### impl WithSubscriber for T [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.with_subscriber) #### fn with\_subscriber(self, subscriber: S) -> WithDispatch where S: [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") , Attaches the provided [`Subscriber`](super::Subscriber) to this type, returning a \[`WithDispatch`\] wrapper. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#method.with_current_subscriber) #### fn with\_current\_subscriber(self) -> WithDispatch Attaches the current [default](https://docs.pola.rs/api/rust/dev/polars_io/dispatcher#setting-the-default-subscriber) [`Subscriber`](super::Subscriber) to this type, returning a \[`WithDispatch`\] wrapper. Read more [Source](https://docs.rs/serde_core/1.0.228/src/serde_core/de/mod.rs.html#633) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-DeserializeOwned-for-T) ### impl [DeserializeOwned](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.DeserializeOwned.html "trait serde_core::de::DeserializeOwned") for T where T: for<'de> [Deserialize](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html "trait serde_core::de::Deserialize") <'de>, [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html#impl-Ungil-for-T) ### impl Ungil for T where T: [Send](https://doc.rust-lang.org/nightly/core/marker/trait.Send.html "trait core::marker::Send") , --- # HiveOptions in polars_io - Rust [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#) ------------------------------------------------------------------------------------ [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Struct HiveOptions Copy item path ================================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#19-27) pub struct HiveOptions { pub enabled: Option, pub hive_start_idx: usize, pub schema: Option, pub try_parse_dates: bool, } Expand description Options for Hive partitioning. Fields[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#fields) -------------------------------------------------------------------------------------- [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#structfield.enabled) `enabled: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <[bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) >` This can be `None` to automatically enable for single directory scans and disable otherwise. However it should be initialized if it is inside a DSL / IR plan. [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#structfield.hive_start_idx) `hive_start_idx: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) `[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#structfield.schema) `schema: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <[SchemaRef](https://docs.pola.rs/api/rust/dev/polars_core/schema/type.SchemaRef.html "type polars_core::schema::SchemaRef") >`[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#structfield.try_parse_dates) `try_parse_dates: [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) ` Implementations[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#implementations) -------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#29-47) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-HiveOptions) ### impl [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#30-37) #### pub fn [new\_enabled](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.new_enabled) () -> Self [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#39-46) #### pub fn [new\_disabled](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.new_disabled) () -> Self Trait Implementations[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#trait-implementations) -------------------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#16) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Clone-for-HiveOptions) ### impl [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#16) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.clone) #### fn [clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone) (&self) -> [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") Returns a duplicate of the value. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone) 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#245-247) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.clone_from) #### fn [clone\_from](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from) (&mut self, source: &Self) Performs copy-assignment from `source`. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#16) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Debug-for-HiveOptions) ### impl [Debug](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html "trait core::fmt::Debug") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#16) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.fmt) #### fn [fmt](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt) (&self, f: &mut [Formatter](https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html "struct core::fmt::Formatter") <'\_>) -> [Result](https://doc.rust-lang.org/nightly/core/fmt/type.Result.html "type core::fmt::Result") Formats the value using the given formatter. [Read more](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#49-53) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Default-for-HiveOptions) ### impl [Default](https://doc.rust-lang.org/nightly/core/default/trait.Default.html "trait core::default::Default") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#50-52) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.default) #### fn [default](https://doc.rust-lang.org/nightly/core/default/trait.Default.html#tymethod.default) () -> Self Returns the “default value” for a type. [Read more](https://doc.rust-lang.org/nightly/core/default/trait.Default.html#tymethod.default) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#17) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Deserialize%3C'de%3E-for-HiveOptions) ### impl<'de> [Deserialize](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html "trait serde_core::de::Deserialize") <'de> for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#17) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.deserialize) #### fn [deserialize](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize) <\_\_D>(\_\_deserializer: \_\_D) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") where \_\_D: [Deserializer](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html "trait serde_core::de::Deserializer") <'de>, Deserialize this value from the given Serde deserializer. [Read more](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#16) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Hash-for-HiveOptions) ### impl [Hash](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html "trait core::hash::Hash") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#16) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.hash) #### fn [hash](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#tymethod.hash) <\_\_H: [Hasher](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") \>(&self, state: [&mut \_\_H](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) Feeds this value into the given [`Hasher`](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") . [Read more](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#tymethod.hash) 1.3.0 · [Source](https://doc.rust-lang.org/nightly/src/core/hash/mod.rs.html#235-237) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.hash_slice) #### fn [hash\_slice](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice) (data: &\[Self\], state: [&mut H](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) where H: [Hasher](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") , Self: [Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , Feeds a slice of this type into the given [`Hasher`](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") . [Read more](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#18) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-JsonSchema-for-HiveOptions) ### impl JsonSchema for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#18) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.schema_name) #### fn schema\_name() -> [Cow](https://doc.rust-lang.org/nightly/alloc/borrow/enum.Cow.html "enum alloc::borrow::Cow") <'static, [str](https://doc.rust-lang.org/nightly/std/primitive.str.html) \> The name of the generated JSON Schema. Read more [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#18) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.schema_id) #### fn schema\_id() -> [Cow](https://doc.rust-lang.org/nightly/alloc/borrow/enum.Cow.html "enum alloc::borrow::Cow") <'static, [str](https://doc.rust-lang.org/nightly/std/primitive.str.html) \> Returns a string that uniquely identifies the schema produced by this type. Read more [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#18) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.json_schema) #### fn json\_schema(generator: &mut SchemaGenerator) -> Schema Generates a JSON Schema for this type. Read more [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#18) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.inline_schema) #### fn inline\_schema() -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Whether JSON Schemas generated for this type should be included directly in parent schemas, rather than being re-used where possible using the `$ref` keyword. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.always_inline_schema) #### fn always\_inline\_schema() -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) 👎Deprecated: Use `inline_schema()` instead Only included for backward-compatibility - use `inline_schema()` instead“. Read more [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#16) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-PartialEq-for-HiveOptions) ### impl [PartialEq](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html "trait core::cmp::PartialEq") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#16) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.eq) #### fn [eq](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#tymethod.eq) (&self, other: &[HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests for `self` and `other` values to be equal, and is used by `==`. 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#264) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.ne) #### fn [ne](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne) (&self, other: [&Rhs](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests for `!=`. The default implementation is almost always sufficient, and should not be overridden without very good reason. [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#17) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Serialize-for-HiveOptions) ### impl [Serialize](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html "trait serde_core::ser::Serialize") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#17) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.serialize) #### fn [serialize](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize) <\_\_S>(&self, \_\_serializer: \_\_S) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") <\_\_S::[Ok](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html#associatedtype.Ok "type serde_core::ser::Serializer::Ok") , \_\_S::[Error](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html#associatedtype.Error "type serde_core::ser::Serializer::Error") \> where \_\_S: [Serializer](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html "trait serde_core::ser::Serializer") , Serialize this value into the given Serde serializer. [Read more](https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize) [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#16) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Eq-for-HiveOptions) ### impl [Eq](https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html "trait core::cmp::Eq") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/options.rs.html#16) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-StructuralPartialEq-for-HiveOptions) ### impl [StructuralPartialEq](https://doc.rust-lang.org/nightly/core/marker/trait.StructuralPartialEq.html "trait core::marker::StructuralPartialEq") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") Auto Trait Implementations[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#synthetic-implementations) ----------------------------------------------------------------------------------------------------------------------------- [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Freeze-for-HiveOptions) ### impl [Freeze](https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html "trait core::marker::Freeze") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-RefUnwindSafe-for-HiveOptions) ### impl ![RefUnwindSafe](https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html "trait core::panic::unwind_safe::RefUnwindSafe") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Send-for-HiveOptions) ### impl [Send](https://doc.rust-lang.org/nightly/core/marker/trait.Send.html "trait core::marker::Send") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Sync-for-HiveOptions) ### impl [Sync](https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html "trait core::marker::Sync") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Unpin-for-HiveOptions) ### impl [Unpin](https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html "trait core::marker::Unpin") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-UnwindSafe-for-HiveOptions) ### impl ![UnwindSafe](https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html "trait core::panic::unwind_safe::UnwindSafe") for [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html "struct polars_io::HiveOptions") Blanket Implementations[§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#blanket-implementations) ------------------------------------------------------------------------------------------------------------------------ [Source](https://doc.rust-lang.org/nightly/src/core/any.rs.html#138) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Any-for-T) ### impl [Any](https://doc.rust-lang.org/nightly/core/any/trait.Any.html "trait core::any::Any") for T where T: 'static + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/any.rs.html#139) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.type_id) #### fn [type\_id](https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id) (&self) -> [TypeId](https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html "struct core::any::TypeId") Gets the `TypeId` of `self`. [Read more](https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id) [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#212) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Borrow%3CT%3E-for-T) ### impl [Borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html "trait core::borrow::Borrow") for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#214) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.borrow) #### fn [borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow) (&self) -> [&T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Immutably borrows from an owned value. [Read more](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow) [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-BorrowMut%3CT%3E-for-T) ### impl [BorrowMut](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html "trait core::borrow::BorrowMut") for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#222) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.borrow_mut) #### fn [borrow\_mut](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut) (&mut self) -> [&mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Mutably borrows from an owned value. [Read more](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut) [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#547) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-CloneToUninit-for-T) ### impl [CloneToUninit](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html "trait core::clone::CloneToUninit") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#549) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.clone_to_uninit) #### unsafe fn [clone\_to\_uninit](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html#tymethod.clone_to_uninit) (&self, dest: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) 🔬This is a nightly-only experimental API. (`clone_to_uninit`) Performs copy-assignment from `self` to `dest`. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html#tymethod.clone_to_uninit) [Source](https://docs.rs/dyn-clone/1.0.20/src/dyn_clone/lib.rs.html#196-198) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-DynClone-for-T) ### impl [DynClone](https://docs.rs/dyn-clone/1.0.20/dyn_clone/trait.DynClone.html "trait dyn_clone::DynClone") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://docs.rs/dyn-clone/1.0.20/src/dyn_clone/lib.rs.html#200) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.__clone_box) #### fn [\_\_clone\_box](https://docs.rs/dyn-clone/1.0.20/dyn_clone/trait.DynClone.html#tymethod.__clone_box) (&self, \_: Private) -> [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [()](https://doc.rust-lang.org/nightly/std/primitive.unit.html) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Equivalent%3CK%3E-for-Q) ### impl Equivalent for Q where Q: [Eq](https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html "trait core::cmp::Eq") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , K: [Borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html "trait core::borrow::Borrow") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.equivalent) #### fn equivalent(&self, key: [&K](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Compare self to `key` and return `true` if they are equal. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#785) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-From%3CT%3E-for-T) ### impl [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") for T [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#788) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.from) #### fn [from](https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from) (t: T) -> T Returns the argument unchanged. [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Instrument-for-T) ### impl Instrument for T [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.instrument) #### fn instrument(self, span: Span) -> Instrumented Instruments this type with the provided \[`Span`\], returning an `Instrumented` wrapper. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.in_current_span) #### fn in\_current\_span(self) -> Instrumented Instruments this type with the [current](super::Span::current()) [`Span`](crate::Span) , returning an `Instrumented` wrapper. Read more [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#767-769) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Into%3CU%3E-for-T) ### impl [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") for T where U: [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#777) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.into) #### fn [into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into) (self) -> U Calls `U::from(self)`. That is, this conversion is whatever the implementation of `[From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") for U` chooses to do. [Source](https://docs.rs/either/1/src/either/into_either.rs.html#64) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-IntoEither-for-T) ### impl [IntoEither](https://docs.rs/either/1/either/into_either/trait.IntoEither.html "trait either::into_either::IntoEither") for T [Source](https://docs.rs/either/1/src/either/into_either.rs.html#29) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.into_either) #### fn [into\_either](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either) (self, into\_left: [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) ) -> [Either](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") [ⓘ](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#) Converts `self` into a [`Left`](https://docs.rs/either/1/either/enum.Either.html#variant.Left "variant either::Either::Left") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") if `into_left` is `true`. Converts `self` into a [`Right`](https://docs.rs/either/1/either/enum.Either.html#variant.Right "variant either::Either::Right") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") otherwise. [Read more](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either) [Source](https://docs.rs/either/1/src/either/into_either.rs.html#55-57) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.into_either_with) #### fn [into\_either\_with](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with) (self, into\_left: F) -> [Either](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") [ⓘ](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#) where F: [FnOnce](https://doc.rust-lang.org/nightly/core/ops/function/trait.FnOnce.html "trait core::ops::function::FnOnce") (&Self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) , Converts `self` into a [`Left`](https://docs.rs/either/1/either/enum.Either.html#variant.Left "variant either::Either::Left") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") if `into_left(&self)` returns `true`. Converts `self` into a [`Right`](https://docs.rs/either/1/either/enum.Either.html#variant.Right "variant either::Either::Right") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") otherwise. [Read more](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#91) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Key-for-T) ### impl [Key](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html "trait polars_utils::parma::raw::key::Key") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#92) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.align) #### fn [align](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.align) () -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The alignment necessary for the key. Must return a power of two. [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#96) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.size) #### fn [size](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.size) (&self) -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The size of the key in bytes. [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#101) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.init) #### unsafe fn [init](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.init) (&self, ptr: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) Initialize the key in the given memory location. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.init) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#108) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.get) #### unsafe fn [get](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.get) <'a>(ptr: [\*const](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) -> [&'a T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Get a reference to the key from the given memory location. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.get) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#113) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.drop_in_place) #### unsafe fn [drop\_in\_place](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.drop_in_place) (ptr: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) Drop the key in place. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.drop_in_place) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Pointable-for-T) ### impl Pointable for T [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#associatedconstant.ALIGN) #### const ALIGN: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The alignment of pointer. [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#associatedtype.Init) #### type Init = T The type for initializers. [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.init-1) #### unsafe fn init(init: ::Init) -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) Initializes a with the given initializer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.deref) #### unsafe fn deref<'a>(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) -> [&'a T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Dereferences the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.deref_mut) #### unsafe fn deref\_mut<'a>(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) -> [&'a mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Mutably dereferences the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.drop) #### unsafe fn drop(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) Drops the object pointed to by the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-PolicyExt-for-T) ### impl PolicyExt for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.and) #### fn and(self, other: P) -> And where T: Policy, P: Policy, Create a new `Policy` that returns \[`Action::Follow`\] only if `self` and `other` return `Action::Follow`. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.or) #### fn or(self, other: P) -> Or where T: Policy, P: Policy, Create a new `Policy` that returns \[`Action::Follow`\] if either `self` or `other` returns `Action::Follow`. Read more [Source](https://docs.rs/typenum/1.19.0/src/typenum/type_operators.rs.html#34) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Same-for-T) ### impl [Same](https://docs.rs/typenum/1.19.0/typenum/type_operators/trait.Same.html "trait typenum::type_operators::Same") for T [Source](https://docs.rs/typenum/1.19.0/src/typenum/type_operators.rs.html#35) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#associatedtype.Output) #### type [Output](https://docs.rs/typenum/1.19.0/typenum/type_operators/trait.Same.html#associatedtype.Output) = T Should always be `Self` [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#72-74) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-ToOwned-for-T) ### impl [ToOwned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html "trait alloc::borrow::ToOwned") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#76) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#associatedtype.Owned) #### type [Owned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#associatedtype.Owned) = T The resulting type after obtaining ownership. [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#77) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.to_owned) #### fn [to\_owned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned) (&self) -> T Creates owned data from borrowed data, usually by cloning. [Read more](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned) [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#81) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.clone_into) #### fn [clone\_into](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into) (&self, target: [&mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) Uses borrowed data to replace owned data, usually by cloning. [Read more](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into) [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#827-829) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-TryFrom%3CU%3E-for-T) ### impl [TryFrom](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html "trait core::convert::TryFrom") for T where U: [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#831) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#associatedtype.Error-1) #### type [Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error) = [Infallible](https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html "enum core::convert::Infallible") The type returned in the event of a conversion error. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#834) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.try_from) #### fn [try\_from](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from) (value: U) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") \> Performs the conversion. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#811-813) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-TryInto%3CU%3E-for-T) ### impl [TryInto](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html "trait core::convert::TryInto") for T where U: [TryFrom](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html "trait core::convert::TryFrom") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#815) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#associatedtype.Error) #### type [Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error) = >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") The type returned in the event of a conversion error. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#818) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.try_into) #### fn [try\_into](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into) (self) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") \> Performs the conversion. [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-VZip%3CV%3E-for-T) ### impl VZip for T where V: MultiLane, [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.vzip) #### fn vzip(self) -> V [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-WithSubscriber-for-T) ### impl WithSubscriber for T [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.with_subscriber) #### fn with\_subscriber(self, subscriber: S) -> WithDispatch where S: [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") , Attaches the provided [`Subscriber`](super::Subscriber) to this type, returning a \[`WithDispatch`\] wrapper. Read more [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#method.with_current_subscriber) #### fn with\_current\_subscriber(self) -> WithDispatch Attaches the current [default](https://docs.pola.rs/api/rust/dev/polars_io/dispatcher#setting-the-default-subscriber) [`Subscriber`](super::Subscriber) to this type, returning a \[`WithDispatch`\] wrapper. Read more [Source](https://docs.rs/serde_core/1.0.228/src/serde_core/de/mod.rs.html#633) [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-DeserializeOwned-for-T) ### impl [DeserializeOwned](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.DeserializeOwned.html "trait serde_core::de::DeserializeOwned") for T where T: for<'de> [Deserialize](https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html "trait serde_core::de::Deserialize") <'de>, [§](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html#impl-Ungil-for-T) ### impl Ungil for T where T: [Send](https://doc.rust-lang.org/nightly/core/marker/trait.Send.html "trait core::marker::Send") , --- # List of all items in this crate [All](https://docs.pola.rs/api/rust/dev/polars_time/all.html#) --------------------------------------------------------------- List of all items ================= ### Structs * [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html) * [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html) * [chunkedarray::string::infer::DatetimeInfer](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/string/infer/struct.DatetimeInfer.html) * [prelude::Bounds](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.Bounds.html) * [prelude::BoundsIter](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.BoundsIter.html) * [prelude::Duration](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.Duration.html) * [prelude::GroupByDynamicWindower](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.GroupByDynamicWindower.html) * [prelude::RollingWindower](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.RollingWindower.html) * [prelude::Window](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.Window.html) ### Enums * [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html) * [chunkedarray::string::Pattern](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/string/enum.Pattern.html) * [prelude::ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/prelude/enum.ClosedWindow.html) * [prelude::Label](https://docs.pola.rs/api/rust/dev/polars_time/prelude/enum.Label.html) * [prelude::StartBy](https://docs.pola.rs/api/rust/dev/polars_time/prelude/enum.StartBy.html) ### Traits * [PolarsRound](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsRound.html) * [PolarsUpsample](https://docs.pola.rs/api/rust/dev/polars_time/trait.PolarsUpsample.html) * [chunkedarray::string::AsString](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/string/trait.AsString.html) * [chunkedarray::string::StringMethods](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/string/trait.StringMethods.html) * [chunkedarray::string::infer::StrpTimeParser](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/string/infer/trait.StrpTimeParser.html) * [chunkedarray::string::infer::TryFromWithUnit](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/string/infer/trait.TryFromWithUnit.html) * [series::AsSeries](https://docs.pola.rs/api/rust/dev/polars_time/series/trait.AsSeries.html) * [series::TemporalMethods](https://docs.pola.rs/api/rust/dev/polars_time/series/trait.TemporalMethods.html) ### Functions * [chunkedarray::string::infer::infer\_pattern\_single](https://docs.pola.rs/api/rust/dev/polars_time/chunkedarray/string/infer/fn.infer_pattern_single.html) * [prelude::ensure\_duration\_matches\_dtype](https://docs.pola.rs/api/rust/dev/polars_time/prelude/fn.ensure_duration_matches_dtype.html) * [prelude::ensure\_is\_constant\_duration](https://docs.pola.rs/api/rust/dev/polars_time/prelude/fn.ensure_is_constant_duration.html) * [prelude::group\_by\_values](https://docs.pola.rs/api/rust/dev/polars_time/prelude/fn.group_by_values.html) * [prelude::group\_by\_windows](https://docs.pola.rs/api/rust/dev/polars_time/prelude/fn.group_by_windows.html) --- # polars_io::prelude - Rust [Module prelude](https://docs.pola.rs/api/rust/dev/polars_io/prelude/index.html#) ---------------------------------------------------------------------------------- [polars\_io](https://docs.pola.rs/api/rust/dev/polars_io/index.html) Module prelude Copy item path ============================= [Source](https://docs.pola.rs/api/rust/dev/src/polars_io/prelude.rs.html#1-15) Re-exports[§](https://docs.pola.rs/api/rust/dev/polars_io/prelude/index.html#reexports) ---------------------------------------------------------------------------------------- `pub use crate::[cloud](https://docs.pola.rs/api/rust/dev/polars_io/cloud/index.html "mod polars_io::cloud") ;` `pub use crate::csv::[read](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/index.html "mod polars_io::csv::read") ::*;``csv` `pub use crate::csv::[write](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/index.html "mod polars_io::csv::write") ::*;``csv` `pub use crate::[ipc](https://docs.pola.rs/api/rust/dev/polars_io/ipc/index.html "mod polars_io::ipc") ::*;``ipc` or `ipc_streaming` `pub use crate::[json](https://docs.pola.rs/api/rust/dev/polars_io/json/index.html "mod polars_io::json") ::*;``json` `pub use crate::ndjson::[core](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/index.html "mod polars_io::ndjson::core") ::*;``json` `pub use crate::parquet::[metadata](https://docs.pola.rs/api/rust/dev/polars_io/parquet/metadata/index.html "mod polars_io::parquet::metadata") ::*;``parquet` `pub use crate::parquet::[read](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/index.html "mod polars_io::parquet::read") ::*;``parquet` `pub use crate::parquet::[write](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/index.html "mod polars_io::parquet::write") ::*;``parquet` `pub use crate::[path_utils](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/index.html "mod polars_io::path_utils") ::*;` `pub use crate::[utils](https://docs.pola.rs/api/rust/dev/polars_io/utils/index.html "mod polars_io::utils") ::*;` Structs[§](https://docs.pola.rs/api/rust/dev/polars_io/prelude/index.html#structs) ----------------------------------------------------------------------------------- [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/prelude/struct.HiveOptions.html "struct polars_io::prelude::HiveOptions") Options for Hive partitioning. [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/prelude/struct.RowIndex.html "struct polars_io::prelude::RowIndex") Traits[§](https://docs.pola.rs/api/rust/dev/polars_io/prelude/index.html#traits) --------------------------------------------------------------------------------- [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/prelude/trait.SerReader.html "trait polars_io::prelude::SerReader") [SerWriter](https://docs.pola.rs/api/rust/dev/polars_io/prelude/trait.SerWriter.html "trait polars_io::prelude::SerWriter") --- # Window in polars_time - Rust [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#) ---------------------------------------------------------------------------- [polars\_time](https://docs.pola.rs/api/rust/dev/polars_time/index.html) Struct Window Copy item path ============================ [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#58-65) pub struct Window { pub offset: Duration, /* private fields */ } Expand description Represents a window in time Fields[§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#fields) ----------------------------------------------------------------------------------- [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#structfield.offset) `offset: [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") ` Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#implementations) ----------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#67-200) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Window) ### impl [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#68-75) #### pub fn [new](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.new) (every: [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") , period: [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") , offset: [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") ) -> Self [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#78-80) #### pub fn [truncate\_ns](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.truncate_ns) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> Truncate the given ns timestamp by the window boundary. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#83-85) #### pub fn [truncate\_us](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.truncate_us) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> Truncate the given us timestamp by the window boundary. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#88-90) #### pub fn [truncate\_ms](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.truncate_ms) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> Truncate the given ms timestamp by the window boundary. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#93-96) #### pub fn [round\_ns](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.round_ns) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> Round the given ns timestamp by the window boundary. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#99-103) #### pub fn [round\_us](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.round_us) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> Round the given us timestamp by the window boundary. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#106-110) #### pub fn [round\_ms](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.round_ms) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> Round the given ms timestamp by the window boundary. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#115-133) #### pub fn [get\_earliest\_bounds\_ns](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.get_earliest_bounds_ns) ( &self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , closed\_window: [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>, ) -> PolarsResult<[Bounds](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.Bounds.html "struct polars_time::prelude::Bounds") \> returns the bounds for the earliest window bounds that contains the given time t. For underlapping windows that do not contain time t, the window directly after time t will be returned. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#135-153) #### pub fn [get\_earliest\_bounds\_us](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.get_earliest_bounds_us) ( &self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , closed\_window: [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>, ) -> PolarsResult<[Bounds](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.Bounds.html "struct polars_time::prelude::Bounds") \> [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#155-173) #### pub fn [get\_earliest\_bounds\_ms](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.get_earliest_bounds_ms) ( &self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , closed\_window: [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>, ) -> PolarsResult<[Bounds](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.Bounds.html "struct polars_time::prelude::Bounds") \> [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#190-199) #### pub fn [get\_overlapping\_bounds\_iter](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.get_overlapping_bounds_iter) <'a>( &'a self, boundary: [Bounds](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.Bounds.html "struct polars_time::prelude::Bounds") , closed\_window: [ClosedWindow](https://docs.pola.rs/api/rust/dev/polars_time/enum.ClosedWindow.html "enum polars_time::ClosedWindow") , tu: [TimeUnit](https://docs.pola.rs/api/rust/dev/polars_core/datatypes/temporal/time_unit/enum.TimeUnit.html "enum polars_core::datatypes::temporal::time_unit::TimeUnit") , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&'a Tz>, start\_by: [StartBy](https://docs.pola.rs/api/rust/dev/polars_time/prelude/enum.StartBy.html "enum polars_time::prelude::StartBy") , ) -> PolarsResult<[BoundsIter](https://docs.pola.rs/api/rust/dev/polars_time/prelude/struct.BoundsIter.html "struct polars_time::prelude::BoundsIter") <'a>> Trait Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#trait-implementations) ----------------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#57) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Clone-for-Window) ### impl [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") for [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#57) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.clone) #### fn [clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone) (&self) -> [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") Returns a duplicate of the value. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone) 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#245-247) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.clone_from) #### fn [clone\_from](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from) (&mut self, source: &Self) Performs copy-assignment from `source`. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/window.rs.html#57) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Copy-for-Window) ### impl [Copy](https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html "trait core::marker::Copy") for [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") Auto Trait Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#synthetic-implementations) -------------------------------------------------------------------------------------------------------------------------- [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Freeze-for-Window) ### impl [Freeze](https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html "trait core::marker::Freeze") for [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-RefUnwindSafe-for-Window) ### impl [RefUnwindSafe](https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html "trait core::panic::unwind_safe::RefUnwindSafe") for [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Send-for-Window) ### impl [Send](https://doc.rust-lang.org/nightly/core/marker/trait.Send.html "trait core::marker::Send") for [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Sync-for-Window) ### impl [Sync](https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html "trait core::marker::Sync") for [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Unpin-for-Window) ### impl [Unpin](https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html "trait core::marker::Unpin") for [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-UnwindSafe-for-Window) ### impl [UnwindSafe](https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html "trait core::panic::unwind_safe::UnwindSafe") for [Window](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html "struct polars_time::Window") Blanket Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#blanket-implementations) --------------------------------------------------------------------------------------------------------------------- [Source](https://doc.rust-lang.org/nightly/src/core/any.rs.html#138) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Any-for-T) ### impl [Any](https://doc.rust-lang.org/nightly/core/any/trait.Any.html "trait core::any::Any") for T where T: 'static + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/any.rs.html#139) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.type_id) #### fn [type\_id](https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id) (&self) -> [TypeId](https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html "struct core::any::TypeId") Gets the `TypeId` of `self`. [Read more](https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id) [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#212) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Borrow%3CT%3E-for-T) ### impl [Borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html "trait core::borrow::Borrow") for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#214) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.borrow) #### fn [borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow) (&self) -> [&T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Immutably borrows from an owned value. [Read more](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow) [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-BorrowMut%3CT%3E-for-T) ### impl [BorrowMut](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html "trait core::borrow::BorrowMut") for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#222) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.borrow_mut) #### fn [borrow\_mut](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut) (&mut self) -> [&mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Mutably borrows from an owned value. [Read more](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut) [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#547) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-CloneToUninit-for-T) ### impl [CloneToUninit](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html "trait core::clone::CloneToUninit") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#549) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.clone_to_uninit) #### unsafe fn [clone\_to\_uninit](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html#tymethod.clone_to_uninit) (&self, dest: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) 🔬This is a nightly-only experimental API. (`clone_to_uninit`) Performs copy-assignment from `self` to `dest`. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html#tymethod.clone_to_uninit) [Source](https://docs.rs/dyn-clone/1.0.20/src/dyn_clone/lib.rs.html#196-198) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-DynClone-for-T) ### impl [DynClone](https://docs.rs/dyn-clone/1.0.20/dyn_clone/trait.DynClone.html "trait dyn_clone::DynClone") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://docs.rs/dyn-clone/1.0.20/src/dyn_clone/lib.rs.html#200) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.__clone_box) #### fn [\_\_clone\_box](https://docs.rs/dyn-clone/1.0.20/dyn_clone/trait.DynClone.html#tymethod.__clone_box) (&self, \_: Private) -> [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [()](https://doc.rust-lang.org/nightly/std/primitive.unit.html) [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#785) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-From%3CT%3E-for-T) ### impl [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") for T [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#788) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.from) #### fn [from](https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from) (t: T) -> T Returns the argument unchanged. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#767-769) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Into%3CU%3E-for-T) ### impl [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") for T where U: [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#777) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.into) #### fn [into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into) (self) -> U Calls `U::from(self)`. That is, this conversion is whatever the implementation of `[From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") for U` chooses to do. [Source](https://docs.rs/either/1/src/either/into_either.rs.html#64) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-IntoEither-for-T) ### impl [IntoEither](https://docs.rs/either/1/either/into_either/trait.IntoEither.html "trait either::into_either::IntoEither") for T [Source](https://docs.rs/either/1/src/either/into_either.rs.html#29) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.into_either) #### fn [into\_either](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either) (self, into\_left: [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) ) -> [Either](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") Converts `self` into a [`Left`](https://docs.rs/either/1/either/enum.Either.html#variant.Left "variant either::Either::Left") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") if `into_left` is `true`. Converts `self` into a [`Right`](https://docs.rs/either/1/either/enum.Either.html#variant.Right "variant either::Either::Right") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") otherwise. [Read more](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either) [Source](https://docs.rs/either/1/src/either/into_either.rs.html#55-57) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.into_either_with) #### fn [into\_either\_with](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with) (self, into\_left: F) -> [Either](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") where F: [FnOnce](https://doc.rust-lang.org/nightly/core/ops/function/trait.FnOnce.html "trait core::ops::function::FnOnce") (&Self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) , Converts `self` into a [`Left`](https://docs.rs/either/1/either/enum.Either.html#variant.Left "variant either::Either::Left") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") if `into_left(&self)` returns `true`. Converts `self` into a [`Right`](https://docs.rs/either/1/either/enum.Either.html#variant.Right "variant either::Either::Right") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") otherwise. [Read more](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#91) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Key-for-T) ### impl [Key](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html "trait polars_utils::parma::raw::key::Key") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#92) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.align) #### fn [align](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.align) () -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The alignment necessary for the key. Must return a power of two. [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#96) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.size) #### fn [size](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.size) (&self) -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The size of the key in bytes. [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#101) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.init) #### unsafe fn [init](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.init) (&self, ptr: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) Initialize the key in the given memory location. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.init) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#108) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.get) #### unsafe fn [get](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.get) <'a>(ptr: [\*const](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) -> [&'a T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Get a reference to the key from the given memory location. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.get) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#113) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.drop_in_place) #### unsafe fn [drop\_in\_place](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.drop_in_place) (ptr: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) Drop the key in place. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.drop_in_place) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-Pointable-for-T) ### impl Pointable for T [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#associatedconstant.ALIGN) #### const ALIGN: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The alignment of pointer. [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#associatedtype.Init) #### type Init = T The type for initializers. [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.init-1) #### unsafe fn init(init: ::Init) -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) Initializes a with the given initializer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.deref) #### unsafe fn deref<'a>(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) -> [&'a T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Dereferences the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.deref_mut) #### unsafe fn deref\_mut<'a>(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) -> [&'a mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Mutably dereferences the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.drop) #### unsafe fn drop(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) Drops the object pointed to by the given pointer. Read more [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#72-74) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-ToOwned-for-T) ### impl [ToOwned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html "trait alloc::borrow::ToOwned") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#76) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#associatedtype.Owned) #### type [Owned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#associatedtype.Owned) = T The resulting type after obtaining ownership. [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#77) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.to_owned) #### fn [to\_owned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned) (&self) -> T Creates owned data from borrowed data, usually by cloning. [Read more](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned) [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#81) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.clone_into) #### fn [clone\_into](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into) (&self, target: [&mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) Uses borrowed data to replace owned data, usually by cloning. [Read more](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into) [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#827-829) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-TryFrom%3CU%3E-for-T) ### impl [TryFrom](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html "trait core::convert::TryFrom") for T where U: [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#831) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#associatedtype.Error-1) #### type [Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error) = [Infallible](https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html "enum core::convert::Infallible") The type returned in the event of a conversion error. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#834) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.try_from) #### fn [try\_from](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from) (value: U) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") \> Performs the conversion. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#811-813) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-TryInto%3CU%3E-for-T) ### impl [TryInto](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html "trait core::convert::TryInto") for T where U: [TryFrom](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html "trait core::convert::TryFrom") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#815) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#associatedtype.Error) #### type [Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error) = >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") The type returned in the event of a conversion error. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#818) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.try_into) #### fn [try\_into](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into) (self) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") \> Performs the conversion. [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#impl-VZip%3CV%3E-for-T) ### impl VZip for T where V: MultiLane, [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Window.html#method.vzip) #### fn vzip(self) -> V --- # Duration in polars_time - Rust [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#) -------------------------------------------------------------------------------- [polars\_time](https://docs.pola.rs/api/rust/dev/polars_time/index.html) Struct Duration Copy item path ============================== [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#33-46) pub struct Duration { pub parsed_int: bool, /* private fields */ } Fields[§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#fields) ------------------------------------------------------------------------------------- [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#structfield.parsed_int) `parsed_int: [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) ` Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#implementations) ------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#109-1054) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Duration) ### impl [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#111-120) #### pub const fn [new](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.new) (fixed\_slots: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) ) -> Self Create a new integer size `Duration` [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#156-158) #### pub fn [parse](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.parse) (duration: &[str](https://doc.rust-lang.org/nightly/std/primitive.str.html) ) -> Self Parse a string into a `Duration` Strings are composed of a sequence of number-unit pairs, such as `5d` (5 days). A string may begin with a minus sign, in which case it is interpreted as a negative duration. Some examples: * `"1y"`: 1 year * `"-1w2d"`: negative 1 week, 2 days (i.e. -9 days) * `"3d12h4m25s"`: 3 days, 12 hours, 4 minutes, and 25 seconds Aside from a leading minus sign, strings may not contain any characters other than numbers and letters (including whitespace). The available units, in ascending order of magnitude, are as follows: * `ns`: nanosecond * `us`: microsecond * `ms`: millisecond * `s`: second * `m`: minute * `h`: hour * `d`: day * `w`: week * `mo`: calendar month * `q`: calendar quarter * `y`: calendar year * `i`: index value (only for {Int32, Int64} dtypes) By “calendar day”, we mean the corresponding time on the next day (which may not be 24 hours, depending on daylight savings). Similarly for “calendar week”, “calendar month”, “calendar quarter”, and “calendar year”. ##### [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#panics) Panics If the given str is invalid for any reason. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#168-170) #### pub fn [try\_parse](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.try_parse) (duration: &[str](https://doc.rust-lang.org/nightly/std/primitive.str.html) ) -> PolarsResult [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#172-174) #### pub fn [try\_parse\_interval](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.try_parse_interval) (interval: &[str](https://doc.rust-lang.org/nightly/std/primitive.str.html) ) -> PolarsResult [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#440-442) #### pub fn [is\_zero](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.is_zero) (&self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) `true` if zero duration. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#444-446) #### pub fn [months\_only](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.months_only) (&self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#448-450) #### pub fn [months](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.months) (&self) -> [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#452-454) #### pub fn [weeks\_only](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.weeks_only) (&self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#456-458) #### pub fn [weeks](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.weeks) (&self) -> [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#460-462) #### pub fn [days\_only](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.days_only) (&self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#464-466) #### pub fn [days](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.days) (&self) -> [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#472-474) #### pub fn [is\_full\_days](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.is_full_days) (&self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Returns whether the duration consists of full days. Note that 24 hours is not considered a full day due to possible daylight savings time transitions. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#476-484) #### pub fn [is\_constant\_duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.is_constant_duration) (&self, time\_zone: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&[TimeZone](https://docs.pola.rs/api/rust/dev/polars_core/datatypes/temporal/time_zone/struct.TimeZone.html "struct polars_core::datatypes::temporal::time_zone::TimeZone") \>) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#487-489) #### pub fn [nanoseconds](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.nanoseconds) (&self) -> [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) Returns the nanoseconds from the `Duration` without the weeks or months part. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#492-494) #### pub fn [negative](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.negative) (&self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Returns whether duration is negative. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#829-895) #### pub fn [truncate\_impl](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.truncate_impl) ( &self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>, nsecs\_to\_unit: F, timestamp\_to\_datetime: G, datetime\_to\_timestamp: J, ) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> where F: [Fn](https://doc.rust-lang.org/nightly/core/ops/function/trait.Fn.html "trait core::ops::function::Fn") ([i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) ) -> [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , G: [Fn](https://doc.rust-lang.org/nightly/core/ops/function/trait.Fn.html "trait core::ops::function::Fn") ([i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) ) -> [NaiveDateTime](https://docs.rs/chrono/latest/chrono/naive/datetime/struct.NaiveDateTime.html "struct chrono::naive::datetime::NaiveDateTime") , J: [Fn](https://doc.rust-lang.org/nightly/core/ops/function/trait.Fn.html "trait core::ops::function::Fn") ([NaiveDateTime](https://docs.rs/chrono/latest/chrono/naive/datetime/struct.NaiveDateTime.html "struct chrono::naive::datetime::NaiveDateTime") ) -> [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#899-907) #### pub fn [truncate\_ns](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.truncate_ns) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#911-919) #### pub fn [truncate\_us](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.truncate_us) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#923-931) #### pub fn [truncate\_ms](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.truncate_ms) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#1016-1027) #### pub fn [add\_ns](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.add_ns) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#1029-1040) #### pub fn [add\_us](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.add_us) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#1042-1053) #### pub fn [add\_ms](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.add_ms) (&self, t: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) , tz: [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <&Tz>) -> PolarsResult<[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> Trait Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#trait-implementations) ------------------------------------------------------------------------------------------------------------------- [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Clone-for-Duration) ### impl [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.clone) #### fn [clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone) (&self) -> [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") Returns a duplicate of the value. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone) 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#245-247) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.clone_from) #### fn [clone\_from](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from) (&mut self, source: &Self) Performs copy-assignment from `source`. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Debug-for-Duration) ### impl [Debug](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html "trait core::fmt::Debug") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.fmt) #### fn [fmt](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt) (&self, f: &mut [Formatter](https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html "struct core::fmt::Formatter") <'\_>) -> [Result](https://doc.rust-lang.org/nightly/core/fmt/type.Result.html "type core::fmt::Result") Formats the value using the given formatter. [Read more](https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#75-107) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Display-for-Duration) ### impl [Display](https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html "trait core::fmt::Display") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#76-106) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.fmt-1) #### fn [fmt](https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html#tymethod.fmt) (&self, f: &mut [Formatter](https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html "struct core::fmt::Formatter") <'\_>) -> [Result](https://doc.rust-lang.org/nightly/core/fmt/type.Result.html "type core::fmt::Result") Formats the value using the given formatter. [Read more](https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html#tymethod.fmt) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Hash-for-Duration) ### impl [Hash](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html "trait core::hash::Hash") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.hash) #### fn [hash](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#tymethod.hash) <\_\_H: [Hasher](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") \>(&self, state: [&mut \_\_H](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) Feeds this value into the given [`Hasher`](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") . [Read more](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#tymethod.hash) 1.3.0 · [Source](https://doc.rust-lang.org/nightly/src/core/hash/mod.rs.html#235-237) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.hash_slice) #### fn [hash\_slice](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice) (data: &\[Self\], state: [&mut H](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) where H: [Hasher](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") , Self: [Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , Feeds a slice of this type into the given [`Hasher`](https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html "trait core::hash::Hasher") . [Read more](https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#1056-1070) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Mul%3Ci64%3E-for-Duration) ### impl [Mul](https://doc.rust-lang.org/nightly/core/ops/arith/trait.Mul.html "trait core::ops::arith::Mul") <[i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) \> for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#1057) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#associatedtype.Output-1) #### type [Output](https://doc.rust-lang.org/nightly/core/ops/arith/trait.Mul.html#associatedtype.Output) = [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") The resulting type after applying the `*` operator. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#1059-1069) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.mul) #### fn [mul](https://doc.rust-lang.org/nightly/core/ops/arith/trait.Mul.html#tymethod.mul) (self, rhs: [i64](https://doc.rust-lang.org/nightly/std/primitive.i64.html) ) -> Self Performs the `*` operation. [Read more](https://doc.rust-lang.org/nightly/core/ops/arith/trait.Mul.html#tymethod.mul) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#60-73) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Neg-for-Duration) ### impl [Neg](https://doc.rust-lang.org/nightly/core/ops/arith/trait.Neg.html "trait core::ops::arith::Neg") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#61) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#associatedtype.Output) #### type [Output](https://doc.rust-lang.org/nightly/core/ops/arith/trait.Neg.html#associatedtype.Output) = [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") The resulting type after applying the `-` operator. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#63-72) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.neg) #### fn [neg](https://doc.rust-lang.org/nightly/core/ops/arith/trait.Neg.html#tymethod.neg) (self) -> Self::[Output](https://doc.rust-lang.org/nightly/core/ops/arith/trait.Neg.html#associatedtype.Output "type core::ops::arith::Neg::Output") Performs the unary `-` operation. [Read more](https://doc.rust-lang.org/nightly/core/ops/arith/trait.Neg.html#tymethod.neg) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#54-58) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Ord-for-Duration) ### impl [Ord](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html "trait core::cmp::Ord") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#55-57) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.cmp) #### fn [cmp](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html#tymethod.cmp) (&self, other: &Self) -> [Ordering](https://doc.rust-lang.org/nightly/core/cmp/enum.Ordering.html "enum core::cmp::Ordering") This method returns an [`Ordering`](https://doc.rust-lang.org/nightly/core/cmp/enum.Ordering.html "enum core::cmp::Ordering") between `self` and `other`. [Read more](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html#tymethod.cmp) 1.21.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1021-1023) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.max) #### fn [max](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html#method.max) (self, other: Self) -> Self where Self: [Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , Compares and returns the maximum of two values. [Read more](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html#method.max) 1.21.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1060-1062) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.min) #### fn [min](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html#method.min) (self, other: Self) -> Self where Self: [Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , Compares and returns the minimum of two values. [Read more](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html#method.min) 1.50.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1086-1088) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.clamp) #### fn [clamp](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html#method.clamp) (self, min: Self, max: Self) -> Self where Self: [Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , Restrict a value to a certain interval. [Read more](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html#method.clamp) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-PartialEq-for-Duration) ### impl [PartialEq](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html "trait core::cmp::PartialEq") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.eq) #### fn [eq](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#tymethod.eq) (&self, other: &[Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests for `self` and `other` values to be equal, and is used by `==`. 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#264) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.ne) #### fn [ne](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne) (&self, other: [&Rhs](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests for `!=`. The default implementation is almost always sufficient, and should not be overridden without very good reason. [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#48-52) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-PartialOrd-for-Duration) ### impl [PartialOrd](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html "trait core::cmp::PartialOrd") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#49-51) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.partial_cmp) #### fn [partial\_cmp](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#tymethod.partial_cmp) (&self, other: &Self) -> [Option](https://doc.rust-lang.org/nightly/core/option/enum.Option.html "enum core::option::Option") <[Ordering](https://doc.rust-lang.org/nightly/core/cmp/enum.Ordering.html "enum core::cmp::Ordering") \> This method returns an ordering between `self` and `other` values if one exists. [Read more](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#tymethod.partial_cmp) 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1398) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.lt) #### fn [lt](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.lt) (&self, other: [&Rhs](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests less than (for `self` and `other`) and is used by the `<` operator. [Read more](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.lt) 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1416) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.le) #### fn [le](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.le) (&self, other: [&Rhs](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests less than or equal to (for `self` and `other`) and is used by the `<=` operator. [Read more](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.le) 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1434) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.gt) #### fn [gt](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.gt) (&self, other: [&Rhs](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests greater than (for `self` and `other`) and is used by the `>` operator. [Read more](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.gt) 1.0.0 · [Source](https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1452) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.ge) #### fn [ge](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.ge) (&self, other: [&Rhs](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Tests greater than or equal to (for `self` and `other`) and is used by the `>=` operator. [Read more](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.ge) [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Copy-for-Duration) ### impl [Copy](https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html "trait core::marker::Copy") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Eq-for-Duration) ### impl [Eq](https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html "trait core::cmp::Eq") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [Source](https://docs.pola.rs/api/rust/dev/src/polars_time/windows/duration.rs.html#30) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-StructuralPartialEq-for-Duration) ### impl [StructuralPartialEq](https://doc.rust-lang.org/nightly/core/marker/trait.StructuralPartialEq.html "trait core::marker::StructuralPartialEq") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") Auto Trait Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#synthetic-implementations) ---------------------------------------------------------------------------------------------------------------------------- [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Freeze-for-Duration) ### impl [Freeze](https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html "trait core::marker::Freeze") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-RefUnwindSafe-for-Duration) ### impl [RefUnwindSafe](https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html "trait core::panic::unwind_safe::RefUnwindSafe") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Send-for-Duration) ### impl [Send](https://doc.rust-lang.org/nightly/core/marker/trait.Send.html "trait core::marker::Send") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Sync-for-Duration) ### impl [Sync](https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html "trait core::marker::Sync") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Unpin-for-Duration) ### impl [Unpin](https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html "trait core::marker::Unpin") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-UnwindSafe-for-Duration) ### impl [UnwindSafe](https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html "trait core::panic::unwind_safe::UnwindSafe") for [Duration](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html "struct polars_time::Duration") Blanket Implementations[§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#blanket-implementations) ----------------------------------------------------------------------------------------------------------------------- [Source](https://doc.rust-lang.org/nightly/src/core/any.rs.html#138) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Any-for-T) ### impl [Any](https://doc.rust-lang.org/nightly/core/any/trait.Any.html "trait core::any::Any") for T where T: 'static + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/any.rs.html#139) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.type_id) #### fn [type\_id](https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id) (&self) -> [TypeId](https://doc.rust-lang.org/nightly/core/any/struct.TypeId.html "struct core::any::TypeId") Gets the `TypeId` of `self`. [Read more](https://doc.rust-lang.org/nightly/core/any/trait.Any.html#tymethod.type_id) [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#212) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Borrow%3CT%3E-for-T) ### impl [Borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html "trait core::borrow::Borrow") for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#214) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.borrow) #### fn [borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow) (&self) -> [&T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Immutably borrows from an owned value. [Read more](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html#tymethod.borrow) [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#221) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-BorrowMut%3CT%3E-for-T) ### impl [BorrowMut](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html "trait core::borrow::BorrowMut") for T where T: ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#222) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.borrow_mut) #### fn [borrow\_mut](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut) (&mut self) -> [&mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Mutably borrows from an owned value. [Read more](https://doc.rust-lang.org/nightly/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut) [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#547) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-CloneToUninit-for-T) ### impl [CloneToUninit](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html "trait core::clone::CloneToUninit") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://doc.rust-lang.org/nightly/src/core/clone.rs.html#549) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.clone_to_uninit) #### unsafe fn [clone\_to\_uninit](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html#tymethod.clone_to_uninit) (&self, dest: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) 🔬This is a nightly-only experimental API. (`clone_to_uninit`) Performs copy-assignment from `self` to `dest`. [Read more](https://doc.rust-lang.org/nightly/core/clone/trait.CloneToUninit.html#tymethod.clone_to_uninit) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Comparable%3CK%3E-for-Q) ### impl Comparable for Q where Q: [Ord](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html "trait core::cmp::Ord") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , K: [Borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html "trait core::borrow::Borrow") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.compare) #### fn compare(&self, key: [&K](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [Ordering](https://doc.rust-lang.org/nightly/core/cmp/enum.Ordering.html "enum core::cmp::Ordering") Compare self to `key` and return their ordering. [Source](https://docs.rs/dyn-clone/1.0.20/src/dyn_clone/lib.rs.html#196-198) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-DynClone-for-T) ### impl [DynClone](https://docs.rs/dyn-clone/1.0.20/dyn_clone/trait.DynClone.html "trait dyn_clone::DynClone") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://docs.rs/dyn-clone/1.0.20/src/dyn_clone/lib.rs.html#200) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.__clone_box) #### fn [\_\_clone\_box](https://docs.rs/dyn-clone/1.0.20/dyn_clone/trait.DynClone.html#tymethod.__clone_box) (&self, \_: Private) -> [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [()](https://doc.rust-lang.org/nightly/std/primitive.unit.html) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Equivalent%3CK%3E-for-Q) ### impl Equivalent for Q where Q: [Eq](https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html "trait core::cmp::Eq") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , K: [Borrow](https://doc.rust-lang.org/nightly/core/borrow/trait.Borrow.html "trait core::borrow::Borrow") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.equivalent) #### fn equivalent(&self, key: [&K](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) Compare self to `key` and return `true` if they are equal. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#785) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-From%3CT%3E-for-T) ### impl [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") for T [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#788) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.from) #### fn [from](https://doc.rust-lang.org/nightly/core/convert/trait.From.html#tymethod.from) (t: T) -> T Returns the argument unchanged. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#767-769) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Into%3CU%3E-for-T) ### impl [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") for T where U: [From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#777) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.into) #### fn [into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html#tymethod.into) (self) -> U Calls `U::from(self)`. That is, this conversion is whatever the implementation of `[From](https://doc.rust-lang.org/nightly/core/convert/trait.From.html "trait core::convert::From") for U` chooses to do. [Source](https://docs.rs/either/1/src/either/into_either.rs.html#64) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-IntoEither-for-T) ### impl [IntoEither](https://docs.rs/either/1/either/into_either/trait.IntoEither.html "trait either::into_either::IntoEither") for T [Source](https://docs.rs/either/1/src/either/into_either.rs.html#29) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.into_either) #### fn [into\_either](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either) (self, into\_left: [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) ) -> [Either](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") Converts `self` into a [`Left`](https://docs.rs/either/1/either/enum.Either.html#variant.Left "variant either::Either::Left") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") if `into_left` is `true`. Converts `self` into a [`Right`](https://docs.rs/either/1/either/enum.Either.html#variant.Right "variant either::Either::Right") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") otherwise. [Read more](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either) [Source](https://docs.rs/either/1/src/either/into_either.rs.html#55-57) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.into_either_with) #### fn [into\_either\_with](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with) (self, into\_left: F) -> [Either](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") where F: [FnOnce](https://doc.rust-lang.org/nightly/core/ops/function/trait.FnOnce.html "trait core::ops::function::FnOnce") (&Self) -> [bool](https://doc.rust-lang.org/nightly/std/primitive.bool.html) , Converts `self` into a [`Left`](https://docs.rs/either/1/either/enum.Either.html#variant.Left "variant either::Either::Left") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") if `into_left(&self)` returns `true`. Converts `self` into a [`Right`](https://docs.rs/either/1/either/enum.Either.html#variant.Right "variant either::Either::Right") variant of [`Either`](https://docs.rs/either/1/either/enum.Either.html "enum either::Either") otherwise. [Read more](https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#91) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Key-for-T) ### impl [Key](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html "trait polars_utils::parma::raw::key::Key") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#92) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.align) #### fn [align](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.align) () -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The alignment necessary for the key. Must return a power of two. [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#96) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.size) #### fn [size](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.size) (&self) -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The size of the key in bytes. [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#101) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.init) #### unsafe fn [init](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.init) (&self, ptr: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) Initialize the key in the given memory location. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.init) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#108) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.get) #### unsafe fn [get](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.get) <'a>(ptr: [\*const](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) -> [&'a T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Get a reference to the key from the given memory location. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.get) [Source](https://docs.pola.rs/api/rust/dev/src/polars_utils/parma/raw/key.rs.html#113) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.drop_in_place) #### unsafe fn [drop\_in\_place](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.drop_in_place) (ptr: [\*mut](https://doc.rust-lang.org/nightly/std/primitive.pointer.html) [u8](https://doc.rust-lang.org/nightly/std/primitive.u8.html) ) Drop the key in place. [Read more](https://docs.pola.rs/api/rust/dev/polars_utils/parma/raw/key/trait.Key.html#tymethod.drop_in_place) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-Pointable-for-T) ### impl Pointable for T [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#associatedconstant.ALIGN) #### const ALIGN: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) The alignment of pointer. [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#associatedtype.Init) #### type Init = T The type for initializers. [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.init-1) #### unsafe fn init(init: ::Init) -> [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) Initializes a with the given initializer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.deref) #### unsafe fn deref<'a>(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) -> [&'a T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Dereferences the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.deref_mut) #### unsafe fn deref\_mut<'a>(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) -> [&'a mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) Mutably dereferences the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.drop) #### unsafe fn drop(ptr: [usize](https://doc.rust-lang.org/nightly/std/primitive.usize.html) ) Drops the object pointed to by the given pointer. Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-ToCompactString-for-T) ### impl ToCompactString for T where T: [Display](https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html "trait core::fmt::Display") , [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.try_to_compact_string) #### fn try\_to\_compact\_string(&self) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") Fallible version of \[`ToCompactString::to_compact_string()`\] Read more [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.to_compact_string) #### fn to\_compact\_string(&self) -> CompactString Converts the given value to a \[`CompactString`\]. Read more [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#72-74) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-ToOwned-for-T) ### impl [ToOwned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html "trait alloc::borrow::ToOwned") for T where T: [Clone](https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html "trait core::clone::Clone") , [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#76) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#associatedtype.Owned) #### type [Owned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#associatedtype.Owned) = T The resulting type after obtaining ownership. [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#77) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.to_owned) #### fn [to\_owned](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned) (&self) -> T Creates owned data from borrowed data, usually by cloning. [Read more](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#tymethod.to_owned) [Source](https://doc.rust-lang.org/nightly/src/alloc/borrow.rs.html#81) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.clone_into) #### fn [clone\_into](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into) (&self, target: [&mut T](https://doc.rust-lang.org/nightly/std/primitive.reference.html) ) Uses borrowed data to replace owned data, usually by cloning. [Read more](https://doc.rust-lang.org/nightly/alloc/borrow/trait.ToOwned.html#method.clone_into) [Source](https://doc.rust-lang.org/nightly/src/alloc/string.rs.html#2893) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-ToString-for-T) ### impl [ToString](https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html "trait alloc::string::ToString") for T where T: [Display](https://doc.rust-lang.org/nightly/core/fmt/trait.Display.html "trait core::fmt::Display") + ?[Sized](https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html "trait core::marker::Sized") , [Source](https://doc.rust-lang.org/nightly/src/alloc/string.rs.html#2895) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.to_string) #### fn [to\_string](https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html#tymethod.to_string) (&self) -> [String](https://doc.rust-lang.org/nightly/alloc/string/struct.String.html "struct alloc::string::String") Converts the given value to a `String`. [Read more](https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html#tymethod.to_string) [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#827-829) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-TryFrom%3CU%3E-for-T) ### impl [TryFrom](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html "trait core::convert::TryFrom") for T where U: [Into](https://doc.rust-lang.org/nightly/core/convert/trait.Into.html "trait core::convert::Into") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#831) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#associatedtype.Error-1) #### type [Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error) = [Infallible](https://doc.rust-lang.org/nightly/core/convert/enum.Infallible.html "enum core::convert::Infallible") The type returned in the event of a conversion error. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#834) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.try_from) #### fn [try\_from](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#tymethod.try_from) (value: U) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") \> Performs the conversion. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#811-813) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-TryInto%3CU%3E-for-T) ### impl [TryInto](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html "trait core::convert::TryInto") for T where U: [TryFrom](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html "trait core::convert::TryFrom") , [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#815) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#associatedtype.Error) #### type [Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#associatedtype.Error) = >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") The type returned in the event of a conversion error. [Source](https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#818) [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.try_into) #### fn [try\_into](https://doc.rust-lang.org/nightly/core/convert/trait.TryInto.html#tymethod.try_into) (self) -> [Result](https://doc.rust-lang.org/nightly/core/result/enum.Result.html "enum core::result::Result") >::[Error](https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html#associatedtype.Error "type core::convert::TryFrom::Error") \> Performs the conversion. [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#impl-VZip%3CV%3E-for-T) ### impl VZip for T where V: MultiLane, [§](https://docs.pola.rs/api/rust/dev/polars_time/struct.Duration.html#method.vzip) #### fn vzip(self) -> V --- # List of all items in this crate [All](https://docs.pola.rs/api/rust/dev/polars_io/all.html#) ------------------------------------------------------------- List of all items ================= ### Structs * [HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/struct.HiveOptions.html) * [RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/struct.RowIndex.html) * [avro::AvroReader](https://docs.pola.rs/api/rust/dev/polars_io/avro/struct.AvroReader.html) * [avro::AvroWriter](https://docs.pola.rs/api/rust/dev/polars_io/avro/struct.AvroWriter.html) * [catalog::unity::client::CatalogClient](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/client/struct.CatalogClient.html) * [catalog::unity::client::CatalogClientBuilder](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/client/struct.CatalogClientBuilder.html) * [catalog::unity::client::ListCatalogs](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/client/struct.ListCatalogs.html) * [catalog::unity::client::ListSchemas](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/client/struct.ListSchemas.html) * [catalog::unity::client::ListTables](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/client/struct.ListTables.html) * [catalog::unity::models::CatalogInfo](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/struct.CatalogInfo.html) * [catalog::unity::models::ColumnInfo](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/struct.ColumnInfo.html) * [catalog::unity::models::ColumnTypeJson](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/struct.ColumnTypeJson.html) * [catalog::unity::models::NamespaceInfo](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/struct.NamespaceInfo.html) * [catalog::unity::models::TableCredentials](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/struct.TableCredentials.html) * [catalog::unity::models::TableCredentialsAws](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/struct.TableCredentialsAws.html) * [catalog::unity::models::TableCredentialsAzure](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/struct.TableCredentialsAzure.html) * [catalog::unity::models::TableCredentialsGcp](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/struct.TableCredentialsGcp.html) * [catalog::unity::models::TableInfo](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/struct.TableInfo.html) * [cloud::BlockingCloudWriter](https://docs.pola.rs/api/rust/dev/polars_io/cloud/struct.BlockingCloudWriter.html) * [cloud::CloudLocation](https://docs.pola.rs/api/rust/dev/polars_io/cloud/struct.CloudLocation.html) * [cloud::PolarsObjectStore](https://docs.pola.rs/api/rust/dev/polars_io/cloud/struct.PolarsObjectStore.html) * [cloud::credential\_provider::AwsCredential](https://docs.pola.rs/api/rust/dev/polars_io/cloud/credential_provider/struct.AwsCredential.html) * [cloud::credential\_provider::CredentialProviderFunction](https://docs.pola.rs/api/rust/dev/polars_io/cloud/credential_provider/struct.CredentialProviderFunction.html) * [cloud::credential\_provider::GcpCredential](https://docs.pola.rs/api/rust/dev/polars_io/cloud/credential_provider/struct.GcpCredential.html) * [cloud::options::CloudOptions](https://docs.pola.rs/api/rust/dev/polars_io/cloud/options/struct.CloudOptions.html) * [csv::read::CsvParseOptions](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/struct.CsvParseOptions.html) * [csv::read::CsvReadOptions](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/struct.CsvReadOptions.html) * [csv::read::CsvReader](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/struct.CsvReader.html) * [csv::read::SplitLines](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/struct.SplitLines.html) * [csv::read::\_csv\_read\_internal::CountLines](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/_csv_read_internal/struct.CountLines.html) * [csv::read::\_csv\_read\_internal::SplitLines](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/_csv_read_internal/struct.SplitLines.html) * [csv::read::buffer::CategoricalField](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/buffer/struct.CategoricalField.html) * [csv::read::buffer::DatetimeField](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/buffer/struct.DatetimeField.html) * [csv::read::buffer::DecimalField](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/buffer/struct.DecimalField.html) * [csv::read::buffer::Utf8Field](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/buffer/struct.Utf8Field.html) * [csv::write::BatchedWriter](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/struct.BatchedWriter.html) * [csv::write::CsvSerializer](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/struct.CsvSerializer.html) * [csv::write::CsvWriter](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/struct.CsvWriter.html) * [csv::write::CsvWriterOptions](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/struct.CsvWriterOptions.html) * [csv::write::SerializeOptions](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/struct.SerializeOptions.html) * [file\_cache::FileCacheEntry](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/struct.FileCacheEntry.html) * [hive::HivePathFormatter](https://docs.pola.rs/api/rust/dev/polars_io/hive/struct.HivePathFormatter.html) * [ipc::BatchedWriter](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.BatchedWriter.html) * [ipc::IpcReadOptions](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcReadOptions.html) * [ipc::IpcReader](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcReader.html) * [ipc::IpcReaderAsync](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcReaderAsync.html) * [ipc::IpcScanOptions](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcScanOptions.html) * [ipc::IpcStreamReader](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcStreamReader.html) * [ipc::IpcStreamWriter](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcStreamWriter.html) * [ipc::IpcStreamWriterOption](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcStreamWriterOption.html) * [ipc::IpcWriter](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcWriter.html) * [ipc::IpcWriterOptions](https://docs.pola.rs/api/rust/dev/polars_io/ipc/struct.IpcWriterOptions.html) * [json::BatchedWriter](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.BatchedWriter.html) * [json::JsonReader](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonReader.html) * [json::JsonWriter](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonWriter.html) * [json::JsonWriterOptions](https://docs.pola.rs/api/rust/dev/polars_io/json/struct.JsonWriterOptions.html) * [ndjson::core::JsonLineReader](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/struct.JsonLineReader.html) * [ndjson::core::StructArray](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/struct.StructArray.html) * [parquet::metadata::FileMetadata](https://docs.pola.rs/api/rust/dev/polars_io/parquet/metadata/struct.FileMetadata.html) * [parquet::read::FileMetadata](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/struct.FileMetadata.html) * [parquet::read::ParquetObjectStore](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/struct.ParquetObjectStore.html) * [parquet::read::ParquetOptions](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/struct.ParquetOptions.html) * [parquet::read::ParquetReader](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/struct.ParquetReader.html) * [parquet::write::BatchedWriter](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/struct.BatchedWriter.html) * [parquet::write::MetadataKeyValue](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/struct.MetadataKeyValue.html) * [parquet::write::ParquetFieldOverwrites](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/struct.ParquetFieldOverwrites.html) * [parquet::write::ParquetMetadataContext](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/struct.ParquetMetadataContext.html) * [parquet::write::ParquetWriteOptions](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/struct.ParquetWriteOptions.html) * [parquet::write::ParquetWriter](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/struct.ParquetWriter.html) * [parquet::write::StatisticsOptions](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/struct.StatisticsOptions.html) * [pl\_async::RuntimeManager](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/struct.RuntimeManager.html) * [predicates::ColumnPredicateExpr](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.ColumnPredicateExpr.html) * [predicates::ColumnPredicates](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.ColumnPredicates.html) * [predicates::ColumnStatistics](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.ColumnStatistics.html) * [predicates::ColumnStats](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.ColumnStats.html) * [predicates::PhysicalExprWithConstCols](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.PhysicalExprWithConstCols.html) * [predicates::ScanIOPredicate](https://docs.pola.rs/api/rust/dev/polars_io/predicates/struct.ScanIOPredicate.html) * [prelude::HiveOptions](https://docs.pola.rs/api/rust/dev/polars_io/prelude/struct.HiveOptions.html) * [prelude::RowIndex](https://docs.pola.rs/api/rust/dev/polars_io/prelude/struct.RowIndex.html) * [utils::byte\_source::MemSliceByteSource](https://docs.pola.rs/api/rust/dev/polars_io/utils/byte_source/struct.MemSliceByteSource.html) * [utils::byte\_source::ObjectStoreByteSource](https://docs.pola.rs/api/rust/dev/polars_io/utils/byte_source/struct.ObjectStoreByteSource.html) * [utils::file::AsyncDynWriteable](https://docs.pola.rs/api/rust/dev/polars_io/utils/file/struct.AsyncDynWriteable.html) ### Enums * [avro::AvroCompression](https://docs.pola.rs/api/rust/dev/polars_io/avro/enum.AvroCompression.html) * [avro::Compression](https://docs.pola.rs/api/rust/dev/polars_io/avro/enum.Compression.html) * [catalog::unity::models::ColumnTypeJsonType](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/enum.ColumnTypeJsonType.html) * [catalog::unity::models::DataSourceFormat](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/enum.DataSourceFormat.html) * [catalog::unity::models::TableCredentialsVariants](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/enum.TableCredentialsVariants.html) * [catalog::unity::models::TableType](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/models/enum.TableType.html) * [cloud::credential\_provider::AzureCredential](https://docs.pola.rs/api/rust/dev/polars_io/cloud/credential_provider/enum.AzureCredential.html) * [cloud::credential\_provider::ObjectStoreCredential](https://docs.pola.rs/api/rust/dev/polars_io/cloud/credential_provider/enum.ObjectStoreCredential.html) * [cloud::credential\_provider::PlCredentialProvider](https://docs.pola.rs/api/rust/dev/polars_io/cloud/credential_provider/enum.PlCredentialProvider.html) * [cloud::options::AmazonS3ConfigKey](https://docs.pola.rs/api/rust/dev/polars_io/cloud/options/enum.AmazonS3ConfigKey.html) * [cloud::options::AzureConfigKey](https://docs.pola.rs/api/rust/dev/polars_io/cloud/options/enum.AzureConfigKey.html) * [cloud::options::CloudType](https://docs.pola.rs/api/rust/dev/polars_io/cloud/options/enum.CloudType.html) * [cloud::options::GoogleConfigKey](https://docs.pola.rs/api/rust/dev/polars_io/cloud/options/enum.GoogleConfigKey.html) * [csv::read::CommentPrefix](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/enum.CommentPrefix.html) * [csv::read::CsvEncoding](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/enum.CsvEncoding.html) * [csv::read::NullValues](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/enum.NullValues.html) * [csv::read::\_csv\_read\_internal::CommentPrefix](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/_csv_read_internal/enum.CommentPrefix.html) * [csv::read::\_csv\_read\_internal::NullValuesCompiled](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/_csv_read_internal/enum.NullValuesCompiled.html) * [csv::read::buffer::Buffer](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/buffer/enum.Buffer.html) * [csv::write::CsvCompression](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/enum.CsvCompression.html) * [csv::write::QuoteStyle](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/enum.QuoteStyle.html) * [ipc::IpcCompression](https://docs.pola.rs/api/rust/dev/polars_io/ipc/enum.IpcCompression.html) * [json::JsonFormat](https://docs.pola.rs/api/rust/dev/polars_io/json/enum.JsonFormat.html) * [mmap::ReaderBytes](https://docs.pola.rs/api/rust/dev/polars_io/mmap/enum.ReaderBytes.html) * [parquet::metadata::ParquetStatistics](https://docs.pola.rs/api/rust/dev/polars_io/parquet/metadata/enum.ParquetStatistics.html) * [parquet::read::ParallelStrategy](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/enum.ParallelStrategy.html) * [parquet::read::\_internal::PrefilterMaskSetting](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/_internal/enum.PrefilterMaskSetting.html) * [parquet::write::ChildFieldOverwrites](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/enum.ChildFieldOverwrites.html) * [parquet::write::KeyValueMetadata](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/enum.KeyValueMetadata.html) * [parquet::write::ParquetCompression](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/enum.ParquetCompression.html) * [predicates::SpecializedColumnPredicate](https://docs.pola.rs/api/rust/dev/polars_io/predicates/enum.SpecializedColumnPredicate.html) * [utils::byte\_source::DynByteSource](https://docs.pola.rs/api/rust/dev/polars_io/utils/byte_source/enum.DynByteSource.html) * [utils::byte\_source::DynByteSourceBuilder](https://docs.pola.rs/api/rust/dev/polars_io/utils/byte_source/enum.DynByteSourceBuilder.html) * [utils::compression::CompressedReader](https://docs.pola.rs/api/rust/dev/polars_io/utils/compression/enum.CompressedReader.html) * [utils::compression::CompressedWriter](https://docs.pola.rs/api/rust/dev/polars_io/utils/compression/enum.CompressedWriter.html) * [utils::compression::SupportedCompression](https://docs.pola.rs/api/rust/dev/polars_io/utils/compression/enum.SupportedCompression.html) * [utils::file::AsyncWriteable](https://docs.pola.rs/api/rust/dev/polars_io/utils/file/enum.AsyncWriteable.html) * [utils::file::BufferedWriteable](https://docs.pola.rs/api/rust/dev/polars_io/utils/file/enum.BufferedWriteable.html) * [utils::file::Writeable](https://docs.pola.rs/api/rust/dev/polars_io/utils/file/enum.Writeable.html) * [utils::slice::SplitSlicePosition](https://docs.pola.rs/api/rust/dev/polars_io/utils/slice/enum.SplitSlicePosition.html) * [utils::sync\_on\_close::SyncOnCloseType](https://docs.pola.rs/api/rust/dev/polars_io/utils/sync_on_close/enum.SyncOnCloseType.html) ### Traits * [ArrowReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.ArrowReader.html) * [SerReader](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerReader.html) * [SerWriter](https://docs.pola.rs/api/rust/dev/polars_io/trait.SerWriter.html) * [cloud::credential\_provider::IntoCredentialProvider](https://docs.pola.rs/api/rust/dev/polars_io/cloud/credential_provider/trait.IntoCredentialProvider.html) * [mmap::MmapBytesReader](https://docs.pola.rs/api/rust/dev/polars_io/mmap/trait.MmapBytesReader.html) * [pl\_async::GetSize](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/trait.GetSize.html) * [predicates::PhysicalIoExpr](https://docs.pola.rs/api/rust/dev/polars_io/predicates/trait.PhysicalIoExpr.html) * [predicates::SkipBatchPredicate](https://docs.pola.rs/api/rust/dev/polars_io/predicates/trait.SkipBatchPredicate.html) * [prelude::SerReader](https://docs.pola.rs/api/rust/dev/polars_io/prelude/trait.SerReader.html) * [prelude::SerWriter](https://docs.pola.rs/api/rust/dev/polars_io/prelude/trait.SerWriter.html) * [utils::byte\_source::ByteSource](https://docs.pola.rs/api/rust/dev/polars_io/utils/byte_source/trait.ByteSource.html) * [utils::file::WriteableTrait](https://docs.pola.rs/api/rust/dev/polars_io/utils/file/trait.WriteableTrait.html) ### Macros * [impl\_page\_walk](https://docs.pola.rs/api/rust/dev/polars_io/macro.impl_page_walk.html) ### Functions * [catalog::unity::schema::column\_info\_to\_field](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/schema/fn.column_info_to_field.html) * [catalog::unity::schema::parse\_type\_json](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/schema/fn.parse_type_json.html) * [catalog::unity::schema::parse\_type\_json\_str](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/schema/fn.parse_type_json_str.html) * [catalog::unity::schema::schema\_to\_column\_info\_list](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/schema/fn.schema_to_column_info_list.html) * [catalog::unity::schema::table\_info\_to\_schemas](https://docs.pola.rs/api/rust/dev/polars_io/catalog/unity/schema/fn.table_info_to_schemas.html) * [cloud::build\_object\_store](https://docs.pola.rs/api/rust/dev/polars_io/cloud/fn.build_object_store.html) * [cloud::glob](https://docs.pola.rs/api/rust/dev/polars_io/cloud/fn.glob.html) * [cloud::object\_path\_from\_str](https://docs.pola.rs/api/rust/dev/polars_io/cloud/fn.object_path_from_str.html) * [csv::read::\_csv\_read\_internal::cast\_columns](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/_csv_read_internal/fn.cast_columns.html) * [csv::read::\_csv\_read\_internal::is\_comment\_line](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/_csv_read_internal/fn.is_comment_line.html) * [csv::read::\_csv\_read\_internal::prepare\_csv\_schema](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/_csv_read_internal/fn.prepare_csv_schema.html) * [csv::read::\_csv\_read\_internal::read\_chunk](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/_csv_read_internal/fn.read_chunk.html) * [csv::read::buffer::init\_buffers](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/buffer/fn.init_buffers.html) * [csv::read::buffer::validate\_utf8](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/buffer/fn.validate_utf8.html) * [csv::read::count\_rows](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/fn.count_rows.html) * [csv::read::count\_rows\_from\_slice\_par](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/fn.count_rows_from_slice_par.html) * [csv::read::schema\_inference::finish\_infer\_field\_schema](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/schema_inference/fn.finish_infer_field_schema.html) * [csv::read::schema\_inference::infer\_field\_schema](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/schema_inference/fn.infer_field_schema.html) * [csv::read::streaming::read\_until\_start\_and\_infer\_schema](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/streaming/fn.read_until_start_and_infer_schema.html) * [csv::write::csv\_header](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/fn.csv_header.html) * [file\_cache::get\_env\_file\_cache\_ttl](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/fn.get_env_file_cache_ttl.html) * [file\_cache::init\_entries\_from\_uri\_list](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/fn.init_entries_from_uri_list.html) * [get\_upload\_chunk\_size](https://docs.pola.rs/api/rust/dev/polars_io/fn.get_upload_chunk_size.html) * [hive::merge\_sorted\_to\_schema\_order](https://docs.pola.rs/api/rust/dev/polars_io/hive/fn.merge_sorted_to_schema_order.html) * [hive::merge\_sorted\_to\_schema\_order\_impl](https://docs.pola.rs/api/rust/dev/polars_io/hive/fn.merge_sorted_to_schema_order_impl.html) * [json::remove\_bom](https://docs.pola.rs/api/rust/dev/polars_io/json/fn.remove_bom.html) * [ndjson::core::estimate\_n\_lines\_in\_chunk](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/fn.estimate_n_lines_in_chunk.html) * [ndjson::core::estimate\_n\_lines\_in\_file](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/fn.estimate_n_lines_in_file.html) * [ndjson::core::is\_json\_line](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/fn.is_json_line.html) * [ndjson::core::json\_lines](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/fn.json_lines.html) * [ndjson::core::parse\_ndjson](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/core/fn.parse_ndjson.html) * [ndjson::count\_rows](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/fn.count_rows.html) * [ndjson::count\_rows\_par](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/fn.count_rows_par.html) * [ndjson::infer\_schema](https://docs.pola.rs/api/rust/dev/polars_io/ndjson/fn.infer_schema.html) * [parquet::metadata::deserialize](https://docs.pola.rs/api/rust/dev/polars_io/parquet/metadata/fn.deserialize.html) * [parquet::read::\_internal::calc\_prefilter\_cost](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/_internal/fn.calc_prefilter_cost.html) * [parquet::read::\_internal::ensure\_matching\_dtypes\_if\_found](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/_internal/fn.ensure_matching_dtypes_if_found.html) * [parquet::read::\_internal::to\_deserializer](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/_internal/fn.to_deserializer.html) * [parquet::read::create\_sorting\_map](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/fn.create_sorting_map.html) * [parquet::read::infer\_schema](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/fn.infer_schema.html) * [parquet::read::materialize\_empty\_df](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/fn.materialize_empty_df.html) * [parquet::read::try\_set\_sorted\_flag](https://docs.pola.rs/api/rust/dev/polars_io/parquet/read/fn.try_set_sorted_flag.html) * [parquet::write::get\_column\_write\_options](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/fn.get_column_write_options.html) * [path\_utils::expand\_paths](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/fn.expand_paths.html) * [path\_utils::expand\_paths\_hive](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/fn.expand_paths_hive.html) * [path\_utils::expanded\_from\_single\_directory](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/fn.expanded_from_single_directory.html) * [path\_utils::resolve\_homedir](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/fn.resolve_homedir.html) * [pl\_async::get\_runtime](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/fn.get_runtime.html) * [pl\_async::tune\_with\_concurrency\_budget](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/fn.tune_with_concurrency_budget.html) * [pl\_async::with\_concurrency\_budget](https://docs.pola.rs/api/rust/dev/polars_io/pl_async/fn.with_concurrency_budget.html) * [predicates::apply\_predicate](https://docs.pola.rs/api/rust/dev/polars_io/predicates/fn.apply_predicate.html) * [scan\_lines::count\_lines](https://docs.pola.rs/api/rust/dev/polars_io/scan_lines/fn.count_lines.html) * [scan\_lines::split\_lines\_to\_rows](https://docs.pola.rs/api/rust/dev/polars_io/scan_lines/fn.split_lines_to_rows.html) * [schema\_to\_arrow\_checked](https://docs.pola.rs/api/rust/dev/polars_io/fn.schema_to_arrow_checked.html) * [utils::apply\_projection](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.apply_projection.html) * [utils::columns\_to\_projection](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.columns_to_projection.html) * [utils::compression::maybe\_decompress\_bytes](https://docs.pola.rs/api/rust/dev/polars_io/utils/compression/fn.maybe_decompress_bytes.html) * [utils::decode\_json\_response](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.decode_json_response.html) * [utils::get\_reader\_bytes](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.get_reader_bytes.html) * [utils::materialize\_projection](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.materialize_projection.html) * [utils::mkdir::mkdir\_recursive](https://docs.pola.rs/api/rust/dev/polars_io/utils/mkdir/fn.mkdir_recursive.html) * [utils::mkdir::tokio\_mkdir\_recursive](https://docs.pola.rs/api/rust/dev/polars_io/utils/mkdir/fn.tokio_mkdir_recursive.html) * [utils::overwrite\_schema](https://docs.pola.rs/api/rust/dev/polars_io/utils/fn.overwrite_schema.html) * [utils::slice::split\_slice\_at\_file](https://docs.pola.rs/api/rust/dev/polars_io/utils/slice/fn.split_slice_at_file.html) ### Type Aliases * [cloud::ObjectStorePath](https://docs.pola.rs/api/rust/dev/polars_io/cloud/type.ObjectStorePath.html) * [csv::read::streaming::InspectContentFn](https://docs.pola.rs/api/rust/dev/polars_io/csv/read/streaming/type.InspectContentFn.html) * [parquet::metadata::FileMetadataRef](https://docs.pola.rs/api/rust/dev/polars_io/parquet/metadata/type.FileMetadataRef.html) * [parquet::write::RowGroupIterColumns](https://docs.pola.rs/api/rust/dev/polars_io/parquet/write/type.RowGroupIterColumns.html) ### Statics * [cloud::options::USER\_AGENT](https://docs.pola.rs/api/rust/dev/polars_io/cloud/options/static.USER_AGENT.html) * [file\_cache::FILE\_CACHE](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/static.FILE_CACHE.html) * [file\_cache::FILE\_CACHE\_PREFIX](https://docs.pola.rs/api/rust/dev/polars_io/file_cache/static.FILE_CACHE_PREFIX.html) * [path\_utils::POLARS\_TEMP\_DIR\_BASE\_PATH](https://docs.pola.rs/api/rust/dev/polars_io/path_utils/static.POLARS_TEMP_DIR_BASE_PATH.html) * [utils::BOOLEAN\_RE](https://docs.pola.rs/api/rust/dev/polars_io/utils/static.BOOLEAN_RE.html) * [utils::FLOAT\_RE](https://docs.pola.rs/api/rust/dev/polars_io/utils/static.FLOAT_RE.html) * [utils::FLOAT\_RE\_DECIMAL](https://docs.pola.rs/api/rust/dev/polars_io/utils/static.FLOAT_RE_DECIMAL.html) * [utils::INTEGER\_RE](https://docs.pola.rs/api/rust/dev/polars_io/utils/static.INTEGER_RE.html) ### Constants * [csv::write::UTF8\_BOM](https://docs.pola.rs/api/rust/dev/polars_io/csv/write/constant.UTF8_BOM.html) * [utils::HIVE\_VALUE\_ENCODE\_CHARSET](https://docs.pola.rs/api/rust/dev/polars_io/utils/constant.HIVE_VALUE_ENCODE_CHARSET.html) * [utils::URL\_ENCODE\_CHARSET](https://docs.pola.rs/api/rust/dev/polars_io/utils/constant.URL_ENCODE_CHARSET.html) ---