欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

pandas的優(yōu)點(diǎn)有哪些

本篇內(nèi)容主要講解“pandas的優(yōu)點(diǎn)有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“pandas的優(yōu)點(diǎn)有哪些”吧!

創(chuàng)新互聯(lián)建站專注于大興企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,購物商城網(wǎng)站建設(shè)。大興網(wǎng)站建設(shè)公司,為大興等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)

下面是一個(gè)例子,數(shù)據(jù)獲取方式見文末。

>>> import pandas as pd  # 導(dǎo)入數(shù)據(jù)集  >>> df = pd.read_csv('demand_profile.csv')  >>> df.head()       date_time  energy_kwh  0  1/1/13 0:00       0.586  1  1/1/13 1:00       0.580  2  1/1/13 2:00       0.572  3  1/1/13 3:00       0.596  4  1/1/13 4:00       0.592

基于上面的數(shù)據(jù),我們現(xiàn)在要增加一個(gè)新的特征,但這個(gè)新的特征是基于一些時(shí)間條件生成的,根據(jù)時(shí)長(zhǎng)(小時(shí))而變化,如下:

pandas的優(yōu)點(diǎn)有哪些

因此,如果你不知道如何提速,那正常第一想法可能就是用apply方法寫一個(gè)函數(shù),函數(shù)里面寫好時(shí)間條件的邏輯代碼。

def apply_tariff(kwh, hour):      """計(jì)算每個(gè)小時(shí)的電費(fèi)"""          if 0 <= hour < 7:          rate = 12      elif 7 <= hour < 17:          rate = 20      elif 17 <= hour < 24:          rate = 28      else:          raise ValueError(f'Invalid hour: {hour}')      return rate * kwh

然后使用for循環(huán)來遍歷df,根據(jù)apply函數(shù)邏輯添加新的特征,如下:

>>> # 不贊同這種操作  >>> @timeit(repeat=3, number=100)  ... def apply_tariff_loop(df): ...     """用for循環(huán)計(jì)算enery cost,并添加到列表"""  ...     energy_cost_list = []  ...     for i in range(len(df)):  ...         # 獲取用電量和時(shí)間(小時(shí))  ...         energy_used = df.iloc[i]['energy_kwh']  ...         hour = df.iloc[i]['date_time'].hour  ...         energy_cost = apply_tariff(energy_used, hour)  ...         energy_cost_list.append(energy_cost)  ...     df['cost_cents'] = energy_cost_list  ...   >>> apply_tariff_loop(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_loop` ran in average of 3.152 seconds.

對(duì)于那些寫Pythonic風(fēng)格的人來說,這個(gè)設(shè)計(jì)看起來很自然。然而,這個(gè)循環(huán)將會(huì)嚴(yán)重影響效率。原因有幾個(gè):

首先,它需要初始化一個(gè)將記錄輸出的列表。

其次,它使用不透明對(duì)象范圍(0,len(df))循環(huán),然后再應(yīng)用apply_tariff()之后,它必須將結(jié)果附加到用于創(chuàng)建新DataFrame列的列表中。另外,還使用df.iloc [i]['date_time']執(zhí)行所謂的鏈?zhǔn)剿饕?,這通常會(huì)導(dǎo)致意外的結(jié)果。

這種方法的最大問題是計(jì)算的時(shí)間成本。對(duì)于8760行數(shù)據(jù),此循環(huán)花費(fèi)了3秒鐘。

接下來,一起看下優(yōu)化的提速方案。

pandas的優(yōu)點(diǎn)有哪些

使用 iterrows循環(huán)

第一種可以通過pandas引入iterrows方法讓效率更高。這些都是一次產(chǎn)生一行的生成器方法,類似scrapy中使用的yield用法。

.itertuples為每一行產(chǎn)生一個(gè)namedtuple,并且行的索引值作為元組的第一個(gè)元素。nametuple是Python的collections模塊中的一種數(shù)據(jù)結(jié)構(gòu),其行為類似于Python元組,但具有可通過屬性查找訪問的字段。

.iterrows為DataFrame中的每一行產(chǎn)生(index,series)這樣的元組。

在這個(gè)例子中使用.iterrows,我們看看這使用iterrows后效果如何。

>>> @timeit(repeat=3, number=100)  ... def apply_tariff_iterrows(df):  ...     energy_cost_list = []  ...     for index, row in df.iterrows():  ...         # 獲取用電量和時(shí)間(小時(shí))  ...         energy_used = row['energy_kwh']  ...         hour = row['date_time'].hour  ...         # 添加cost列表  ...         energy_cost = apply_tariff(energy_used, hour)  ...         energy_cost_list.append(energy_cost)  ...     df['cost_cents'] = energy_cost_list  ...  >>> apply_tariff_iterrows(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_iterrows` ran in average of 0.713 seconds.

這樣的語法更明確,并且行值引用中的混亂更少,因此它更具可讀性。

時(shí)間成本方面:快了近5倍!

但是,還有更多的改進(jìn)空間,理想情況是可以用pandas內(nèi)置更快的方法完成。

pandas的優(yōu)點(diǎn)有哪些

pandas的apply方法

我們可以使用.apply方法而不是.iterrows進(jìn)一步改進(jìn)此操作。pandas的.apply方法接受函數(shù)callables并沿DataFrame的軸(所有行或所有列)應(yīng)用。下面代碼中,lambda函數(shù)將兩列數(shù)據(jù)傳遞給apply_tariff():

>>> @timeit(repeat=3, number=100)  ... def apply_tariff_withapply(df):  ...     df['cost_cents'] = df.apply(  ...         lambda row: apply_tariff(  ...             kwh=row['energy_kwh'],  ...             hour=row['date_time'].hour),  ...         axis=1)  ...  >>> apply_tariff_withapply(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_withapply` ran in average of 0.272 seconds.

apply的語法優(yōu)點(diǎn)很明顯,行數(shù)少,代碼可讀性高。在這種情況下,所花費(fèi)的時(shí)間大約是iterrows方法的一半。

但是,這還不是“非??臁?。一個(gè)原因是apply()將在內(nèi)部嘗試循環(huán)遍歷Cython迭代器。但是在這種情況下,傳遞的lambda不是可以在Cython中處理的東西,因此它在Python中調(diào)用并不是那么快。

如果我們使用apply()方法獲取10年的小時(shí)數(shù)據(jù),那么將需要大約15分鐘的處理時(shí)間。如果這個(gè)計(jì)算只是大規(guī)模計(jì)算的一小部分,那么真的應(yīng)該提速了。這也就是矢量化操作派上用場(chǎng)的地方。

pandas的優(yōu)點(diǎn)有哪些

矢量化操作:使用.isin選擇數(shù)據(jù)

什么是矢量化操作?

如果你不基于一些條件,而是可以在一行代碼中將所有電力消耗數(shù)據(jù)應(yīng)用于該價(jià)格:df ['energy_kwh'] * 28,類似這種。那么這個(gè)特定的操作就是矢量化操作的一個(gè)例子,它是在pandas中執(zhí)行的最快方法。

但是如何將條件計(jì)算應(yīng)用為pandas中的矢量化運(yùn)算?

一個(gè)技巧是:根據(jù)你的條件,選擇和分組DataFrame,然后對(duì)每個(gè)選定的組應(yīng)用矢量化操作。

在下面代碼中,我們將看到如何使用pandas的.isin()方法選擇行,然后在矢量化操作中實(shí)現(xiàn)新特征的添加。在執(zhí)行此操作之前,如果將date_time列設(shè)置為DataFrame的索引,會(huì)更方便:

# 將date_time列設(shè)置為DataFrame的索引  df.set_index('date_time', inplace=True)  @timeit(repeat=3, number=100)  def apply_tariff_isin(df):      # 定義小時(shí)范圍Boolean數(shù)組      peak_hours = df.index.hour.isin(range(17, 24))      shoulder_hours = df.index.hour.isin(range(7, 17))      off_peak_hours = df.index.hour.isin(range(0, 7))     # 使用上面apply_traffic函數(shù)中的定義      df.loc[peak_hours, 'cost_cents'] = df.loc[peak_hours, 'energy_kwh'] * 28      df.loc[shoulder_hours,'cost_cents'] = df.loc[shoulder_hours, 'energy_kwh'] * 20      df.loc[off_peak_hours,'cost_cents'] = df.loc[off_peak_hours, 'energy_kwh'] * 12

我們來看一下結(jié)果如何。

>>> apply_tariff_isin(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_isin` ran in average of 0.010 seconds.

提示,上面.isin()方法返回的是一個(gè)布爾值數(shù)組,如下:

[False, False, False, ..., True, True, True]

布爾值標(biāo)識(shí)了DataFrame索引datetimes是否落在了指定的小時(shí)范圍內(nèi)。然后把這些布爾數(shù)組傳遞給DataFrame的.loc,將獲得一個(gè)與這些小時(shí)匹配的DataFrame切片。然后再將切片乘以適當(dāng)?shù)馁M(fèi)率,這就是一種快速的矢量化操作了。

上面的方法完全取代了我們最開始自定義的函數(shù)apply_tariff(),代碼大大減少,同時(shí)速度起飛。

運(yùn)行時(shí)間比Pythonic的for循環(huán)快315倍,比iterrows快71倍,比apply快27倍!

pandas的優(yōu)點(diǎn)有哪些

還能更快?

太刺激了,我們繼續(xù)加速。

在上面apply_tariff_isin中,我們通過調(diào)用df.loc和df.index.hour.isin三次來進(jìn)行一些手動(dòng)調(diào)整。如果我們有更精細(xì)的時(shí)間范圍,你可能會(huì)說這個(gè)解決方案是不可擴(kuò)展的。但在這種情況下,我們可以使用pandas的pd.cut()函數(shù)來自動(dòng)完成切割:

@timeit(repeat=3, number=100)  def apply_tariff_cut(df):      cents_per_kwh = pd.cut(x=df.index.hour,                             bins=[0, 7, 17, 24],                             include_lowest=True,                             labels=[12, 20, 28]).astype(int)      df['cost_cents'] = cents_per_kwh * df['energy_kwh']

上面代碼pd.cut()會(huì)根據(jù)bin列表應(yīng)用分組。

其中include_lowest參數(shù)表示第一個(gè)間隔是否應(yīng)該是包含左邊的。

這是一種完全矢量化的方法,它在時(shí)間方面是最快的:

>>> apply_tariff_cut(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_cut` ran in average of 0.003 seconds.

到目前為止,使用pandas處理的時(shí)間上基本快達(dá)到極限了!只需要花費(fèi)不到一秒的時(shí)間即可處理完整的10年的小時(shí)數(shù)據(jù)集。

但是,最后一個(gè)其它選擇,就是使用 NumPy,還可以更快!

pandas的優(yōu)點(diǎn)有哪些

使用Numpy繼續(xù)加速

使用pandas時(shí)不應(yīng)忘記的一點(diǎn)是Pandas的Series和DataFrames是在NumPy庫之上設(shè)計(jì)的。并且,pandas可以與NumPy陣列和操作無縫銜接。

下面我們使用NumPy的 digitize()函數(shù)更進(jìn)一步。它類似于上面pandas的cut(),因?yàn)閿?shù)據(jù)將被分箱,但這次它將由一個(gè)索引數(shù)組表示,這些索引表示每小時(shí)所屬的bin。然后將這些索引應(yīng)用于價(jià)格數(shù)組:

@timeit(repeat=3, number=100)  def apply_tariff_digitize(df):      prices = np.array([12, 20, 28])      bins = np.digitize(df.index.hour.values, bins=[7, 17, 24])      df['cost_cents'] = prices[bins] * df['energy_kwh'].values

與cut函數(shù)一樣,這種語法非常簡(jiǎn)潔易讀。

>>> apply_tariff_digitize(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_digitize` ran in average of 0.002 seconds.

0.002秒! 雖然仍有性能提升,但已經(jīng)很邊緣化了。

到此,相信大家對(duì)“pandas的優(yōu)點(diǎn)有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

分享文章:pandas的優(yōu)點(diǎn)有哪些
文章位置:http://aaarwkj.com/article38/jpdcsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管自適應(yīng)網(wǎng)站、響應(yīng)式網(wǎng)站關(guān)鍵詞優(yōu)化、App設(shè)計(jì)手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
国产一级黄色性生活片| 人妻少妇亚洲精品视频| 久久不卡高清免费av| 中文字幕乱码亚洲美女精品| 日本一区二区免费视频| 熟女自拍偷拍视频播放| 国产综合永久精品日韩鬼片| 日本中文字幕不卡在线一区二区| 亚洲午夜黄色生活片观看| 免费福利激情在线播放| 偷窥偷拍视频一区二区| 亚洲第一区二区国产精品| 午夜福利影片免费观看| 五月激情丁香婷婷色网| 加勒比久久精品网址系列| 亚洲国产视频中文字幕| 国产高潮呻吟久久av| 成人精品国产一区二区 | 一区二区日韩视频九一蜜桃| 麻豆午夜视频免费在线观看| 亚洲综合色婷婷在线影院| 亚洲欧美国产另类综合| 国产在线精品专区第一页| 未满十八禁止免费视频| 日本欧美精品一区二区三区| 成年人片免费在线观看| 欧美黄色一区在线观看| 亚洲高清有码在线观看| 亚洲1区2区中文字幕| 蜜臀视频在线观看免费| 亚洲欧美成人高清在线观看| 国产美女主播视频一区二区三区| 日本国产一区二区在线观看| 国产老熟女高潮视频| 丰满少妇被激烈的插进去| 一级丰满少妇av大片| 亚洲欧美综合伊人看片综合| 中文字幕乱码亚洲美女精品| 国产成+人+综合+亚洲专区| 日韩免费中文视频不卡| 激情av一区二区不卡|