見出し画像

FireDucks入門: 学習コストゼロでpandasを超えるパフォーマンスを手に入れる!

本記事はFireDucksユーザー記事シリーズの第2弾です.本記事は黒柳茂様に執筆して頂きました


データサイエンティストであれば必ず利用していると言って良いpandas。
とても愛着を持っているライブラリだけど、もっと手軽に高速化できないものかと検索していたところFireDucksを発見し興味を持ちました!


1. はじめに

FireDucksとは何か?

FireDucksは、NECが開発した「pandas」の分析を高速化するpythonライブラリ。NECが30年以上にわたるスーパーコンピュータの開発で培った高性能プログラミング技術と高速化のノウハウが活かされているらしい!

https://jpn.nec.com/press/202310/20231019_01.html

pandasとの比較:なぜFireDucksが注目されるのか?

pandasは書き方次第でいくらでも遅くなってしまうというのがあるかと思います。とはいえ、私はデータサイエンティストなのでパフォーマンスを向上することより、データ分析にもっともっと時間を割きたいわけです。そして、処理の順番もよしなに入れ替えてくれ高速化してくれるというのはすごいですよね。例えば、処理A⇒処理Bだと遅くなりそうだから、処理B⇒処理Aに入れ替えて実行するというようなイメージです。(もちろん結果は同じであることが保証されています)。データサイエンティストは業務時間の約45%をデータの準備に費やしていると言われており、当事者としてもここのスピードアップをどうにかしたいなと考えていたところFireDucksというモジュールに出会ったのです。

処理フロー最適化のイメージ

記事の目的

この記事は、入門編です。FireDucksを利用するための環境設定やインストール方法、メリット、実際の利用シーンなどをメインにFireDucksの魅力をお伝えしていきたいと考えております。

2. FireDucksの基本

環境

FireDucksのドキュメントを見ると、Linuxのみの対応となっているみたいです。私はメインマシンでWindowsを使っているのでWSL2(Windows Subsystem for Linux)というWindows上でLinuxを動かせる環境から試してみたいと思います。

私が試した環境は下記の通りです。

OS Microsoft Windows 11 Pro
バージョン 10.0.22631 ビルド 22631
システムモデル Z690 Pro RS
システムの種類 x64-ベース
PC プロセッサ 12th Gen Intel(R) Core(TM) i3-12100、3300 Mhz、 4 個のコア、8 個のロジカル プロセッサ
ベースボード製品 Z690 Pro RS
プラットフォームの役割 デスクトップ
インストール済みの物理メモリ (RAM)64.0 GB

FireDucksのインストールと設定

WSLをインストールする

WSLのインストールは下記のマイクロソフトのドキュメントを参考にインストールしました。LinuxのディストリビューションはUbuntu 22.04.1 LTSです

FireDucksをインストールする

それでは実際にFireDucksをインストールします。といってもインストールは非常に簡単です。

pip install fireducks

数分かかりますが、(pyarrow, pandasなどのライブラリとともに) FireDucksがインストールされました

FireDucksがインストールされている様子

簡単な使用例と基本操作

早速使えるか確認しましょう。そのままpython3.exeを起動して確認するのも良いですが、私は分析環境としてjupyter labを利用しているのでjupyter labをインストールして確認します。

エラーが出ていなければインストールされています。

実際に、どれだけ便利なのか見てみたいと思います。データセットはKaggleで公開されているVideo_Ads Engagement Datasetを利用しています。約500MBの300 万件の動画広告の広告オークションに関するデータセットです。

データの読み込みと実行

pandasとまったく変わらない処理で、実行してくれました。読み込み速度がめちゃ早いです。私の環境ではpandasだと4秒かかっていたのが、74.5nsとなりました。

read_csv処理
Groupbyし、平均値を求めた後、csvに吐き出す処理
# 1. 時間帯とクリエイティブデュレーションに基づく分析
# タイムスタンプを日時オブジェクトに変換
df['timestamp_converted'] = pd.to_datetime(df['timestamp'], unit='s')

# 時間帯を定義
def get_part_of_day(hour):
    if 5 <= hour < 12:
        return 'morning'
    elif 12 <= hour < 17:
        return 'afternoon'
    else:
        return 'evening'

# 新しい列に時間帯を追加
df['part_of_day'] = df['timestamp_converted'].apply(lambda x: get_part_of_day(x.hour))

# 時間帯ごとのクリエイティブデュレーションの平均を計算
df_duration_by_time = df.groupby('part_of_day')['creative_duration'].mean()
print(df_duration_by_time)

# 2. 異なる広告主ごとのキャンペーンパフォーマンス
df_campaigns_per_advertiser = df.groupby('advertiser_id')['campaign_id'].nunique()
df_creatives_per_advertiser = df.groupby('advertiser_id')['creative_id'].nunique()
print(df_campaigns_per_advertiser)
print(df_creatives_per_advertiser)

# 3. 言語とウェブサイトの関連性
df_common_website_per_language = df.groupby('placement_language')['website_id'].apply(lambda x: x.mode()[0])
print(df_common_website_per_language)

# 4. リファラー情報の分析
def extract_domain(referrer):
    # referrer が float(NaNなど)の場合、空の文字列を返す
    if isinstance(referrer, float):
        return ''
    # それ以外の場合、ドメイン名を抽出
    return referrer.split('/')[0]

df['referrer_domain'] = df['referer_deep_three'].apply(extract_domain)
df_referrer_distribution = df['referrer_domain'].value_counts()
print(df_referrer_distribution)

いろんなデータ前処理と分析をしてみた結果、すべての処理でpandasだと8秒かかっていたのが4秒と約半分になりました。

3. FireDucksを利用するメリット

パフォーマンス向上

pandasを使っていて地味にストレスなのが、大規模データセットの読み込み時に待つ。Groupbyしたら待つ。みたいな感じでちょくちょく待たないといけないんですよね。半面FireDucksは遅延評価をするので読み込み自体は全く時間がかからないため、必要なところで処理が行われ、待たされる回数と時間が減るというのは非常に大きいと感じました。
※遅延評価:

そのほかのパフォーマンスに関しては、公式が公表しておりますがpandasと比較して最大16倍の高速化が実現できたようです。(次回いろんな競合ライブラリと合わせて性能比較してみようと思います。)

Fireucks公式サイトから抜粋

学習コストゼロ

pandasの記法に従って何も考えることなく、利用できるというのは非常に大きいメリットだと思います。FireDucks含めそれ以外のデータフレーム高速化ライブラリは存在しますが、やはり学習コストが高すぎて覚えきれないのと、すぐ忘れてしまうんですよね。
例えば、polarsをで列追加する場合は、こんな感じで書かないといけません。

 #pandas df["new_col"] = df["A"] + 1 
#polars
df = df.with_columns((pl.col("A") + 1).alias("new_col"))

既存のコードをほぼ変える必要がない

私もいくつかpandasを使っているETLなどがあるのですが、FireDucksをインストールして置き換えるだけでパフォーマンス向上が見込めるのは良いですよね。

4. プロジェクトへのFireDucksの活用例

実際のFireDucksの活用例

  • ETLパイプラインの高速化:既存のpandasを使っているETLパイプラインがあれば、置き換えるのが良いと思います。

  • バッチ処理の高速化:バッチが遅くてひやひやすることはないですか?既存のpandasを使っているバッチ処理があれば高速化とコスト削減も期待できます

  • 1GBを超えるデータセットのEDAや分析:昨今、データ量が非常に多くなってきていますよね。そのようなデータセットの場合、経験上pandasだとかなり処理時間で待たされてしまうことが多いです。処理時間にストレスを感じている方、一度FireDucksを検討してみるのが良いかもしれません。

5. コミュニティとサポート

FireDucksのX(旧Twitter)

https://twitter.com/fireducksdev

公式ドキュメント

6. まとめ

FireDucksの魅力と実際のインストール方法についてまとめました。pandas大好きな人であれば、そのスキルを引き継いで高速化の恩恵を受けれる良いライブラリだなと感じました。次回はより性能評価的な観点で触ってみたいと思います。

この記事が気に入ったらサポートをしてみませんか?