ibis-framework 11.0.0


pip install ibis-framework

  Latest version

Released: Oct 15, 2025


Meta
Author: Ibis Maintainers
Maintainer: Ibis Maintainers
Requires Python: >=3.9

Classifiers

Development Status
  • 5 - Production/Stable

Intended Audience
  • Developers
  • Science/Research

License
  • OSI Approved :: Apache Software License

Operating System
  • OS Independent

Programming Language
  • Python
  • Python :: 3
  • Python :: 3 :: Only
  • SQL

Topic
  • Database :: Front-Ends
  • Scientific/Engineering
  • Software Development :: Code Generators
  • Software Development :: User Interfaces

Ibis

Documentation status Project chat Anaconda badge PyPI Build status Build status Codecov branch

What is Ibis?

Ibis is the portable Python dataframe library:

See the documentation on "Why Ibis?" to learn more.

Getting started

You can pip install Ibis with a backend and example data:

pip install 'ibis-framework[duckdb,examples]'

πŸ’‘ Tip

See the installation guide for more installation options.

Then use Ibis:

>>> import ibis
>>> ibis.options.interactive = True
>>> t = ibis.examples.penguins.fetch()
>>> t
┏━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓
┃ species ┃ island    ┃ bill_length_mm ┃ bill_depth_mm ┃ flipper_length_mm ┃ body_mass_g ┃ sex    ┃ year  ┃
┑━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩
β”‚ string  β”‚ string    β”‚ float64        β”‚ float64       β”‚ int64             β”‚ int64       β”‚ string β”‚ int64 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Adelie  β”‚ Torgersen β”‚           39.1 β”‚          18.7 β”‚               181 β”‚        3750 β”‚ male   β”‚  2007 β”‚
β”‚ Adelie  β”‚ Torgersen β”‚           39.5 β”‚          17.4 β”‚               186 β”‚        3800 β”‚ female β”‚  2007 β”‚
β”‚ Adelie  β”‚ Torgersen β”‚           40.3 β”‚          18.0 β”‚               195 β”‚        3250 β”‚ female β”‚  2007 β”‚
β”‚ Adelie  β”‚ Torgersen β”‚           NULL β”‚          NULL β”‚              NULL β”‚        NULL β”‚ NULL   β”‚  2007 β”‚
β”‚ Adelie  β”‚ Torgersen β”‚           36.7 β”‚          19.3 β”‚               193 β”‚        3450 β”‚ female β”‚  2007 β”‚
β”‚ Adelie  β”‚ Torgersen β”‚           39.3 β”‚          20.6 β”‚               190 β”‚        3650 β”‚ male   β”‚  2007 β”‚
β”‚ Adelie  β”‚ Torgersen β”‚           38.9 β”‚          17.8 β”‚               181 β”‚        3625 β”‚ female β”‚  2007 β”‚
β”‚ Adelie  β”‚ Torgersen β”‚           39.2 β”‚          19.6 β”‚               195 β”‚        4675 β”‚ male   β”‚  2007 β”‚
β”‚ Adelie  β”‚ Torgersen β”‚           34.1 β”‚          18.1 β”‚               193 β”‚        3475 β”‚ NULL   β”‚  2007 β”‚
β”‚ Adelie  β”‚ Torgersen β”‚           42.0 β”‚          20.2 β”‚               190 β”‚        4250 β”‚ NULL   β”‚  2007 β”‚
β”‚ …       β”‚ …         β”‚              … β”‚             … β”‚                 … β”‚           … β”‚ …      β”‚     … β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜
>>> g = t.group_by("species", "island").agg(count=t.count()).order_by("count")
>>> g
┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓
┃ species   ┃ island    ┃ count ┃
┑━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━┩
β”‚ string    β”‚ string    β”‚ int64 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Adelie    β”‚ Biscoe    β”‚    44 β”‚
β”‚ Adelie    β”‚ Torgersen β”‚    52 β”‚
β”‚ Adelie    β”‚ Dream     β”‚    56 β”‚
β”‚ Chinstrap β”‚ Dream     β”‚    68 β”‚
β”‚ Gentoo    β”‚ Biscoe    β”‚   124 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ’‘ Tip

See the getting started tutorial for a full introduction to Ibis.

Python + SQL: better together

For most backends, Ibis works by compiling its dataframe expressions into SQL:

>>> ibis.to_sql(g)
SELECT
  "t1"."species",
  "t1"."island",
  "t1"."count"
FROM (
  SELECT
    "t0"."species",
    "t0"."island",
    COUNT(*) AS "count"
  FROM "penguins" AS "t0"
  GROUP BY
    1,
    2
) AS "t1"
ORDER BY
  "t1"."count" ASC

You can mix SQL and Python code:

>>> a = t.sql("SELECT species, island, count(*) AS count FROM penguins GROUP BY 1, 2")
>>> a
┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓
┃ species   ┃ island    ┃ count ┃
┑━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━┩
β”‚ string    β”‚ string    β”‚ int64 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Adelie    β”‚ Torgersen β”‚    52 β”‚
β”‚ Adelie    β”‚ Biscoe    β”‚    44 β”‚
β”‚ Adelie    β”‚ Dream     β”‚    56 β”‚
β”‚ Gentoo    β”‚ Biscoe    β”‚   124 β”‚
β”‚ Chinstrap β”‚ Dream     β”‚    68 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜
>>> b = a.order_by("count")
>>> b
┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓
┃ species   ┃ island    ┃ count ┃
┑━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━┩
β”‚ string    β”‚ string    β”‚ int64 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Adelie    β”‚ Biscoe    β”‚    44 β”‚
β”‚ Adelie    β”‚ Torgersen β”‚    52 β”‚
β”‚ Adelie    β”‚ Dream     β”‚    56 β”‚
β”‚ Chinstrap β”‚ Dream     β”‚    68 β”‚
β”‚ Gentoo    β”‚ Biscoe    β”‚   124 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜

This allows you to combine the flexibility of Python with the scale and performance of modern SQL.

Backends

Ibis supports nearly 20 backends:

How it works

Most Python dataframes are tightly coupled to their execution engine. And many databases only support SQL, with no Python API. Ibis solves this problem by providing a common API for data manipulation in Python, and compiling that API into the backend’s native language. This means you can learn a single API and use it across any supported backend (execution engine).

Ibis broadly supports two types of backend:

  1. SQL-generating backends
  2. DataFrame-generating backends

Ibis backend types

Portability

To use different backends, you can set the backend Ibis uses:

>>> ibis.set_backend("duckdb")
>>> ibis.set_backend("polars")
>>> ibis.set_backend("datafusion")

Typically, you'll create a connection object:

>>> con = ibis.duckdb.connect()
>>> con = ibis.polars.connect()
>>> con = ibis.datafusion.connect()

And work with tables in that backend:

>>> con.list_tables()
['penguins']
>>> t = con.table("penguins")

You can also read from common file formats like CSV or Apache Parquet:

>>> t = con.read_csv("penguins.csv")
>>> t = con.read_parquet("penguins.parquet")

This allows you to iterate locally and deploy remotely by changing a single line of code.

πŸ’‘ Tip

Check out the blog on backend agnostic arrays for one example using the same code across DuckDB and BigQuery.

Community and contributing

Ibis is an open source project and welcomes contributions from anyone in the community.

Join our community by interacting on GitHub or chatting with us on Zulip.

For more information visit https://ibis-project.org/.

Governance

The Ibis project is an independently governed open source community project to build and maintain the portable Python dataframe library. Ibis has contributors across a range of data companies and institutions.

11.0.1.dev8 Oct 19, 2025
11.0.0 Oct 15, 2025
10.8.1.dev105 Oct 12, 2025
10.8.1.dev76 Oct 05, 2025
10.8.1.dev67 Sep 28, 2025
10.8.1.dev66 Sep 21, 2025
10.8.1.dev54 Aug 24, 2025
10.8.1.dev36 Aug 17, 2025
10.8.1.dev30 Aug 10, 2025
10.8.1.dev22 Aug 03, 2025
10.8.0 Jul 28, 2025
10.7.0 Jul 27, 2025
10.6.1.dev67 Jul 20, 2025
10.6.1.dev50 Jul 13, 2025
10.6.1.dev43 Jul 06, 2025
10.6.1.dev20 Jun 29, 2025
10.6.1.dev5 Jun 22, 2025
10.6.0 Jun 16, 2025
10.5.1.dev126 Jun 15, 2025
10.5.1.dev104 Jun 08, 2025
10.5.1.dev84 Jun 01, 2025
10.5.1.dev65 May 25, 2025
10.5.1.dev41 May 18, 2025
10.5.1.dev31 May 11, 2025
10.5.1.dev21 May 04, 2025
10.5.1.dev8 Apr 27, 2025
10.5.0 Apr 18, 2025
10.4.1.dev37 Apr 13, 2025
10.4.1.dev31 Apr 06, 2025
10.4.1.dev30 Apr 04, 2025
10.4.1.dev4 Mar 30, 2025
10.4.0 Mar 27, 2025
10.3.2.dev22 Mar 23, 2025
10.3.2.dev5 Mar 16, 2025
10.3.1 Mar 14, 2025
10.3.0 Mar 11, 2025
10.2.1.dev15 Mar 09, 2025
10.2.0 Mar 03, 2025
10.1.1.dev20 Mar 02, 2025
10.1.0 Feb 22, 2025
10.0.0 Feb 06, 2025
10.0.0.dev490 Jan 26, 2025
10.0.0.dev459 Jan 19, 2025
10.0.0.dev438 Jan 05, 2025
10.0.0.dev415 Dec 29, 2024
10.0.0.dev398 Dec 22, 2024
10.0.0.dev256 Nov 10, 2024
10.0.0.dev231 Nov 03, 2024
10.0.0.dev200 Oct 27, 2024
10.0.0.dev176 Oct 20, 2024
10.0.0.dev148 Oct 13, 2024
10.0.0.dev145 Jul 21, 2024
10.0.0.dev141 Sep 01, 2024
10.0.0.dev125 Oct 06, 2024
10.0.0.dev120 Jun 02, 2024
10.0.0.dev97 Jul 14, 2024
10.0.0.dev93 May 26, 2024
10.0.0.dev91 Aug 25, 2024
10.0.0.dev77 Jul 07, 2024
10.0.0.dev71 May 19, 2024
10.0.0.dev69 Sep 22, 2024
10.0.0.dev55 Aug 23, 2024
10.0.0.dev52 May 12, 2024
10.0.0.dev49 Jun 30, 2024
10.0.0.dev35 Sep 08, 2024
10.0.0.dev30 Sep 15, 2024
10.0.0.dev27 Jun 23, 2024
10.0.0.dev25 Jul 28, 2024
10.0.0.dev18 May 05, 2024
10.0.0.dev6 Jun 16, 2024
9.5.0 Sep 11, 2024
9.4.0 Sep 03, 2024
9.3.0 Aug 07, 2024
9.2.0 Jul 22, 2024
9.1.0 Jun 13, 2024
9.0.0 Apr 30, 2024
9.0.0.dev686 Apr 28, 2024
9.0.0.dev665 Apr 21, 2024
9.0.0.dev619 Apr 14, 2024
9.0.0.dev551 Mar 31, 2024
9.0.0.dev511 Mar 24, 2024
9.0.0.dev457 Mar 17, 2024
9.0.0.dev413 Mar 10, 2024
9.0.0.dev356 Mar 03, 2024
9.0.0.dev311 Feb 25, 2024
9.0.0.dev272 Feb 16, 2024
9.0.0.dev34 Feb 11, 2024
8.0.0 Feb 05, 2024
8.0.0.dev259 Feb 04, 2024
8.0.0.dev210 Jan 28, 2024
8.0.0.dev178 Jan 21, 2024
8.0.0.dev148 Jan 14, 2024
8.0.0.dev118 Jan 07, 2024
8.0.0.dev90 Dec 31, 2023
8.0.0.dev78 Dec 24, 2023
7.2.0 Dec 18, 2023
7.1.0 Nov 16, 2023
7.0.0 Oct 02, 2023
7.0.0.dev627 Oct 01, 2023
7.0.0.dev525 Sep 24, 2023
7.0.0.dev501 Sep 17, 2023
7.0.0.dev439 Sep 10, 2023
7.0.0.dev230 Sep 03, 2023
6.2.0 Aug 31, 2023
6.1.1.dev176 Aug 27, 2023
6.1.1.dev135 Aug 20, 2023
6.1.1.dev96 Aug 13, 2023
6.1.1.dev22 Aug 06, 2023
6.1.0 Aug 03, 2023
6.0.1.dev128 Jul 30, 2023
6.0.1.dev58 Jul 16, 2023
6.0.1.dev33 Jul 09, 2023
6.0.0 Jul 05, 2023
5.1.1.dev596 Jul 02, 2023
5.1.1.dev554 Jun 25, 2023
5.1.1.dev516 Jun 18, 2023
5.1.1.dev467 Jun 13, 2023
5.1.0 Apr 11, 2023
5.0.0 Mar 15, 2023
4.1.0 Jan 25, 2023
4.0.0 Jan 09, 2023
3.2.0 Sep 15, 2022
3.1.0 Jul 26, 2022
3.0.2 Apr 28, 2022
3.0.1 Apr 28, 2022
3.0.0 Apr 25, 2022
2.1.1 Jan 12, 2022
2.1.0 Jan 12, 2022
2.0.0 Oct 06, 2021
1.4.0 Nov 11, 2020
1.3.0 Feb 28, 2020
1.2.0 Jun 24, 2019
1.1.0 Jun 10, 2019
1.0.0 Mar 26, 2019
0.14.0 Aug 23, 2018
0.13.0 Mar 30, 2018
0.12.0 Oct 28, 2017
0.11.2 Jul 03, 2017
0.11.1 Jun 28, 2017
0.10.0 Mar 09, 2017
0.9.0 Nov 28, 2016
0.8.1 May 19, 2016
0.8.0 May 19, 2016
0.7.1 Apr 03, 2016
0.7.0 Mar 16, 2016
0.6.1 Mar 08, 2016
0.6.0 Nov 30, 2015
0.5.2 Sep 16, 2015
0.5.1 Sep 10, 2015
0.4.1 Aug 16, 2015
0.4.0 Aug 14, 2015
0.3.0 Jul 20, 2015

Wheel compatibility matrix

Platform Python 3
any

Files in release

Extras:
Dependencies:
atpublic (>=2.3)
parsy (>=2)
python-dateutil (>=2.8.2)
sqlglot (!=26.32.0,>=23.4)
toolz (>=0.11)
typing-extensions (>=4.3.0)
tzdata (>=2022.7)