Skip to content

エクスプレッション

Polars には、非常に高速なパフォーマンスの中心となる強力な概念であるエクスプレッションがあります。

エクスプレッションは、多くのデータ操作の中核をなしています:

  • カラムからの行のサンプリング
  • カラム内の値の乗算
  • 日付からの年のカラムの抽出
  • 文字列カラムを小文字に変換
  • などなど!

また、エクスプレッションは他の操作でも使用されます:

  • group_by 操作でのグループの平均の取得
  • group_by 操作でのグループサイズの計算
  • 列にわたる合計の取得

Polars は、これらのコアデータ変換を以下によって非常に高速に実行します:

  • 各エクスプレッションの自動クエリ最適化
  • 多数のカラムでのエクスプレッションの自動並列化

エクスプレッションは、1つ以上の Series の構築手順を表す、一連の操作です。出力が Series であるため、前のステップからの出力を変換する一連のエクスプレッションを簡単に適用できます(pandas のメソッドチェーンに似ています)。

これが抽象的で分かりにくく感じるかもしれませんが、ご安心ください!いくつかの例を見ていくだけで、すぐにエクスプレッションの直感が身につきます。次にそれを実践していきましょう!

以下はエクスプレッションです:

col · sort · head

pl.col("foo").sort().head(2)

col · sort · head

let _ = col("foo").sort(Default::default()).head(Some(2));

上記のスニペットは以下のことを意味しています:

  1. "foo" カラムを選択する
  2. その後、カラムをソートする(昇順)
  3. ソート済みの出力の最初の2つの値を取得する

エクスプレッションの力は、すべてのエクスプレッションが新しいエクスプレッションを生成し、それらをパイプできることです。 Polars の実行コンテキストの1つに渡してエクスプレッションを実行できます。

ここでは df.select を使って2つのエクスプレッションを実行しています:

select

df.select(pl.col("foo").sort().head(2), pl.col("bar").filter(pl.col("foo") == 1).sum())

select

df.clone()
    .lazy()
    .select([
        col("foo").sort(Default::default()).head(Some(2)),
        col("bar").filter(col("foo").eq(lit(1))).sum(),
    ])
    .collect()?;

すべてのエクスプレッションは並列に実行されます。また、各エクスプレッション内でさらなる並列化が行われている可能性があることに注意してください。

結論

可能なエクスプレッションの氷山の一角にすぎません。さらに多くのものがあり、さまざまな方法で組み合わせることができます。このページは、エクスプレッションのセクションで深く掘り下げていく前に、エクスプレッションの概念に慣れていただくことを目的としています。