Python Data Analysis Library 或 pandas 是基于NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,它是使Python成為強大而高效的數據分析環境的重要因素之一。
相較于 Python 的內置函數, Pandas 庫為我們提供了一系列性能更高的數據處理函數,本節將向大家介紹 Pandas 庫中的高性能函數 eval 與 query:
在 Python 中,我們可以用很多種的方法來實現同樣的目標,例如實現兩個數組的相加:
import numpy as np rng = np.random.RandomState(42) x = rng.rand(1E6) y = rng.rand(1E6) %timeit x + y 100 loops, best of 3: 3.39 ms per loop
利用 Numpy 中的 fromiter 函數我們可以得到相同的一維數組,然而我們發現,這個語句的性能并不比內置的數組加法好。
%timeit np.fromiter((xi + yi for xi, yi in zip(x, y)), dtype=x.dtype, count=len(x)) 1 loop, best of 3: 266 ms per loop
再比如,進行某一項條件的判斷:
mask = (x > 0.5) & (y < 0.5) tmp1 = (x > 0.5) tmp2 = (y < 0.5) mask = tmp1 & tmp2
Numpy 庫中的函數 allclose 用于判斷兩個數組是否相等,我們可以看到,使用 numexpr 庫中的 evaluate 函數同樣可以實現 mask 中的條件判斷。
import numexpr mask_numexpr = numexpr.evaluate('(x > 0.5) & (y < 0.5)') np.allclose(mask, mask_numexpr) True 面對同樣的問題,Pandas 庫為我們提供了更高性能的解決方案, eval 函數能夠將特定形式的字符串轉換為對應含義的邏輯判斷或運算,比 Python 的內置函數具有更好的算法效率:
import pandas as pd nrows, ncols = 100000, 100 rng = np.random.RandomState(42) df1, df2, df3, df4 = (pd.DataFrame(rng.rand(nrows, ncols)) for i in range(4)) %timeit df1 + df2 + df3 + df4 10 loops, best of 3: 87.1 ms per loop %timeit pd.eval('df1 + df2 + df3 + df4') 10 loops, best of 3: 42.2 ms per loop np.allclose(df1 + df2 + df3 + df4, pd.eval('df1 + df2 + df3 + df4')) True 可以看到,eval 函數實現了等價的計算,并且具有更高的性能。除了加法運算,Pandas 的函數 eval 還能幫助我們實現其他多種復雜的邏輯判斷或計算:
總結
以上就是本文關于Pandas探索之高性能函數eval和query解析的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
|
新聞熱點
疑難解答