方法如下:
pandas迴圈提速7萬多倍
文中提到了一種用numpy進行優化的方法,但是具體的實施方式說得並不清楚。
至於為什麼採用numpy會對pandas的迴圈有如此明顯的效果優化,stack overflow給出了解釋。
那麼了解了numpy的優勢之後,為了優化**,則需要將之前的方法替換成numpy的方式。這裡我們以乙個維度(16307, 20)的dataframe進行說明。目前涉及到的主要有以下三種:
1.直接進行values維度計算
利用timeit監測兩種方式的執行時間
567 µs ± 32 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)%
%timeit
df['amount'
]= df[
'last_kj_amount'
]+ df[
'last_15day_amount'
]
221 µs ± 19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)%
%timeit
df['amount2'
]= df[
'last_kj_amount'
].values + df[
'last_15day_amount'
].values
在當前資料量並不大的情況下,速度只提公升了一倍,如果在生產中使用values值進行計算的話優化效果更好。
這裡我們對上面計算的結果進行向上取整,採用兩種方式對比,並用timeit監測執行時間。
243 ms ± 16.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)%
%timeit
df['safe_amount1'
]= df.
(lambda x:math.ceil(x[
'amount'])
,axis =
1)
4.05 ms ± 162 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)def
getint
(x):
return math.ceil(x)
%%timeit
df['safe_amount2'
]= np.vectorize(getint)
(df[
'amount'
])
可見採用np.vectorize方式,時間縮短了近60倍。
np.where類似於if…else語句,主要是用來進行條件判定和資料篩選。
269 ms ± 31.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)%
%timeit
df['signal'
]= df.
(lambda x:
1if x[
'last_15day_amount']==
0and x[
'statis_date']==
20200506
and x[
'time_type']==
2else
0,axis =
1)
1.59 ms ± 196 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)%
%timeit
df['signal1'
]= np.where(
(df[
'last_15day_amount']==
0)&(df[
'statis_date']==
20200506)&
(df[
'time_type']==
2),1,0)
可見,np.where方式時間縮短了近170倍。
以上是最近工程中遇到的主要優化方式,後續想到繼續更新。
pandas 資料處理
pandas中資料可以分為series,dataframe,panel分別表示一維至三維資料。其中在構造時,index表示行名,columns表示列名 構造方式 s pd.series data index index s pd series np random randn 5 index a b ...
pandas資料處理
dataframe.duplicated subset none,keep first 判斷dataframe中的資料是否有重複 必須一行中所有資料都重複才算重複,只能判斷行,不能判斷列 返回series dataframe.drop duplicates subset none,keep firs...
Pandas資料處理
資料處理 pandas from sklearn.preprocessing import minmaxscaler data 1,2 0.5,6 0.10 1,18 將 numpy 轉換成 pd 表 pd.dataframe data 歸一化 0,1 之間 scaler minmaxscaler ...