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. 01DuckDBでローカルデータを探索
  2. 02分析クエリをPostgreSQLにデプロイ
  3. 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

コメント