parquet-analysis について
Python と Ibis で Parquet ファイルを分析するスキルです。表形式データを扱う開発者向けで、遅延評価の操作をクエリに変換し、Parquet では既定で DuckDB を使います。
主な機能
- 01Parquet ファイルの読み込み
- 02行のフィルタリングと列選択
- 03データの変換と集計
- 04複数ファイルの結合
- 05Parquet または CSV への出力
- 06データ品質チェック
活用シーン
- 01大規模な Parquet データの絞り込み
- 02カテゴリ別・時間別の指標集計
- 03NULL とデータ品質の確認
- 04顧客データと注文データの結合
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ brojonat/ llmsrules --skill parquet-analysisインストール後、Claude Code で/parquet-analysisを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
EXAMPLES.mdREFERENCE.mdscripts/analyze.pytemplate.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))
)
)
ベストプラクティス
- 早めにフィルタリングする:データ量を減らすため、集計の前にフィルタを適用します
- 遅延評価を使用する:Ibisの操作は
.execute()が呼び出されるまで実行されません。実行する前に操作を連結します - null値を処理する:null値を明示的に確認して処理します
- 列操作ではセレクターを活用する(REFERENCE.mdを参照)
詳細リソース
- EXAMPLES.md - 一般的なタスクすべてを網羅した完全な例
- REFERENCE.md - Ibis操作の詳細なAPIリファレンス
- scripts/analyze.py - 動作する完全なサンプルスクリプト
- scripts/template.py - 分析用のクイックスタートテンプレート
- ../ibis-data/SKILL.md - Ibisに関する追加の情報とパターン
スクリプト
完全な分析ワークフロー
完全なサンプルスクリプトを実行します:
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)で確認し、何が実行されているかを把握します
コメント
Markdown 対応