ibis-data について
Ibis Data Interfaceは、データベースに依存しないIbisのPython DataFrame APIを紹介します。データ分析やデータベース開発を行うPythonユーザー向けで、遅延式を接続先バックエンドのSQLに変換します。
主な機能
- 01共通のPython DataFrame APIを利用
- 02式をバックエンドSQLに変換
- 03遅延評価で実行を保留
- 04フィルター・結合・集計を提供
- 05複数種類の式に対応
活用シーン
- 01DuckDBでローカルデータを探索
- 02分析クエリをPostgreSQLにデプロイ
- 03Pythonで結合や集計を構築
インストール
コマンドをコピーしてターミナルで実行します。
$
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()を呼び出す前に操作を連結します - セレクターを使う:プログラムから複数の列に操作を適用します
- null を処理する:
.isnull()で確認し、.fillna()で明示的に処理します - SQL を確認する:
ibis.to_sql(expr)を使って生成されたクエリを調べます
インストール
uv add "ibis-framework[duckdb]" # DuckDB backend
uv add "ibis-framework[postgres]" # PostgreSQL backend
コメント
Markdown 対応