mcpField
I
ibis-data

ibis-data

github.com/brojonat数据与数据库146 次安装2 周前更新
代码仓库

关于 ibis-data

Ibis Data Interface 介绍如何使用 Ibis 的 Python DataFrame API 编写数据库无关的查询,适合进行数据分析与数据库开发的 Python 用户。它将惰性表达式转换为连接后端的 SQL。

主要功能

  1. 01使用统一的 Python DataFrame API
  2. 02将表达式转换为后端 SQL
  3. 03支持惰性执行
  4. 04提供筛选、连接和聚合操作
  5. 05支持多种表达式类型

适用场景

  1. 01在本地 DuckDB 上探索数据
  2. 02将分析查询部署到 PostgreSQL
  3. 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