Pandas は最も人気のあるライブラリの 1 つです。そのパフォーマンスをより簡単に高速化する方法を探していたときに、FireDucks を発見し、興味を持ちました。
Pandas プログラムは、その記述方法によっては、重大なパフォーマンスの問題が発生する可能性があります。しかし、データ サイエンティストである私は、コードのパフォーマンスを向上させることよりも、データの分析にもっと多くの時間を費やしたいと考えています。そこで、処理の順序を入れ替えたり、プログラムのパフォーマンスを自動的に高速化することができれば素晴らしいと思います。例えば、工程A =>工程Bでは遅くなってしまうので、工程B =>工程 Aと置き換えます。 (もちろん結果は同じであることが保証されます) データサイエンティストの費用は彼らの時間の 45% はデータの準備に費やされており、このプロセスを高速化するために何かをしようと考えていたときに、FireDucks というモジュールを見つけました。
FireDucks のドキュメントによると、FireDucks は Linux プラットフォームのみでサポートされているようです。メインマシンで Windows を使っているので、Windows 上で Linux を実行できる環境である WSL2 (Windows Subsystem for Linux) から試してみたいと思います。
試した環境は以下の通りです。
WSL は、次の Microsoft ドキュメントを利用してインストールされました。 Linux ディストリビューションは Ubuntu 22.04.1 LTS です。
次に、実際に FireDucks をインストールします。ただし、インストールは非常に簡単です。
pip インストール fireducks
FireDucks (pyarrow、pandas、その他のライブラリとともに) をインストールするには数分かかります。
以下のコードを実行してみました。読み込み速度は非常に速く、pandas では 4 秒かかりましたが、fireDucks ではわずか 74.5 ns しかかかりませんでした。
# 1. analysis based on time period and creative duration # convert timestamp to date/time object df['timestamp_converted'] = pd.to_datetime(df['timestamp'], unit='s ') # define time period def get_part_of_day(hour): if 5 <= hour < 12: return 'morning' elif 12 <= hour < 17: return 'afternoon' else: return 'evening' # Add time period in new column df['part_of_day'] = df['timestamp_converted'].apply(lambda x: get_part_of_day(x.hour)) # Calculate average creative duration by time period df_ duration_by_time = df.groupby('part_of_day')['creative_duration'].mean() print(df_duration_by_time) # 2. campaign performance per different advertiser df_ campaigns_per_advertiser = df.groupby('advertiser_id')['campaign_id'].nunique() df_creatives_per_advertiser = df.groupby('advertiser_id ')['creatives_id'].nunique() print(df_campaigns_per_advertiser) print(df_creatives_per_advertiser) # 3. language and website association df_common_website_ per_language = df.groupby('placement_language')['website_id'].apply(lambda x: x.mode()[0]) print(df_common_website_per_language) # 4. Analyze referrer information def extract_domain(referrer): # if referrer is a float (e.g. NaN), return empty string if isinstance(referrer, float): return '' # otherwise, extract domain name return referrer.split('/')[0] df['referrer_domain'] = df['referrer_deep_three'].apply(extract_domain) df_referrer_distribution = df['referrer_domain'].value_counts() print(df_referrer_distribution)
これらすべてのデータの前処理と分析には、パンダでは約 8 秒かかりましたが、FireDucks を使用すると 4 秒以内に完了できました。ほぼ2倍の高速化が達成できました。
パンダの使用で最もストレスがかかることの 1 つは、大規模なデータセットをロードするときに待機することであり、その後、groupby のような複雑な操作を待たなければなりません。一方、FireDucks は遅延評価を行うため、ロード自体に時間がかからず、必要なところに処理が行われ、トータルの待ち時間が大幅に短縮され、非常に有意義だと感じました。
その他の性能としては、団体が公式発表しているように、パンダと比較して最大16倍の速度を達成しているようです。 (次回は競合するさまざまなライブラリとパフォーマンスを比較してみます。)
何も考えずにパンダの記法に正確に従うことができることは、大きな利点です。 FireDucks 以外にもデータ フレーム アクセラレーション ライブラリはありますが、学習するには高価すぎ、忘れがちです。
たとえば、極座標を含む列を追加したい場合は、次のように記述する必要があります。
# pandas df["new_col"] = df["A"] + 1 # polars df = df.with_columns((pl.col("A") + 1).alias("new_col"))
パンダを使用する ETL やその他のプロジェクトがいくつかありますが、インポート ステートメントをインストールして FireDucks に置き換えるだけでパフォーマンスが向上するのは素晴らしいことです。
さらに追加したい場合は、お気軽に以下にコメントしてください。
以上がFireDucks: 学習コストゼロでパンダを超えるパフォーマンスを手に入れましょう!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。