当前位置:首页>python>ibis,一个灵活的 Python 库

ibis,一个灵活的 Python 库

  • 2026-10-11 06:48:42
ibis,一个灵活的 Python 库

大家好,我是木木。

今天给大家分享一个灵活的 Python 库,ibis。

ibis

ibis 是一个可移植的 DataFrame 表达式库。它让你用 Python 写类似 DataFrame 的链式表达式,然后把表达式执行在不同后端上,比如 DuckDB、SQLite、PostgreSQL、BigQuery、Snowflake、ClickHouse、Polars 等。它的思路不是把所有数据都拉进本地,而是先构建惰性表达式,再交给后端编译和执行。对经常在本地和数据仓库之间切换的团队来说,这种统一 API 很有价值。

项目地址:https://github.com/ibis-project/ibis

官方文档:https://ibis-project.org/

三大特点

惰性表达式

先描述计算逻辑,真正执行时再交给后端处理,适合复杂查询组合。

后端丰富

同一套 API 可以面向本地 DuckDB,也可以迁移到云端数据仓库。

SQL 友好

表达式可以编译成 SQL,方便调试、审查和与现有 SQL 工作流衔接。

最佳实践

安装方式:pip install "ibis-framework[duckdb]"。

第一段代码解决的问题是:用 Ibis 的 DataFrame 表达式做分组聚合。这里使用内存表执行,能看到 Ibis API 和 pandas 的形态很接近。

importibisfromimportlib.metadataimportversiont=ibis.memtable({"city":["Paris","Berlin","Paris"],"sales":[10,20,30]})expr=t.group_by("city").aggregate(total=t.sales.sum()).order_by("city")print("package:",version("ibis-framework"))print(expr.execute())

第二段代码解决的问题是:把 Python 表达式编译成 SQL。这个能力很适合排查“我写的表达式到底会变成什么查询”。

importibist=ibis.table([("city","string"),("sales","int64")],name="orders")expr=t.filter(t.sales>15).select("city","sales").order_by("city")print("schema:",expr.schema())print(ibis.to_sql(expr))

环境与版本信息

本文示例使用 Python 3.11.0、ibis-framework 12.0.0、duckdb 1.5.2。示例全部在本地执行,不连接远程数据库。

高级功能

进阶一点看后端执行。Ibis 可以连接 DuckDB,把 Python 表达式交给 DuckDB 运行。以后如果切到其他后端,很多上层表达式可以保持相似结构。

importibiscon=ibis.duckdb.connect()t=con.create_table("orders",{"city":["Paris","Berlin","Paris"],"sales":[10,20,30]},temp=True)expr=t.filter(t.sales>=20).mutate(tax=t.sales*0.08).order_by("city")print(expr.execute())

适用场景

适合需要跨后端迁移的数据分析、SQL 生成、Notebook 探索、本地 DuckDB 原型、云数据仓库查询编排,以及希望用 Python 表达复杂查询逻辑的团队。

不适用场景

不适合只做很小规模的 pandas 清洗,也不适合完全依赖某个数据库专有语法且不需要可移植性的项目。复杂表达式仍要理解后端实际执行计划。

上线检查

  1. 明确生产后端,安装对应 extra 依赖。2. 对关键表达式输出 SQL 做审查。3. 注意不同后端的数据类型、空值和时间语义差异。4. 大查询先限制数据量或用临时表验证成本。

总结

ibis 把 Python DataFrame 写法和 SQL 后端连接得很自然。它适合那些既想保留 Python 表达力,又不想被单一执行引擎锁住的数据工作流。

最新文章

随机文章