トップ / ウィンドウ関数
パーティション内の行を、指定した個数のグループに行数ができるだけ均等になるよう分割する。
ntile(3).over(window_spec)
((pl.col("v").rank(method="ordinal") - 1) * 3 // pl.col("v").count()).over("grp")
Snowflake公式ドキュメントは「順序付けされたデータセットを、指定したバケット数で行数が均等になるよう分割する」と明記している=値そのものではなく行の順位(rank)が基準。Polarsには同名の専用関数が無いため、rank(method="ordinal")(1位・2位…と重複無しの順位)を使って同じ計算式を組み立てる必要がある。7行を3グループに分けて実行して確認したところ、両者とも[3,2,2]行ずつに割れる。
似て非なるqcut(値の分位点で区切る関数)を使うと失敗することがある。実行して確認したところ、値に重複が多いデータ(例:[1,1,1,1,1,1,100]を3分位に分けようとする)では、qcutは分位点の境界値が重複してしまいquantiles are not uniqueというエラーでそもそも実行できない。一方、上記のrankベースの式は値の重複に関係なく常に行数で均等に割れる。「NTILEの代わり」としてqcutを選ぶと、データによっては動かないコードになる。
Polars 1.36.1 で実行確認 / Snowpark Python SDK 1.51.1 で静的検証(2026-08-30)