這篇文章給大家分享的是有關怎么提高Pandas的運行速度的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在雜多等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網(wǎng)站設計制作、網(wǎng)站建設 網(wǎng)站設計制作按需制作,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,成都品牌網(wǎng)站建設,成都營銷網(wǎng)站建設,成都外貿(mào)網(wǎng)站建設公司,雜多網(wǎng)站建設費用合理。
1、數(shù)據(jù)讀取的優(yōu)化
讀取數(shù)據(jù)是進行數(shù)據(jù)分析前的一個必經(jīng)環(huán)節(jié),pandas中也內(nèi)置了許多數(shù)據(jù)讀取的函數(shù),最常見的就是用pd.read_csv()函數(shù)從csv文件讀取數(shù)據(jù)。pkl格式的數(shù)據(jù)的讀取速度最快,所以對于日常的數(shù)據(jù)集(大多為csv格式),可以先用pandas讀入,然后將數(shù)據(jù)轉存為pkl或者hdf格式,之后每次讀取數(shù)據(jù)時候,便可以節(jié)省一些時間。代碼如下:
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、進行聚合操作時的優(yōu)化
在使用 agg 和 transform 進行操作時,盡量使用Python的內(nèi)置函數(shù),能夠提高運行效率。(數(shù)據(jù)用的還是上面的測試用例)
(1)agg+Python內(nèi)置函數(shù)
(2)agg+非內(nèi)置函數(shù)
可以看到對 agg 方法,使用內(nèi)置函數(shù)時運行效率提升了60%。
(3)transform+Python內(nèi)置函數(shù)
(4)transform+非內(nèi)置函數(shù)
對 transform 方法而言,使用內(nèi)置函數(shù)時運行效率提升了兩倍。
3、對數(shù)據(jù)進行逐行操作時的優(yōu)化
假設我們現(xiàn)在有這樣一個電力消耗數(shù)據(jù)集,以及對應時段的電費價格。數(shù)據(jù)集記錄著每小時的電力消耗,如第一行代表2001年1月13日零點消耗了0.586kwh的電。不同使用時段的電費價格不一樣,我們現(xiàn)在的目的是求出總的電費,那么就需要將對應時段的單位電費×消耗電量。下面給出了三種寫法,我們分別測試這三種處理方式,對比一下這三種寫法有什么不同,代碼效率上有什么差異。
#編寫求得相應結果的函數(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
#方法一:簡單循環(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篩選出各時段,分段處理
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
測試結果:
可以看到,采用 isin() 篩選出對應數(shù)據(jù)后分開計算的速度是簡單循環(huán)的近606倍,這并不是說 isin() 有多厲害,方法三速度快是因為它采用了向量化的數(shù)據(jù)處理方式(這里的isin() 是其中一種方式,還有其他方式,大家可以嘗試一下) ,這才是重點。
4、使用numba進行加速
如果在你的數(shù)據(jù)處理過程涉及到了大量的數(shù)值計算,那么使用numba可以大大加快代碼的運行效率,numba使用起來也很簡單,下面給大家演示一下。(代碼處理不具有實際意義,只是展示一下效果)
首先需要安裝numba模塊
>>>pip install numba
我們用一個簡單的例子測試一下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)
#方法二:向量化運行
df["double_energy"] = df.energy_kwh*2
#方法三:運用numba加速
#需要以numpy數(shù)組的形式傳入
#否則會報錯
df["double_energy"] = f_with_numba(df.energy_kwh.to_numpy())
從測試結果來看,再次凸顯出向量化處理的優(yōu)勢,同時numba對原本速度已經(jīng)很快的向量化處理也能提高一倍多的效率。
感謝各位的閱讀!關于“怎么提高Pandas的運行速度”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!