怎么提高Pandas的運(yùn)行速度

這篇文章給大家分享的是有關(guān)怎么提高Pandas的運(yùn)行速度的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

在雜多等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營(yíng)銷網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè)公司,雜多網(wǎng)站建設(shè)費(fèi)用合理。

1、數(shù)據(jù)讀取的優(yōu)化

讀取數(shù)據(jù)是進(jìn)行數(shù)據(jù)分析前的一個(gè)必經(jīng)環(huán)節(jié),pandas中也內(nèi)置了許多數(shù)據(jù)讀取的函數(shù),最常見(jiàn)的就是用pd.read_csv()函數(shù)從csv文件讀取數(shù)據(jù)。pkl格式的數(shù)據(jù)的讀取速度最快,所以對(duì)于日常的數(shù)據(jù)集(大多為csv格式),可以先用pandas讀入,然后將數(shù)據(jù)轉(zhuǎn)存為pkl或者h(yuǎn)df格式,之后每次讀取數(shù)據(jù)時(shí)候,便可以節(jié)省一些時(shí)間。代碼如下:

import pandas as pd

#讀取csv

df = pd.read_csv('xxx.csv')

#pkl格式

df.to_pickle('xxx.pkl') #格式另存

df = pd.read_pickle('xxx.pkl') #讀取

#hdf格式

df.to_hdf('xxx.hdf','df') #格式另存

df = pd.read_hdf('xxx.pkl','df') #讀取

2、進(jìn)行聚合操作時(shí)的優(yōu)化

在使用 agg 和 transform 進(jìn)行操作時(shí),盡量使用Python的內(nèi)置函數(shù),能夠提高運(yùn)行效率。(數(shù)據(jù)用的還是上面的測(cè)試用例)

(1)agg+Python內(nèi)置函數(shù)

怎么提高Pandas的運(yùn)行速度

(2)agg+非內(nèi)置函數(shù)

怎么提高Pandas的運(yùn)行速度

可以看到對(duì) agg 方法,使用內(nèi)置函數(shù)時(shí)運(yùn)行效率提升了60%。

(3)transform+Python內(nèi)置函數(shù)

怎么提高Pandas的運(yùn)行速度

(4)transform+非內(nèi)置函數(shù)

怎么提高Pandas的運(yùn)行速度

對(duì) transform 方法而言,使用內(nèi)置函數(shù)時(shí)運(yùn)行效率提升了兩倍。

3、對(duì)數(shù)據(jù)進(jìn)行逐行操作時(shí)的優(yōu)化

假設(shè)我們現(xiàn)在有這樣一個(gè)電力消耗數(shù)據(jù)集,以及對(duì)應(yīng)時(shí)段的電費(fèi)價(jià)格。數(shù)據(jù)集記錄著每小時(shí)的電力消耗,如第一行代表2001年1月13日零點(diǎn)消耗了0.586kwh的電。不同使用時(shí)段的電費(fèi)價(jià)格不一樣,我們現(xiàn)在的目的是求出總的電費(fèi),那么就需要將對(duì)應(yīng)時(shí)段的單位電費(fèi)×消耗電量。下面給出了三種寫法,我們分別測(cè)試這三種處理方式,對(duì)比一下這三種寫法有什么不同,代碼效率上有什么差異。

#編寫求得相應(yīng)結(jié)果的函數(shù)

def get_cost(kwh, hour):

if 0 <= hour < 7:

rate = 0.6

elif 7 <= hour < 17:

rate = 0.68

elif 17 <= hour < 24:

rate = 0.75

else:

raise ValueError(f'Invalid hour: {hour}')

return rate * kwh

#方法一:簡(jiǎn)單循環(huán)

def loop(df):

cost_list = []

for i in range(len(df)):

energy_used = df.iloc[i]['energy_kwh']

hour = df.iloc[i]['date_time'].hour

energy_cost = get_cost(energy_used, hour)

cost_list.append(energy_cost)

df['cost'] = cost_list

#方法二:apply方法

def apply_method(df):

df['cost'] = df.apply(

lambda row: get_cost(

kwh=row['energy_kwh'],

hour=row['date_time'].hour),

axis=1)

#方法三:采用isin篩選出各時(shí)段,分段處理

df.set_index('date_time', inplace=True)

def isin_method(df):

peak_hours = df.index.hour.isin(range(17, 24))

simple_hours = df.index.hour.isin(range(7, 17))

off_peak_hours = df.index.hour.isin(range(0, 7))

df.loc[peak_hours, 'cost'] = df.loc[peak_hours, 'energy_kwh'] * 0.75

df.loc[simple_hours,'cost'] = df.loc[simple_hours, 'energy_kwh'] * 0.68

df.loc[off_peak_hours,'cost'] = df.loc[off_peak_hours, 'energy_kwh'] * 0.6

測(cè)試結(jié)果:

可以看到,采用 isin() 篩選出對(duì)應(yīng)數(shù)據(jù)后分開(kāi)計(jì)算的速度是簡(jiǎn)單循環(huán)的近606倍,這并不是說(shuō) isin() 有多厲害,方法三速度快是因?yàn)樗捎昧讼蛄炕臄?shù)據(jù)處理方式(這里的isin() 是其中一種方式,還有其他方式,大家可以嘗試一下) ,這才是重點(diǎn)。

4、使用numba進(jìn)行加速

如果在你的數(shù)據(jù)處理過(guò)程涉及到了大量的數(shù)值計(jì)算,那么使用numba可以大大加快代碼的運(yùn)行效率,numba使用起來(lái)也很簡(jiǎn)單,下面給大家演示一下。(代碼處理不具有實(shí)際意義,只是展示一下效果)

首先需要安裝numba模塊

>>>pip install numba

我們用一個(gè)簡(jiǎn)單的例子測(cè)試一下numba的提速效果

import numba

@numba.vectorize

def f_with_numba(x):

return x * 2

def f_without_numba(x):

return x * 2

#方法一:apply逐行操作

df["double_energy"] = df.energy_kwh.apply(f_without_numba)

#方法二:向量化運(yùn)行

df["double_energy"] = df.energy_kwh*2

#方法三:運(yùn)用numba加速

#需要以numpy數(shù)組的形式傳入

#否則會(huì)報(bào)錯(cuò)

df["double_energy"] = f_with_numba(df.energy_kwh.to_numpy())

從測(cè)試結(jié)果來(lái)看,再次凸顯出向量化處理的優(yōu)勢(shì),同時(shí)numba對(duì)原本速度已經(jīng)很快的向量化處理也能提高一倍多的效率。

感謝各位的閱讀!關(guān)于“怎么提高Pandas的運(yùn)行速度”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

當(dāng)前名稱:怎么提高Pandas的運(yùn)行速度
轉(zhuǎn)載來(lái)源:http://muchs.cn/article10/pihjdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管Google、網(wǎng)站內(nèi)鏈、用戶體驗(yàn)、定制網(wǎng)站網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)