精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

再見for循環!pandas提速315倍~

開發 后端
本次東哥介紹幾個常見的提速方法,一個比一個快,了解pandas本質,才能知道如何提速。

 for是所有編程語言的基礎語法,初學者為了快速實現功能,依懶性較強。但如果從運算時間性能上考慮可能不是特別好的選擇。

本次東哥介紹幾個常見的提速方法,一個比一個快,了解pandas本質,才能知道如何提速。

下面是一個例子,數據獲取方式見文末。 

  1. >>> import pandas as pd  
  2. # 導入數據集  
  3. >>> df = pd.read_csv('demand_profile.csv')  
  4. >>> df.head()  
  5.      date_time  energy_kwh  
  6. 0  1/1/13 0:00       0.586  
  7. 1  1/1/13 1:00       0.580  
  8. 2  1/1/13 2:00       0.572  
  9. 3  1/1/13 3:00       0.596  
  10. 4  1/1/13 4:00       0.592 

基于上面的數據,我們現在要增加一個新的特征,但這個新的特征是基于一些時間條件生成的,根據時長(小時)而變化,如下:

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

  1. def apply_tariff(kwh, hour):  
  2.     """計算每個小時的電費"""      
  3.     if 0 <= hour < 7:  
  4.         rate = 12  
  5.     elif 7 <= hour < 17:  
  6.         rate = 20  
  7.     elif 17 <= hour < 24:  
  8.         rate = 28  
  9.     else:  
  10.         raise ValueError(f'Invalid hour: {hour}')  
  11.     return rate * kwh 

然后使用for循環來遍歷df,根據apply函數邏輯添加新的特征,如下: 

  1. >>> # 不贊同這種操作  
  2. >>> @timeit(repeat=3number=100 
  3. ... def apply_tariff_loop(df): 
  4. ...     """用for循環計算enery cost,并添加到列表"""  
  5. ...     energy_cost_list = []  
  6. ...     for i in range(len(df)):  
  7. ...         # 獲取用電量和時間(小時)  
  8. ...         energy_used = df.iloc[i]['energy_kwh']  
  9. ...         hour = df.iloc[i]['date_time'].hour  
  10. ...         energy_cost = apply_tariff(energy_used, hour)  
  11. ...         energy_cost_list.append(energy_cost)  
  12. ...     df['cost_cents'] = energy_cost_list  
  13. ...   
  14. >>> apply_tariff_loop(df)  
  15. Best of 3 trials with 100 function calls per trial:  
  16. Function `apply_tariff_loop` ran in average of 3.152 seconds. 

對于那些寫Pythonic風格的人來說,這個設計看起來很自然。然而,這個循環將會嚴重影響效率。原因有幾個:

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

其次,它使用不透明對象范圍(0,len(df))循環,然后再應用apply_tariff()之后,它必須將結果附加到用于創建新DataFrame列的列表中。另外,還使用df.iloc [i]['date_time']執行所謂的鏈式索引,這通常會導致意外的結果。

這種方法的最大問題是計算的時間成本。對于8760行數據,此循環花費了3秒鐘。

接下來,一起看下優化的提速方案。

[[381980]]

使用 iterrows循環

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

.itertuples為每一行產生一個namedtuple,并且行的索引值作為元組的第一個元素。nametuple是Python的collections模塊中的一種數據結構,其行為類似于Python元組,但具有可通過屬性查找訪問的字段。

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

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

  1. >>> @timeit(repeat=3number=100 
  2. ... def apply_tariff_iterrows(df):  
  3. ...     energy_cost_list = []  
  4. ...     for index, row in df.iterrows():  
  5. ...         # 獲取用電量和時間(小時)  
  6. ...         energy_used = row['energy_kwh']  
  7. ...         hour = row['date_time'].hour  
  8. ...         # 添加cost列表  
  9. ...         energy_cost = apply_tariff(energy_used, hour)  
  10. ...         energy_cost_list.append(energy_cost)  
  11. ...     df['cost_cents'] = energy_cost_list  
  12. ...  
  13. >>> apply_tariff_iterrows(df)  
  14. Best of 3 trials with 100 function calls per trial:  
  15. Function `apply_tariff_iterrows` ran in average of 0.713 seconds. 

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

時間成本方面:快了近5倍!

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

[[381981]]

pandas的apply方法

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

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

apply的語法優點很明顯,行數少,代碼可讀性高。在這種情況下,所花費的時間大約是iterrows方法的一半。

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

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

 

[[381982]]

矢量化操作:使用.isin選擇數據

什么是矢量化操作?

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

但是如何將條件計算應用為pandas中的矢量化運算?

一個技巧是:根據你的條件,選擇和分組DataFrame,然后對每個選定的組應用矢量化操作。

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

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

我們來看一下結果如何。 

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

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

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

布爾值標識了DataFrame索引datetimes是否落在了指定的小時范圍內。然后把這些布爾數組傳遞給DataFrame的.loc,將獲得一個與這些小時匹配的DataFrame切片。然后再將切片乘以適當的費率,這就是一種快速的矢量化操作了。

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

運行時間比Pythonic的for循環快315倍,比iterrows快71倍,比apply快27倍!

[[381983]]

還能更快?

太刺激了,我們繼續加速。

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

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

上面代碼pd.cut()會根據bin列表應用分組。

其中include_lowest參數表示第一個間隔是否應該是包含左邊的。

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

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

到目前為止,使用pandas處理的時間上基本快達到極限了!只需要花費不到一秒的時間即可處理完整的10年的小時數據集。

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

[[381984]]

使用Numpy繼續加速

使用pandas時不應忘記的一點是Pandas的Series和DataFrames是在NumPy庫之上設計的。并且,pandas可以與NumPy陣列和操作無縫銜接。

下面我們使用NumPy的 digitize()函數更進一步。它類似于上面pandas的cut(),因為數據將被分箱,但這次它將由一個索引數組表示,這些索引表示每小時所屬的bin。然后將這些索引應用于價格數組: 

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

與cut函數一樣,這種語法非常簡潔易讀。 

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

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

 

責任編輯:龐桂玉 來源: AI科技大本營
相關推薦

2021-01-13 11:13:46

ExcelPandas代碼

2019-09-02 15:12:46

Python 開發數據分析

2020-09-27 11:15:37

可視化PandasPython

2024-01-03 15:50:33

Python循環測試

2023-12-10 14:06:04

數據庫pythonduckdb

2019-08-27 17:32:10

數據處理PandasPython

2023-01-05 11:34:46

PandasMerge方法

2016-10-08 16:02:37

WIFIMegaMIMO系統

2016-03-21 10:16:06

RedisSpark大數據處理

2013-02-28 10:35:59

hadoop大數據Hortonworks

2022-08-09 09:10:31

TaichiPython

2013-09-24 09:40:41

Java圖形加速

2016-02-18 09:36:52

光纖wifi

2009-12-16 11:43:28

卡巴斯基NVIDIA Tesl

2021-09-08 08:00:00

PyPolars數據開源

2024-10-16 09:34:50

2025-08-22 14:48:27

2022-12-29 11:37:51

Python循環向量化

2013-10-17 09:34:56

企業郵箱海外訪問提速

2020-05-01 12:35:31

C++Python編程
點贊
收藏

51CTO技術棧公眾號

成人av手机在线观看| 国产a久久精品一区二区三区 | 国产精品免费一区二区三区在线观看 | 无人区乱码一区二区三区| 亚洲国产精品一区二区尤物区| 久久久久久久久久久久久9999| 中文字幕a级片| 午夜国产精品视频免费体验区| 精品亚洲男同gayvideo网站| 无尽裸体动漫2d在线观看| 草美女在线观看| 国产精品美日韩| 国产一区二区高清不卡| 亚洲影视一区二区| 国产一区二区三区久久| 久久亚洲精品毛片| 欧美成人国产精品一区二区| 亚洲91网站| 欧美日韩亚洲综合一区 | rebdb初裸写真在线观看| 国产欧美日韩视频在线观看| 国产精品xxxx| 一卡二卡在线观看| 日韩av中文字幕一区二区三区| 欧美国产极速在线| 四虎影视一区二区| 少妇精品久久久一区二区三区| 日韩欧美中文字幕精品| 一本岛在线视频| 成人福利av| 亚洲超碰97人人做人人爱| 日韩最新中文字幕| 婷婷在线视频| 国产日韩欧美亚洲| 欧美另类一区| 日韩精品视频无播放器在线看 | 成人性生交大免费看| 99久热这里只有精品视频免费观看| 欧美日韩精品免费| 婷婷激情四射五月天| 中日韩脚交footjobhd| 亚洲综合色婷婷| 警花观音坐莲激情销魂小说| 在线观看17c| 欧美一级高清片| 成人av午夜影院| 国产日韩综合av| 香港成人在线视频| 成人欧美一区二区三区视频xxx| 日韩精选在线观看| 性xx色xx综合久久久xx| 97激碰免费视频| 亚洲一区二区91| 亚洲无线视频| 性欧美激情精品| 日韩av在线播| 亚洲精品视频91| av成人亚洲| 在线观看成人小视频| 日韩 欧美 高清| 亚洲一区二区91| 豆国产97在线 | 亚洲| 91成人在线精品视频| 日韩欧美一区电影| www激情五月| 天堂精品久久久久| 精品国精品国产| 99精品一区二区三区无码吞精| 波多野结衣欧美| 亚洲激情视频网| 美女100%无挡| 成人一区而且| 欧美精品一区三区| 免费看日韩毛片| 日韩黄色一级片| 国产九九精品视频| 性生交生活影碟片| 91麻豆精品一区二区三区| 日韩av图片| www在线视频| 午夜久久久久久久久久一区二区| 色欲色香天天天综合网www| 亚洲午夜天堂| 91精品国产欧美一区二区| 亚洲精品国产成人av在线| 国产91久久精品一区二区| 精品激情国产视频| 国产精品一区二区6| 老**午夜毛片一区二区三区| 成人免费淫片视频软件| 天堂网av在线播放| 中国av一区二区三区| 久久这里只有精品18| gogo亚洲高清大胆美女人体| 欧美91视频| 尤物九九久久国产精品的分类| 国产综合在线看| 国产又黄又嫩又滑又白| 伊人久久大香线蕉av不卡| 色偷偷av一区二区三区乱| 天堂资源在线播放| 美女视频黄频大全不卡视频在线播放 | 狠狠爱一区二区三区| av网页在线| 亚洲va欧美va天堂v国产综合| 免费一级特黄录像| 国产精品极品| 久久久99久久精品女同性| 九九热在线免费观看| 国产老肥熟一区二区三区| 欧美二区三区| heyzo高清在线| 欧美日韩一区二区三区不卡| 国产麻豆天美果冻无码视频| 亚洲成av人片乱码色午夜| 欧美中文字幕第一页| www.天堂av.com| 国产精品精品国产色婷婷| www.亚洲天堂网| 97久久综合区小说区图片区 | 丁香花视频在线观看| 欧美性受极品xxxx喷水| 国产精品无码在线| 亚洲欧美伊人| 亚洲free嫩bbb| 尤物在线视频| 日本久久精品电影| 国产精品无码在线| 国产刺激高潮av| 精品动漫一区| 95av在线视频| 免费av在线| 欧美日韩午夜在线视频| 色哟哟精品观看| 亚洲制服av| 国产自产在线视频一区| ririsao久久精品一区| 久久伊99综合婷婷久久伊| 欧美成人一品| 精品亚洲国产视频| 精品肉丝脚一区二区三区| 久久99国产精品尤物| 欧美一区午夜精品| 欧美视频亚洲图片| 久久五月天小说| 国产欧美久久一区二区| 国产免费视频在线| 欧美午夜精品在线| 丰满少妇在线观看资源站| 国产色综合网| 久久久久一区二区三区| 日韩精品极品| 日韩不卡在线观看| 久久国产视频一区| 久久久精品免费观看| 久热免费在线观看| 清纯唯美日韩| 91九色视频导航| 直接在线观看的三级网址| 日韩精品一区国产麻豆| 免费在线观看黄色av| 成人av网站在线| 狠狠爱免费视频| 国产一区二区三区四区五区传媒| 国产精品9999| 一级日本在线| 欧美一区二区三区在线观看| 欧美黄片一区二区三区| 本田岬高潮一区二区三区| 丰满少妇久久久| 少妇一区二区视频| 亚洲aⅴ男人的天堂在线观看| 老子影院午夜伦不卡大全| 亚洲精品一区二区口爆| 亚洲18女电影在线观看| 无遮挡aaaaa大片免费看| 久久在线精品| 26uuu成人| 第一区第二区在线| 国产精品福利在线观看| 黄色免费网站在线| 亚洲国产欧美一区二区三区同亚洲 | 国产欧美一区二区精品忘忧草| 簧片在线免费看| 亚洲欧洲美洲一区二区三区| 国产一区二区不卡视频| 欧美影视资讯| 色综合久久悠悠| 久草视频在线看| 91麻豆精品国产91| 久草手机在线视频| 亚洲人精品午夜| 欧美熟妇精品黑人巨大一二三区| 美日韩一区二区| 欧美精品卡一卡二| 久久一本综合| 国产98在线|日韩| 全球最大av网站久久| 欧美激情精品久久久久| av影片在线看| 亚洲国产精品va在线看黑人| 亚洲系列第一页| 精品国产成人在线| 国产精品精品软件男同| 久久综合国产精品| 久草福利在线观看| 麻豆精品久久精品色综合| 日韩一级性生活片| 91久久久精品国产| 日本午夜精品一区二区三区| 亚洲国产中文在线| 国产精品一区二区三| 午夜影院在线播放| 欧美激情网站在线观看| 精品国产白色丝袜高跟鞋| 亚洲人成五月天| 丰满熟妇乱又伦| 欧美一区二区三区在线看| 色婷婷久久综合中文久久蜜桃av| 午夜精品久久久久久久 | 欧美性xxxx极品hd满灌| 99精品久久久久| 国产精品网友自拍| 亚洲国产日韩一区无码精品久久久| 国产成人精品综合在线观看| 国内外成人免费在线视频| 香蕉av777xxx色综合一区| 少妇一晚三次一区二区三区| 亚洲成人免费| 亚洲一一在线| 日韩国产欧美| 亚洲高清视频一区| 精品久久综合| 日韩中文字幕一区| 久久av电影| 欧美午夜精品久久久久免费视 | 精品一区二区久久| 日韩一级免费片| 日韩国产一区二| 可以免费在线看黄的网站| 先锋影音久久久| 成人在线激情网| 日本中文一区二区三区| 天天碰免费视频| 美女脱光内衣内裤视频久久网站| 免费黄色一级网站| 免费国产亚洲视频| xxx国产在线观看| 激情国产一区二区| 深夜福利网站在线观看| 国产一区二区三区综合| 精产国品一二三区| 国产精品99久久久久久久女警 | 中文字幕66页| 黑人精品欧美一区二区蜜桃| 看看黄色一级片| 国产福利91精品| 制服丝袜在线第一页| av福利精品导航| 美女被到爽高潮视频| 国产精品丝袜久久久久久app| 九九热久久免费视频| 最新不卡av在线| 久久久91视频| 黄色精品一区二区| 九九热最新视频| 欧美精品亚洲二区| 亚洲福利在线观看视频| 亚洲第一av网| 高清国产福利在线观看| 日韩在线观看视频免费| 2020国产在线视频| 97av在线影院| 欧美一级淫片aaaaaa| 国产69精品久久| 欧美挠脚心视频网站| 国产精品久久久久毛片| 日韩免费看网站| 天天射天天色天天干| 亚洲人高潮女人毛茸茸| 午夜视频在线看| 欧美久久久精品| 天堂电影一区| 91九色视频导航| 欧美一级做a| 日本高清不卡视频| 中文字幕免费在线看| 日韩欧美一级精品久久| 亚洲 欧美 精品| 久久精品99久久久久久久久| 欧美卡一卡二| 国产精品高潮呻吟久久av黑人| 国产精品视频一区视频二区| 国内一区在线| 国产欧美日韩影院| 妺妺窝人体色www看人体| 日一区二区三区| 激情综合激情五月| 国产精品久久久久久久久动漫| 九九免费精品视频| 欧美伊人久久大香线蕉综合69| 亚洲第一天堂在线观看| 中文字幕视频在线免费欧美日韩综合在线看| caoporn免费在线视频| 欧美一区在线直播| 天堂久久一区| 欧美亚洲丝袜| 国产精品av久久久久久麻豆网| www.色偷偷.com| 91蜜桃免费观看视频| 国产suv一区二区三区| 在线国产电影不卡| 色一情一乱一区二区三区| 久久伊人精品视频| 精品网站在线| 久久久久久久久久码影片| 午夜日韩电影| 久久6免费视频| 亚洲国产高清aⅴ视频| 天天操天天干视频| 欧美精品一区在线观看| 黄色一级大片在线免费看产| 国产精品成人久久久久| 亚洲区小说区图片区qvod| 久久国产午夜精品理论片最新版本| 精品一区二区三区在线播放视频| 亚洲区免费视频| 精品国产999| 亚洲欧美丝袜中文综合| 久久久噜噜噜久久中文字免| 国产欧美视频在线| 在线视频亚洲自拍| 免费av网站大全久久| 欧美成人国产精品一区二区| 精品国产福利在线| 天天射天天色天天干| 国语自产精品视频在线看抢先版图片 | 日本福利片在线| 国产69精品久久久久久| 国内精品国产成人国产三级粉色| 久久这里只有精品8| 国产91丝袜在线观看| 国产小视频在线观看免费| 精品日韩一区二区三区 | 国产精品久久77777| 狠狠综合久久av一区二区蜜桃| www.日日操| 国产精品毛片高清在线完整版| 五月婷婷六月婷婷| 在线a欧美视频| 色综合久久久| 中文字幕精品在线播放| 国产精品1区二区.| 国产真实乱人偷精品视频| 亚洲成avwww人| 理论不卡电影大全神| 欧美日韩一区综合| 青草av.久久免费一区| 天堂а√在线中文在线鲁大师| 在线电影一区二区三区| 青春草在线视频| 黄色国产精品一区二区三区| 美女精品在线| 国产又粗又猛又爽又黄的视频小说| 欧美日韩国产精品成人| а√中文在线8| 久久99久久精品国产| 久久久久国产精品一区二区| 婷婷综合在线视频| 欧美一区二区三区白人| 岛国av免费在线观看| 日本精品视频一区| 国产在线视视频有精品| 国产对白videos麻豆高潮| 亚洲人成电影在线观看天堂色| 国产在视频一区二区三区吞精| 国产三级中文字幕| 9久草视频在线视频精品| 无码人妻一区二区三区免费| 日韩在线视频免费观看高清中文| 日韩视频在线直播| 黄色片一级视频| 亚洲欧美日韩在线不卡| 亚洲色大成网站www| 国产精品视频内| 雨宫琴音一区二区在线| 国产精品国产三级国产专业不| 91精品国产免费久久综合| 在线观看福利电影| 国产免费一区二区三区四在线播放| a美女胸又www黄视频久久| 一级特黄aaa大片| 热re91久久精品国99热蜜臀| 久久一级电影| 播金莲一级淫片aaaaaaa| 91精品福利在线一区二区三区| 三妻四妾的电影电视剧在线观看 | 一女三黑人理论片在线| 欧美日本一区二区三区四区| av福利导福航大全在线|