关于 ibis-data
Ibis Data Interface 介绍如何使用 Ibis 的 Python DataFrame API 编写数据库无关的查询,适合进行数据分析与数据库开发的 Python 用户。它将惰性表达式转换为连接后端的 SQL。
主要功能
- 01使用统一的 Python DataFrame API
- 02将表达式转换为后端 SQL
- 03支持惰性执行
- 04提供筛选、连接和聚合操作
- 05支持多种表达式类型
适用场景
- 01在本地 DuckDB 上探索数据
- 02将分析查询部署到 PostgreSQL
- 03用 Python 构建连接与聚合查询
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ brojonat/ llmsrules --skill ibis-data安装后在 Claude Code 中输入/ibis-data确认已加载。
详细介绍
Ibis 数据接口
Ibis 提供与数据库无关的 Python DataFrame API。只需在 Python 中编写一次查询;Ibis 会将其转换为适用于所连接后端(DuckDB、PostgreSQL、SQLite 等)的优化 SQL。
为什么选择 Ibis
- 可移植性:使用 DuckDB 开发,部署到 PostgreSQL——只需更改连接
- 惰性求值:操作会构建表达式树;只有调用
.execute()后才会执行 - 完整的 SQL 能力:窗口函数、CTE、联接、聚合——均可通过 Python 实现
- 无需 ORM:无需编写 SQL 字符串,即可获得 SQL 性能
连接
import ibis
# DuckDB (default for local/parquet work)
con = ibis.duckdb.connect()
con = ibis.duckdb.connect("my.duckdb")
# PostgreSQL
con = ibis.postgres.connect(host="localhost", database="mydb", user="user", password="pass")
# SQLite
con = ibis.sqlite.connect("my.sqlite")
# Read files directly
table = con.read_parquet("data.parquet")
table = con.read_csv("data.csv")
核心操作
# Explore
table.schema() # column names and types
table.head(10) # preview rows
table.describe() # summary statistics
table.count().execute() # row count
# Select and filter
selected = table.select("id", "amount", "date")
filtered = table.filter((table.amount > 100) & (table.date >= "2024-01-01"))
sorted_data = table.order_by(table.amount.desc())
# Transform
enriched = table.mutate(
revenue=table.quantity * table.unit_price,
year=table.date.year(),
size=ibis.case()
.when(table.amount < 100, "small")
.when(table.amount < 1000, "medium")
.else_("large")
.end()
)
# Aggregate
summary = (
table.group_by("category")
.aggregate(
total=table.amount.sum(),
avg=table.amount.mean(),
count=table.count()
)
)
# Join
joined = (
orders
.join(customers, orders.customer_id == customers.id, how="left")
.select(orders.order_id, orders.amount, customers.name)
)
# Window functions
ranked = table.mutate(
rank=table.amount.rank().over(
ibis.window(group_by="category", order_by=table.amount.desc())
)
)
# Execute and export
df = summary.execute() # -> pandas DataFrame
con.to_parquet(summary, "out.parquet")
df.to_csv("out.csv", index=False)
API 参考
| API | 涵盖内容 |
|---|---|
| 表表达式 | select、filter、mutate、group_by、agg、join、order_by |
| 选择器 | 按名称、类型或正则表达式选择列 |
| 通用表达式 | .cast()、.isnull()、.fillna()、case()、.ifelse() |
| 数值表达式 | sum()、mean()、std()、舍入、对数 |
| 字符串表达式 | 切片、正则表达式、大小写转换、去除首尾字符 |
| 时间表达式 | .year()、.month()、区间算术、格式化 |
| 集合表达式 | 数组/映射操作、展开 |
| JSON 表达式 | 基于路径提取 JSON 列中的内容 |
最佳实践
- 尽早筛选:在聚合前减少数据量
- 保持惰性:先串联操作,再调用
.execute() - 使用选择器:以编程方式对多列应用操作
- 处理空值:使用
.isnull()检查,并通过.fillna()显式处理 - 检查 SQL:使用
ibis.to_sql(expr)检查生成的查询
安装
uv add "ibis-framework[duckdb]" # DuckDB backend
uv add "ibis-framework[postgres]" # PostgreSQL backend
评论
支持 Markdown