3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RedAmberで書いたらこうなる - pandasのquery

Last updated at Posted at 2023-05-08

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_idmethod_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版も急がねば!

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?