Ibis
什么是Ibis?
Ibis是一个可移植的Python数据框架库:
- 快速的本地数据框架(默认使用DuckDB)
- 惰性数据框架表达式
- 交互模式用于迭代数据探索
- 组合Python数据框架和SQL代码
- 为20多个后端使用相同的数据框架API
- 通过更改单行代码在本地迭代和远程部署
查看"为什么选择Ibis?"文档以了解更多。
开始使用
你可以使用pip install
安装Ibis及其后端和示例数据:
pip install 'ibis-framework[duckdb,examples]'
💡 提示
查看安装指南了解更多安装选项。
然后使用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 │
└───────────┴───────────┴───────┘
💡 提示
查看入门教程以全面了解Ibis。
Python + SQL:更好地结合
对于大多数后端,Ibis通过将其数据框架表达式编译为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
你可以混合使用SQL和Python代码:
>>> 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 │
└───────────┴───────────┴───────┘
这使您可以将Python的灵活性与现代SQL的规模和性能结合起来。
后端
Ibis支持20多个后端:
- Apache DataFusion
- Apache Druid
- Apache Flink
- Apache Impala
- Apache PySpark
- BigQuery
- ClickHouse
- Dask
- DuckDB
- Exasol
- MySQL
- Oracle
- pandas
- Polars
- PostgreSQL
- RisingWave
- SQL Server
- SQLite
- Snowflake
- Trino
工作原理
大多数Python数据框架都与其执行引擎紧密耦合。而许多数据库只支持SQL,没有Python API。Ibis通过提供一个用于Python数据操作的通用API,并将该API编译成后端的原生语言来解决这个问题。这意味着您可以学习一个API,并在任何支持的后端(执行引擎)上使用它。
Ibis广泛支持两种类型的后端:
- SQL生成后端
- DataFrame生成后端
可移植性
要使用不同的后端,您可以设置Ibis使用的后端:
>>> ibis.set_backend("duckdb")
>>> ibis.set_backend("polars")
>>> ibis.set_backend("datafusion")
通常,您会创建一个连接对象:
>>> con = ibis.duckdb.connect()
>>> con = ibis.polars.connect()
>>> con = ibis.datafusion.connect()
并使用该后端中的表:
>>> con.list_tables()
['penguins']
>>> t = con.table("penguins")
您还可以从常见的文件格式如CSV或Apache Parquet中读取:
>>> t = con.read_csv("penguins.csv")
>>> t = con.read_parquet("penguins.parquet")
这允许您通过更改单行代码来在本地迭代和远程部署。
💡 提示
查看关于后端无关数组的博客,了解在DuckDB和BigQuery上使用相同代码的一个示例。
社区和贡献
Ibis是一个开源项目,欢迎社区中的任何人贡献。
通过在GitHub上互动或在Zulip上与我们聊天来加入我们的社区。
欲了解更多信息,请访问https://ibis-project.org/。