mcpField
P
polars

polars

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

polars について

Polarsは、データ処理や分析パイプライン向けのPython・Rust用DataFrameライブラリです。式ベースのAPIと遅延クエリ最適化により、大規模データを効率よく変換できます。

主な機能

  1. 01式ベースのデータ変換
  2. 02遅延クエリ計画と最適化
  3. 03並列データ処理
  4. 04一般的なデータ形式の読み書き
  5. 05結合、集計、データの再構成
  6. 06pandasからの移行ガイド

活用シーン

  1. 01大規模データのフィルタリングと集計
  2. 02最適化されたデータパイプラインの構築
  3. 03ファイル形式間のデータ変換
  4. 04pandasの処理をPolarsへ移行

インストール

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

$npx skills add https://github.com/crazymsn/academic-skills --skill polars

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

同梱ファイル

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

references/
best_practices.md
core_concepts.md
io_guide.md
operations.md
pandas_migration.md
transformations.md

詳細

Polars

概要

Polars は Apache Arrow 上に構築された、Python と Rust 向けの超高速な DataFrame ライブラリです。Polars の式ベースの API、遅延評価フレームワーク、高性能なデータ操作機能を使って、効率的なデータ処理、pandas からの移行、データパイプラインの最適化を行えます。

クイックスタート

インストールと基本的な使い方

Polars をインストールします:

uv pip install polars

DataFrame の基本的な作成と操作:

import polars as pl

# Create DataFrame
df = pl.DataFrame({
    "name": ["Alice", "Bob", "Charlie"],
    "age": [25, 30, 35],
    "city": ["NY", "LA", "SF"]
})

# Select columns
df.select("name", "age")

# Filter rows
df.filter(pl.col("age") > 25)

# Add computed columns
df.with_columns(
    age_plus_10=pl.col("age") + 10
)

中核となる概念

式

式は Polars 操作の基本的な構成要素です。データに対する変換を表現し、組み合わせ、再利用、最適化することができます。

主な原則:

  • 列を参照するには pl.col("column_name") を使用します
  • メソッドをチェーンして複雑な変換を構築します
  • 式は遅延評価され、コンテキスト(select、with_columns、filter、group_by)内でのみ実行されます

例:

# Expression-based computation
df.select(
    pl.col("name"),
    (pl.col("age") * 12).alias("age_in_months")
)
遅延評価と即時評価

即時評価(DataFrame): 操作は即座に実行されます

df = pl.read_csv("file.csv")  # Reads immediately
result = df.filter(pl.col("age") > 25)  # Executes immediately

遅延評価(LazyFrame): 操作はクエリプランを構築し、実行前に最適化されます

lf = pl.scan_csv("file.csv")  # Doesn't read yet
result = lf.filter(pl.col("age") > 25).select("name", "age")
df = result.collect()  # Now executes optimized query

遅延評価を使うべき場合:

  • 大規模なデータセットを扱う場合
  • 複雑なクエリパイプラインの場合
  • 一部の列や行だけが必要な場合
  • パフォーマンスが重要な場合

遅延評価の利点:

  • 自動的なクエリ最適化
  • 述語プッシュダウン
  • 射影プッシュダウン
  • 並列実行

詳細な概念については、references/core_concepts.md を読み込んでください。

よく使う操作

Select

列を選択して操作します:

# Select specific columns
df.select("name", "age")

# Select with expressions
df.select(
    pl.col("name"),
    (pl.col("age") * 2).alias("double_age")
)

# Select all columns matching a pattern
df.select(pl.col("^.*_id$"))
Filter

条件で行をフィルタリングします:

# Single condition
df.filter(pl.col("age") > 25)

# Multiple conditions (cleaner than using &)
df.filter(
    pl.col("age") > 25,
    pl.col("city") == "NY"
)

# Complex conditions
df.filter(
    (pl.col("age") > 25) | (pl.col("city") == "LA")
)
With Columns

既存の列を保持したまま、列を追加または変更します:

# Add new columns
df.with_columns(
    age_plus_10=pl.col("age") + 10,
    name_upper=pl.col("name").str.to_uppercase()
)

# Parallel computation (all columns computed in parallel)
df.with_columns(
    pl.col("value") * 10,
    pl.col("value") * 100,
)
Group By と集計

データをグループ化して集計を計算します:

# Basic grouping
df.group_by("city").agg(
    pl.col("age").mean().alias("avg_age"),
    pl.len().alias("count")
)

# Multiple group keys
df.group_by("city", "department").agg(
    pl.col("salary").sum()
)

# Conditional aggregations
df.group_by("city").agg(
    (pl.col("age") > 30).sum().alias("over_30")
)

詳細な操作パターンについては、references/operations.md を読み込んでください。

集計とウィンドウ関数

集計関数

group_by コンテキスト内でよく使われる集計:

  • pl.len() - 行数をカウント
  • pl.col("x").sum() - 値の合計
  • pl.col("x").mean() - 平均
  • pl.col("x").min() / pl.col("x").max() - 最小値・最大値
  • pl.first() / pl.last() - 最初・最後の値
over() によるウィンドウ関数

行数を保持したまま集計を適用します:

# Add group statistics to each row
df.with_columns(
    avg_age_by_city=pl.col("age").mean().over("city"),
    rank_in_city=pl.col("salary").rank().over("city")
)

# Multiple grouping columns
df.with_columns(
    group_avg=pl.col("value").mean().over("category", "region")
)

マッピング戦略:

  • group_to_rows(デフォルト): 元の行順序を保持します
  • explode: 高速ですが、行がグループ化されてまとめられます
  • join: リスト列を作成します

データ入出力

対応フォーマット

Polars は次の読み書きに対応しています:

  • CSV、Parquet、JSON、Excel
  • データベース(コネクタ経由)
  • クラウドストレージ(S3、Azure、GCS)
  • Google BigQuery
  • 複数ファイル/パーティション分割されたファイル
一般的な入出力操作

CSV:

# Eager
df = pl.read_csv("file.csv")
df.write_csv("output.csv")

# Lazy (preferred for large files)
lf = pl.scan_csv("file.csv")
result = lf.filter(...).select(...).collect()

Parquet(パフォーマンスに推奨):

df = pl.read_parquet("file.parquet")
df.write_parquet("output.parquet")

JSON:

df = pl.read_json("file.json")
df.write_json("output.json")

包括的な入出力のドキュメントについては、references/io_guide.md を読み込んでください。

変換

結合

DataFrame を結合します:

# Inner join
df1.join(df2, on="id", how="inner")

# Left join
df1.join(df2, on="id", how="left")

# Join on different column names
df1.join(df2, left_on="user_id", right_on="id")
連結

DataFrame を積み重ねます:

# Vertical (stack rows)
pl.concat([df1, df2], how="vertical")

# Horizontal (add columns)
pl.concat([df1, df2], how="horizontal")

# Diagonal (union with different schemas)
pl.concat([df1, df2], how="diagonal")
ピボットとアンピボット

データの形を変換します:

# Pivot (wide format)
df.pivot(values="sales", index="date", columns="product")

# Unpivot (long format)
df.unpivot(index="id", on=["col1", "col2"])

詳細な変換の例については、references/transformations.md を読み込んでください。

pandas からの移行

Polars は、よりすっきりした API で pandas と比べて大幅なパフォーマンス向上を実現します。主な違いは次のとおりです:

概念上の違い
  • インデックスなし: Polars は整数位置のみを使用します
  • 厳格な型付け: 暗黙的な型変換は行いません
  • 遅延評価: LazyFrame で利用可能です
  • デフォルトで並列: 操作は自動的に並列化されます
一般的な操作の対応表
操作PandasPolars
列の選択df["col"]df.select("col")
フィルタdf[df["col"] > 10]df.filter(pl.col("col") > 10)
列の追加df.assign(x=...)df.with_columns(x=...)
グループ化df.groupby("col").agg(...)df.group_by("col").agg(...)
ウィンドウdf.groupby("col").transform(...)df.with_columns(...).over("col")
主な構文パターン

Pandas の逐次処理(遅い):

df.assign(
    col_a=lambda df_: df_.value * 10,
    col_b=lambda df_: df_.value * 100
)

Polars の並列処理(速い):

df.with_columns(
    col_a=pl.col("value") * 10,
    col_b=pl.col("value") * 100,
)

包括的な移行ガイドについては、references/pandas_migration.md を読み込んでください。

ベストプラクティス

パフォーマンス最適化
  1. 大規模データセットには遅延評価を使用する:

    lf = pl.scan_csv("large.csv")  # Don't use read_csv
    result = lf.filter(...).select(...).collect()
    
  2. ホットパスでの Python 関数の使用を避ける:

    • 並列化のために式 API の範囲内に留める
    • .map_elements() は必要な場合にのみ使用する
    • ネイティブの Polars 操作を優先する
  3. 非常に大きなデータにはストリーミングを使用する:

    lf.collect(streaming=True)
    
  4. 必要な列だけを早い段階で選択する:

    # Good: Select columns early
    lf.select("col1", "col2").filter(...)
    
    # Bad: Filter on all columns first
    lf.filter(...).select("col1", "col2")
    
  5. 適切なデータ型を使用する:

    • 低カーディナリティの文字列には Categorical を使用する
    • 適切な整数サイズを選ぶ (i32 と i64 の比較)
    • 時系列データには日付型を使用する
式のパターン

条件付き操作:

pl.when(condition).then(value).otherwise(other_value)

複数の列にまたがる列操作:

df.select(pl.col("^.*_value$") * 2)  # Regex pattern

null の処理:

pl.col("x").fill_null(0)
pl.col("x").is_null()
pl.col("x").drop_nulls()

その他のベストプラクティスやパターンについては、references/best_practices.md を読み込んでください。

リソース

このスキルには、包括的なリファレンスドキュメントが含まれています:

references/
  • core_concepts.md - 式、遅延評価、型システムの詳細な解説
  • operations.md - 一般的な操作をすべて例付きで解説した包括的なガイド
  • pandas_migration.md - pandas から Polars への完全な移行ガイド
  • io_guide.md - サポートされているすべての形式のデータ I/O 操作
  • transformations.md - 結合、連結、ピボット、再形成操作
  • best_practices.md - パフォーマンス最適化のヒントと一般的なパターン

ユーザーが特定のトピックについて詳細な情報を必要とする場合は、これらのリファレンスを必要に応じて読み込んでください。

コメント