今回はPandasを高速化させられる
互換ライブラリ「FireDucks」を試してみました。

解説動画はこちら



Fireducksについて

NEC研究所さんが開発した
Pandas互換ライブラリで
Pandasデータフレームの各種処理が
高速化されている様です。

FireDucks

早速速度を試してみましょう。



インストール方法

インストールコマンドを実行するだけです。
pip install fireducks




読み込み方

import文を実行するだけで
読み込み出来ます。
import fireducks.pandas as pd

通常のPandasを読み込みする際も
省略した変数 pd を用いていると思うので
それに合わせる形にすると
既存のPandasを用いたコードに
そのまま適応できる様です。



速度検証用のコード


今回はデータフレームに対して
様々な操作を行うものを用意してみました。

100万回試行して速度比較します。
import pandas as pd
import numpy as np
import time
import fireducks.pandas as pd2

def create_data(N,t):
  data = {
        'A': np.random.randn(N),
        'B': np.random.randn(N),
        'C': np.random.choice(['O', 'P', 'P', 'A', 'Y'], N),}
  if t:
    return pd.DataFrame(data)
  else:
    return pd2.DataFrame(data)._evaluate()

# 処理時間の計測
def perform_measure(func,df,message):
    start_time = time.time()
    tmp = func(df)
    end_time = time.time()
    excute_time = end_time - start_time
    #print(f"excute {message} time : {excute_time}")
    return excute_time


# 加算処理
def df_calc(df):
    return (df['A'] + df['B'])

# 文字列置換処理
def df_replace(df):
  return df['C'].replace({"O":"1","P":"2","A":"3","Y":"4"})

# Filter処理
def df_filtering(df):
  return df[df['A'] > 0.5]

# GroupBy処理
def df_groupby(df):
  return df.groupby('C').mean()

# Sort処理
def df_sorting(df):
  return df.sort_values(by='B')

# Join処理
def df_joining(df):
    df1 = df[['A', 'B']].copy()
    df2 = df[['C']].copy()
    return df1.join(df2)

# Fillna処理
def df_fillna(df):
    df_na = df.copy()
    df_na.loc[df_na.sample(frac=0.1).index, 'A'] = np.nan
    return df_na.fillna(0)

# Dropna処理
def df_dropna(df):
    df_na = df.copy()
    df_na.loc[df_na.sample(frac=0.1).index, 'A'] = np.nan
    return df_na.dropna()


N = 1000000
df_pandas = create_data(N,True)
df_ducks = create_data(N,False)

c1 = perform_measure(df_calc,df_pandas,"calc")
c2 = perform_measure(df_calc,df_ducks,"calc")
r1 = perform_measure(df_replace,df_ducks,"replace")
r2 = perform_measure(df_replace,df_ducks,"replace")
f1 = perform_measure(df_filtering,df_pandas,"filtering")
f2 = perform_measure(df_filtering,df_ducks,"filtering")
g1 = perform_measure(df_groupby,df_pandas,"groupby")
g2 = perform_measure(df_groupby,df_ducks,"groupby")
s1 = perform_measure(df_sorting,df_pandas,"sorting")
s2 = perform_measure(df_sorting,df_ducks,"sorting")
j1 = perform_measure(df_joining,df_pandas,"joining")
j2 = perform_measure(df_joining,df_ducks,"joining")
fa1 = perform_measure(df_fillna,df_pandas,"fillna")
fa2 = perform_measure(df_fillna,df_ducks,"fillna")
da1 = perform_measure(df_dropna,df_pandas,"dropna")
da2 = perform_measure(df_dropna,df_ducks,"dropna")

data = [
  ["calc",c1,c2],
  ["replace",r1,r2],
  ["filtering",f1,f2],
  ["groupby",g1,g2],
  ["sorting",s1,s2],
  ["joining",j1,j2],
  ["fillna",fa1,fa2],
  ["dropna",da1,da2],
]

result_df = pd.DataFrame(data,columns=["処理","pandas","ducks"])
result_df["差分"] = result_df['pandas'] / result_df['ducks']
result_df

結果は動画をご覧ください。




まとめ


数値計算は高速化されているのが確認できた
文字列計算はもしかすると、あまり変わらないかも

その他の処理も速くなっている部分は有るらしいので
互換性や実行結果に問題が無ければ
高速化メリットあり、という所です。

まだベータ版っぽいので
これからもっと良くなるんだと思います。

試したい方は色々遊んでみて下さい
それでは。