Pandas学習ノート10-高性能のevalとquery方法


高性能pandas:eval()とquery()
pythonデータ科学生態環境の強大な力はNumpyとPandasの基礎の上で、そして直観的な文法を通じて基本操作をc言語に転化します:Numpyの中で量子化/放送演算で、pandasの中でグループ型の演算です.これらの抽象機能は、多くの問題を簡潔かつ効率的に解決できますが、一時的なオブジェクトを作成する必要があります.これにより、計算時間とメモリが大幅に消費されます.
Pandasはパフォーマンスの問題を解決するためにeval()とquery()関数を導入し,ユーザにC言語速度の操作を直接実行させることができ,中間配列の構成に苦労する必要がなく,いずれもNumexprパッケージに依存する.
import numpy as np
x = np.random.rand(1000000)
y = np.random.rand(1000000)
%timeit x+y
%timeit np.fromiter(xi+yi for xi, yi in zip(x,y))

    :
1.83 ms ± 14.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
143 ms ± 242 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

次のnumpyの量子化演算については,通常のpythonサイクルやリスト総合運転よりもはるかに高速であると考えられるが,次の複合代数式問題に対する演算効率は低いという利点が明らかである.
mask = (x>0.5) & (x<0.5)

#      :
tmp1 = (x>0.5)
tmp2 = (y<0.5)
mask = tmp1 & tmp2

なぜなら、各セグメントの中間プロシージャには、明示的な割り当てメモリが必要です.x配列とy配列が大きい場合、演算には多くの時間とメモリがかかります.Numexprライブラリでは、中間プロセスにすべてのメモリを割り当てないで、要素から要素への複合代数演算を完了できます.Pandasのeval()とquery()ツールはNumexprに基づいて実現される.
pandas.eval()高性能演算を実現
pd.eval()がサポートする演算
1、算術演算
df1,df2,df3,df4,df5 = (pd.DataFrame(np.random.randint(0,1000,(100,3))),for i in range(5))
result = pd.eval('-df1 * df2 / (df3 + df4) -df5')

2、比較演算
result = pd.eval('df1 < df2 <= df3 != df4')

3、ビット演算
result = pd.eval('(df1<0.5) & (df2<0.5) | (df3)

5、オブジェクト属性と索引
result = pd.eval('df2.T[0] + df3.iloc[1]')

DataFrameでeval()実装カラム間演算
pd.eval()はpandasの最上位関数であるため、DataFrameにはeval()の方法がある.eval()メソッドを用いる利点は、カラム名で演算できることである.
result = pd.eval("(df.A + df.B) / (df.C -1)")

1、DataFrameを使う.eval()新規列
df.eval('D = (A+B) / c', inplace=True)

2、DataFrame.eval()ローカル変数の使用
column_mean = df.mean(1)
result = df.eval('A + @column_mean')

DataFrame.query()メソッド
query()メソッドはeval()メソッドと同様にDataFrame列に基づく計算代数式である.フィルタリングの操作にはquery()メソッドを使用できます.
result = df.query('A < @Cmean and B < @Cmean')