mcpField
P
parquet-analysis

parquet-analysis

github.com/brojonatデータ・データベース146 回インストール2 週間前に更新
リポジトリ

parquet-analysis について

Python と Ibis で Parquet ファイルを分析するスキルです。表形式データを扱う開発者向けで、遅延評価の操作をクエリに変換し、Parquet では既定で DuckDB を使います。

主な機能

  1. 01Parquet ファイルの読み込み
  2. 02行のフィルタリングと列選択
  3. 03データの変換と集計
  4. 04複数ファイルの結合
  5. 05Parquet または CSV への出力
  6. 06データ品質チェック

活用シーン

  1. 01大規模な Parquet データの絞り込み
  2. 02カテゴリ別・時間別の指標集計
  3. 03NULL とデータ品質の確認
  4. 04顧客データと注文データの結合

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/brojonat/llmsrules --skill parquet-analysis

インストール後、Claude Code で/parquet-analysisを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

EXAMPLES.md
REFERENCE.md
scripts/
analyze.py
template.py

詳細

PythonとIbisによるParquet分析

Ibis を使用してParquetファイルを分析します。Ibisはデータベースに依存しないPython DataFrame APIです。Pythonの操作を、基盤となるバックエンド(ParquetファイルではデフォルトでDuckDB)向けに最適化されたクエリへ変換します。

クイックスタート

基本的なワークフロー
import ibis

# Connect to DuckDB (optimized for parquet)
con = ibis.duckdb.connect()

# Read parquet file
table = con.read_parquet("data.parquet")

# Explore
print(table.schema())      # View schema
print(table.head(10))      # Preview data
print(table.describe())    # Summary statistics

# Filter and aggregate
summary = (
    table
    .filter(table.amount > 100)
    .group_by("category")
    .aggregate(
        total=table.amount.sum(),
        avg=table.amount.mean(),
        count=table.count()
    )
)
print(summary.execute())

# Export
con.to_parquet(summary, "output.parquet")

主な操作

選択とフィルタリング
# Select columns
selected = table.select("id", "amount", "date")

# Filter rows
filtered = table.filter(
    (table.amount > 100) &
    (table.date >= "2024-01-01")
)

# Sort
sorted_data = table.order_by(table.amount.desc())
変換
# Add computed columns
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()
)
集計
# Group by and summarize
by_category = (
    table.group_by("category")
    .aggregate(
        total=table.amount.sum(),
        avg=table.amount.mean(),
        count=table.count()
    )
)
結合
# Read and join multiple files
customers = con.read_parquet("customers.parquet")
orders = con.read_parquet("orders.parquet")

joined = (
    orders
    .join(customers, orders.customer_id == customers.id, how="left")
    .select(
        orders.order_id,
        orders.amount,
        customers.name
    )
)
エクスポート
# To parquet
con.to_parquet(result, "output.parquet")

# To CSV (via pandas)
df = result.execute()
df.to_csv("output.csv", index=False)

一般的なパターン

データ品質チェック
# Row count
row_count = table.count().execute()

# Check for nulls
null_counts = table.select([
    col.isnull().sum().name(f"{col}_nulls")
    for col in table.columns
]).execute()

# Value distribution
table.group_by("category").aggregate(count=table.count()).execute()
時系列分析
# Monthly aggregation
monthly = (
    table.mutate(month=table.date.truncate("M"))
    .group_by("month")
    .aggregate(total=table.amount.sum())
    .order_by("month")
)

# Extract date components
dated = table.mutate(
    year=table.date.year(),
    month=table.date.month(),
    quarter=table.date.quarter()
)
ウィンドウ関数
# Rank within groups
ranked = table.mutate(
    rank=table.amount.rank().over(
        ibis.window(group_by="category", order_by=table.amount.desc())
    )
)

# Running total
with_cumsum = table.mutate(
    cumulative=table.amount.sum().over(
        ibis.window(order_by="date", rows=(None, 0))
    )
)

ベストプラクティス

  1. 早めにフィルタリングする:データ量を減らすため、集計の前にフィルタを適用します
  2. 遅延評価を使用する:Ibisの操作は.execute()が呼び出されるまで実行されません。実行する前に操作を連結します
  3. null値を処理する:null値を明示的に確認して処理します
  4. 列操作ではセレクターを活用する(REFERENCE.mdを参照)

詳細リソース

スクリプト

完全な分析ワークフロー

完全なサンプルスクリプトを実行します:

python scripts/analyze.py

以下の内容を示します:

  • データの探索と品質チェック
  • 変換と拡充
  • 集計とフィルタリング
  • 結合(複数のファイルが利用可能な場合)
  • 複数のエクスポート形式
  • オプションの可視化
クイックスタートテンプレート

テンプレートをコピーしてカスタマイズします:

cp scripts/template.py my_analysis.py
# Edit with your file paths and logic
python my_analysis.py

インストール

必要なパッケージをインストールします:

uv add "ibis-framework[duckdb]"

# Optional for visualization
uv add matplotlib

トラブルシューティング

インポートエラー:ibis-framework[duckdb]がインストールされていることを確認してください

大きなファイル:DuckDBは大きなParquetファイルを効率よく処理します。非常に大きなデータセットの場合:

  • 早めに、積極的にフィルタリングする
  • 列を選択して読み込む:con.read_parquet("file.parquet", columns=["id", "amount"])
  • チャンク単位で処理するか、より選択的なクエリを使用する

結合時のスキーマ不一致:.cast()を使用して列の型が一致していることを確認します:

table = table.mutate(id=table.id.cast("int64"))

パフォーマンス:複雑なクエリでは、生成されたSQLをibis.to_sql(table)で確認し、何が実行されているかを把握します

コメント