RubyのデータフレームライブラリRedAmberで解く
Apache Arrowを利用したRubyのデータフレームライブラリであるRedAmberを作っている鈴木(@heronshoes)です。
この記事は下記の記事に触発された紹介記事です。
@sonota88さんはパーサに造詣が深いので、流石のアプローチだと思いました。
私も、データサイエンス100本ノック(構造化データ加工編)のRuby(RedAmber)版を作っているので、同じ 例題 -005 をやってみたらどうなるかご紹介したいと思います。
問題はこうです。
レシート明細データ(df_receipt)から売上日(sales_ymd)、顧客ID(customer_id)、
商品コード(product_cd)、売上金額(amount)の順に列を指定し、以下の全ての条件を満たす
データを抽出せよ。
- 顧客ID(customer_id)が"CS018205000001"
- 売上金額(amount)が1,000以上
これはこんな風に書けます。
# 例1
df_receipt[["sales_ymd", "customer_id", "product_cd", "amount"]]
.filter { |df| (df[:customer_id] == 'CS018205000001') & (df[:amount] >= 1000) }
RedAmberでは 列の中身のオブジェクトをVectorと呼んでいて、Vectorにはベクトル演算のメソッドとして#==
や #&
や #>=
を持たせています。これらは演算子の再定義を使っているのですが、&
はプリミティブな演算子としては優先順位が高いためカッコが必須となります。ちなみに優先順位が低い&&
は再定義できないので使えません。
RedAmberによる書き方で私が一番好きな書き方はこちら。
# 例2
df_receipt
.pick(%i[sales_ymd customer_id product_cd amount])
.filter { (customer_id == 'CS018205000001') & (amount >= 1000) }
例2でfilter
の括弧の中は、instance_eval
を使って呼び出されていることと、列名であるcustomer_id
がmethod_missing
のおかげで self.customer_id
として呼び出されていることと、selfが省略できることが合わさって、このような書き方ができます。
ちなみに、もし列名がメソッド名にできない名前であった場合はこのように書きます。
# 例3 列名がメソッド名にできない名前の場合
df_receipt
.pick(:sales_ymd, :'customer-id', :product_cd, :Amount)
.filter { (v(:'customer-id') == 'CS018205000001') & (v(:Amount) >= 1000) }
# または
# .filter { |df| df[:'customer-id'] == 'CS018205000001') & (df[:Amount] >= 1000) }
DataFrame#v(:column_name)
は指定した列名のVectorを返すメソッドです。同じ働きをする
DataFrame#[]
よりも少し速いというメリットがあります。
宣伝
RubyKaigi2023の3日目の午前中、Open StudioでRedAmberについて発表します。参加される方は現地でお会いしましょう!
追記
データサイエンス100本ノック(構造化データ加工編)のRuby(RedAmber)版は現在作成中です。
Arrow 11.0.0では機能が不足していて書きにくかった設問があったので、機能をリクエスト&コントリビュートしたArrow 12.0.0を待っていました。今日(4/8)、Red Arrow Gem も含めた12.0.0が無事リリースされたのでこれを利用したRedAmber 0.5.0へのバージョンアップを予定しています(RubyKaigiまでにできるかな...)。
さらに追記(2023-05-25)
RubyKaigiまでに、どころか2週間もたってようやくRedAmber 0.5.0を出せました。なかなか出せなかった理由はArrow 12.0.0で新しくなったJoinを修正するのに時間がかかってしまったからです。100本ノック的には、join周りが少し速くなったはず(検証できてないですけど)なのと、前半の条件検索あたりの設問で部分文字列の検索が速くなったはず(検証できてないですけど)なのと、rankでtiebreakerのオプションが使えるようになったので設問19がスッキリ書ける(これは確認済)のがポイントです!
データサイエンス100本ノック RedAmber版も急がねば!