国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

懶人秘籍:教你如何避免編寫pandas代碼

開發 前端 開發工具
在本文中,筆者首先展示了一個“如何避免”的例子,然后展示了一個正確的“如何使用”pandas來計算統計數據的方法。改進后,代碼更簡潔、易讀,執行更快。

Pandas在數據科學領域無需介紹,它提供高性能,易于使用的數據結構和數據分析工具。但是,在處理過多的數據時,單核上的Pandas就顯得心有余而力不足了,大家不得不求助于不同的分布式系統來提高性能。然而,提高性能的權衡常常伴隨著陡峭的學習曲線。

而大家都在盡可能地避免這種懸崖峭壁,結果可想而知,都轉向了如何避免編寫pandas代碼。

[[311697]]

在過去4年里,筆者一直使用pandas作為數據分析的主要工具。必須承認,“如何避免編寫pandas代碼”的大部分內容來自于使用pandas編程的起步階段。在進行代碼審閱時,筆者仍然看到許多經驗豐富的程序員在看一些熱門“如何避免使用”的帖子。

在本文中,筆者首先展示了一個“如何避免”的例子,然后展示了一個正確的“如何使用”pandas來計算統計數據的方法。改進后,代碼更簡潔、易讀,執行更快。報告時間的格式為: 831 ms ± 25.7 ms per loop,即平均831毫秒,標準偏差為25.7毫秒。每個代碼示例執行多次,以計算準確的執行時間。

和往常一樣,可以下載 JupyterNotebook并在電腦上試運行。

開始pandas游戲之旅,請閱讀如下資源:

  • 5個鮮為人知的pandas技巧
  • 使用pandas進行探索性數據分析

[[311698]]

來源:Pexels

設置

  1. from platform importpython_versionimport numpy as np 
  2. import pandas as pdnp.random.seed(42) # set the seed tomake examples repeatable 

樣本數據集

樣本數據集包含各個城市的預訂信息,是隨機的,唯一目的是展示樣本。

數據集有三列:

  • id表示唯一的標識
  • city表示預定的城市信息
  • booked perc表示特定時間預定的百分比

數據集有一萬條,這使速度改進更加明顯。注意,如果代碼以正確的pandas方式編寫,pandas可以利用DataFrames計算數百萬(甚至數十億)行的統計數據。

  1. size = 10000cities =["paris", "barcelona", "berlin", "newyork"]df = pd.DataFrame( 
  2.     {"city": np.random.choice(cities,sizesize=size), "booked_perc": np.random.rand(size)} 
  3. df["id"] = df.index.map(str) +"-" + df.city 
  4. dfdf = df[["id", "city", "booked_perc"]] 
  5. df.head() 

1. 如何避免對數據求和

[[311699]]

翻滾的熊貓/Reddit

來自Java世界的靈感,把“多行for循環”應用到了Python。

計算booked perc列的總和,把百分比加起來毫無意義,但無論如何,一起來試試吧,實踐出真知。

  1. %%timeitsuma = 0 
  2. for _, row in df.iterrows(): 
  3.     suma += row.booked_perc766ms ± 20.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 

更符合Python風格的方式來對列求和如下:

  1. %%timeitsum(booked_perc forbooked_perc in df.booked_perc)989 µs ± 18.5 µs per loop (mean ±std. dev. of 7 runs, 1000 loops each)%%timeitdf.booked_perc.sum()92µs ± 2.21 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) 

正如預期的那樣,第一個示例是最慢的——對一萬項求和幾乎需要1秒。第二個例子的速度之快令人驚訝。

正確的方法是使用pandas對數據進行求和(或對列使用任何其他操作),這是第三個示例——也是最快的!

2. 如何避免過濾數據

[[311700]]

玩耍的熊貓/Giphy

盡管在使用pandas之前,筆者已經很熟悉numpy,并使用for循環來過濾數據。求和時,還是可以觀察到性能上的差異。

  1. %%timeitsuma = 0 
  2. for _, row in df.iterrows(): 
  3.     if row.booked_perc <=0.5: 
  4.         suma += row.booked_perc831ms ± 25.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)%%timeitdf[df.booked_perc<= 0.5].booked_perc.sum()724 µs ± 18.8 µs per loop(mean ± std. dev. of 7 runs, 1000 loops each) 

正如預期的一樣,第二個例子比第一個例子快很多

如果加入更多的過濾器呢?只需把它們添加到括號里:

  1. %%timeitdf[(df.booked_perc <=0.5) & (df.city == 'new york')].booked_perc.sum()1.55ms ± 10.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

3. 如何避免訪問以前的值

[[311701]]

翻滾的熊貓/Giphy

你可能會說:好吧,但是如果需要訪問先前某一列的值呢,還是需要一個for循環。你錯了!

分別使用和不使用for循環來計算一行到另一行百分數的改變

  1. %%timeitfor i inrange(1, len(df)): 
  2.     df.loc[i,"perc_change"] =  (df.loc[i].booked_perc- df.loc[i - 1].booked_perc) / df.loc[i- 1].booked_perc7.02 s ± 24.4 ms per loop (mean ± std. dev. of 7runs, 1 loop each)%%timeitdf["perc_change"] = df.booked_perc.pct_change()586µs ± 17.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

同樣,第二個例子比第一個使用for循環的例子快得多。

pandas有許多函數可以根據以前的值計算統計數據(例如shift函數對值進行移位)。這些函數接受periods參數,可以在計算中包含以前值的數量。

4. 如何避免使用復雜的函數

[[311702]]

來源:墜落的熊貓(國家地理)Giphy

有時需要在DataFrame中使用復雜函數(有多個變量的函數)。讓我們將從紐約的booking_perc兩兩相乘,其他設置為0并且把這列命名為sales_factor。

筆者首先想到的是使用iterrows的for循環。

  1. %%timeitfor i, row in df.iterrows(): 
  2.     if row.city =='new york': 
  3.         df.loc[i, 'sales_factor'] =row.booked_perc * 2 
  4.     else: 
  5.         df.loc[i, 'sales_factor'] =03.58 s ± 48.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 

一個更好的辦法是直接在DataFrame上使用函數。

  1. %%timeitdef calculate_sales_factor(row): 
  2.     if row.city =='new york': 
  3.         return row.booked_perc* 2 
  4.     return 0df['sales_factor'] =df.apply(calculate_sales_factor, axis=1)165 ms ± 2.48 ms per loop(mean ± std. dev. of 7 runs, 10 loops each) 

最快的方法是使用pandas過濾器直接計算函數值。

  1. %%timeit df.loc[df.city== 'new york', 'sales_factor'] = df[df.city == 'newyork'].booked_perc * 2 
  2. df.sales_factor.fillna(0, inplace=True)3.03 ms ± 85.5 µsper loop (mean ± std. dev. of 7 runs, 100 loops each) 

可以看到從第一個例子到最后一個的加速過程。

當解決有3個及3個以上變量的函數時,可以把它分解為多個pandas表達式。這比運用函數更快。

  1. Eg: f(x, a, b) = (a + b) * x 
  2. df['a_plus_b'] = df['a'] +df['b'] 
  3. df['f'] = df['a_plus_b'] * df['x'] 

5. 如何避免對數據進行分組

[[311703]]

蹭癢熊貓/Giphy

現在可以看到,在開始使用pandas之前,筆者更多依賴于for循環。至于對數據進行分組,如果充分發揮pandas的優勢,可以減少代碼行數。

要計算如下數據:

  • 一個城市的平均sales factor
  • 一個城市的首次預定id
  1. %%timeit avg_by_city = {} 
  2. count_by_city = {} 
  3. first_booking_by_city = {}for i, row in df.iterrows(): 
  4.     city = row.city 
  5.     if city in avg_by_city: 
  6.         avg_by_city[city] += row.sales_factor 
  7.         count_by_city[city] += 1 
  8.     else: 
  9.         avg_by_city[city] = row.sales_factor 
  10.         count_by_city[city] = 1 
  11.         first_booking_by_city[city] =row['id']for city, _ in avg_by_city.items(): 
  12.     avg_by_city[city] /=count_by_city[city]878 ms ± 21.4 ms per loop (mean ± std. dev. of 7 runs, 1 loopeach) 

Pandas有分組操作所以不必在DataFrame上進行迭代,pandas的分組操作和SQL的GROUP BY語句一樣的。

  1. %%timeitdf.groupby('city').sales_factor.mean() 
  2. df.groupby('city').sales_factor.count() 
  3. df.groupby('city').id.first()3.05 ms ± 65.3 µs per loop(mean ± std. dev. of 7 runs, 100 loops each)%%timeitdf.groupby("city").agg({"sales_factor":["mean", "count"], "id": "first"})4.5ms ± 131 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

驚奇的是,第三個例子不是最快的,但比第二個例子更簡潔。筆者建議,如果需要加速的代碼,請用第二種方法。

[[311704]]

快樂的熊貓/Giphy

最后,小芯的建議是:如果需要使用pandas編寫for循環,那一定存在一種更好的編寫方式。

會存在一些計算量很大的函數,即使上述的優化方法也會無效。那么我們就需要使用最后手段:Cython和Numba。

大家一起來試試這些方法吧,一定會有意想不到的收獲~

 

責任編輯:趙寧寧 來源: 讀芯術
相關推薦

2010-12-03 11:27:47

IT職場

2011-07-15 16:20:07

云計算云服務提供商

2015-09-21 13:04:01

創業秘籍

2016-04-08 09:24:01

脆弱代碼更新

2023-01-09 15:16:17

2011-06-07 15:34:15

2024-07-09 09:36:17

2020-02-28 09:26:54

PythonGo語言C語言

2022-06-20 16:18:25

MySQL安全免密碼輸入

2011-07-21 09:33:53

2015-01-28 14:30:31

android代碼

2021-06-08 09:35:11

Cleaner ReaReact開發React代碼

2022-12-15 10:52:26

代碼開發

2022-06-27 06:23:23

代碼編程

2012-07-11 10:51:37

編程

2010-02-05 16:49:05

編寫Android 代

2012-03-15 13:36:51

云計算JavaSpring框架

2011-10-26 09:52:17

云計算編碼

2017-09-14 12:45:27

2019-10-17 09:57:08

Python設計電腦
點贊
收藏

51CTO技術棧公眾號

国产精品乱码久久久久久| 国语一区二区三区| 亚洲一区二区三区四区视频| 国产精品久久久久婷婷| japanese色系久久精品| 亚洲国产精品三区| 久久人人爽人人爽人人片av高请| 国产午夜精品久久久久久免费视| 亚洲精品黑牛一区二区三区| 成人网18免费网站在线| 欧美中文在线字幕| 精品高清美女精品国产区| 欧美成人精品一区二区三区在线看| 天堂在线免费av| 黄色一区三区| 日韩精品极品视频免费观看| 福利视频网站一区二区三区| 精品国产一区二| 色偷偷福利视频| 亚洲一区二区三区777| 在线播放国产精品二区一二区四区| 奇米四色…亚洲| 久久精品嫩草影院| 欧美人与禽zozo性伦| 亚洲精品美女| 欧美巨大丰满猛性社交| 激情伊人五月天| 午夜免费在线观看精品视频| 欧美性jizz18性欧美| 久久av一区二区三区| 丁香六月综合| 涩涩视频免费网站| 国产原创精品| 一区二区欧美激情| 亚洲人xxxx| 国产欧美一级| 日本一区二区中文字幕| 日韩加勒比系列| 麻豆av一区二区| 最好看的2019年中文视频| 亚洲人成在线播放网站岛国| 激情久久久久久| 日韩一级二级| 国产美女在线播放| 亚洲人成网站在线播放2019| 欧美国产欧美亚洲国产日韩mv天天看完整| 午夜婷婷国产麻豆精品| 美国十次了思思久久精品导航| 亚洲精品不卡在线观看| 国产在线高清| 欧洲精品一区二区三区久久| 国产精品丝袜久久久久久高清| 日韩午夜小视频| 欧美国产综合一区二区| 亚洲精品欧洲| 日韩欧美中文在线观看| 国产在线免费观看| 成人av一级片| 成人性色av| 欧美乱大交xxxxx另类电影| 欧美亚洲动漫制服丝袜| 91视视频在线观看入口直接观看www| 天天揉久久久久亚洲精品| 欧美a级在线观看| av三级在线播放| 黄色一级视频播放| 91免费视频国产| 久久精品最新地址| 欧美日韩一区二区三区四区 | 天堂а√在线8种子蜜桃视频 | 91免费版在线| 亚洲成色精品| 久久9999免费视频| 韩国中文字幕在线| 欧美日韩在线成人| 日本黑人久久| 国产成人综合av| 尤物精品国产第一福利三区| 色94色欧美sute亚洲13| 久久精品一区二区| 蜜桃久久av一区| 中文字幕一区二区三区乱码图片| 亚洲男男av| 日本三级在线观看网站| 最近最新中文字幕在线| 国产a视频免费观看| 亚洲欧美国产精品桃花| 亚洲xxxxx性| 97视频在线观看免费高清完整版在线观看 | 黄色羞羞视频在线观看| 日本h片在线看| 日日摸天天爽天天爽视频| 亚洲综合av一区| 国产精品美女久久久久av福利| 性欧美长视频免费观看不卡| 亚洲欧洲日韩国产| 91精品国产色综合久久ai换脸 | 欧美亚洲第一页| 中文字幕9999| 日韩欧美中文字幕制服| 午夜视频在线观看一区二区| 久久久美女毛片| 精品一区二区三区在线播放视频| 伊人情人综合网| 精品高清在线| 国产精品一区二区中文字幕| 国产极品一区| 麻豆mv在线看| 黄页网站大全在线免费观看| 自拍视频在线| 男操女在线观看| 2023欧美最顶级a∨艳星| 欧美伦理片在线看| 欧美一级免费播放| 妞干网这里只有精品| 亚洲成人自拍视频| 欧美性bbwbbwbbwhd| 国产精品久久久久久久久久久久冷| 国产精品69久久| 97成人超碰免| 久久人人爽人人爽人人片av高请 | 日韩美女主播在线视频一区二区三区| 国产一区二区三区网| 日本xxxx黄色| 正在播放一区二区三区| 欧美日韩午夜爽爽| 激情小视频在线观看| 国产鲁鲁视频在线观看免费| 国产精品日韩欧美一区二区三区| 亚洲一卡二卡三卡| 人妖精品videosex性欧美| 国产亚洲视频在线| 欧洲精品在线视频| 欧美一卡二卡在线| 中文字幕欧美三区| 91成人免费网站| 国产精品一二三四| 国产欧美在线观看免费| 精品久久久久av| 亚洲影视中文字幕| 99re视频这里只有精品| 一区二区三区在线观看国产| 国产高清免费在线| 国产一区红桃视频| 国产精品精品软件视频| 中文字幕欧美日韩| 欧美日韩你懂得| 亚洲情趣在线观看| 久久视频在线观看| 欧美一区久久久| 国产激情欧美| a天堂中文在线官网在线| 日韩欧美中文一区| 亚洲第一伊人| 亚洲婷婷噜噜| 日本一道在线观看| 日韩在线免费av| 中文字幕一区二区视频| 西野翔中文久久精品字幕| 黄动漫网站在线观看| 操一操视频一区| 日韩欧美一级二级| 粉嫩一区二区三区性色av| 国产精品亚洲四区在线观看| h片免费观看| 国产精品欧美久久| 日韩免费视频一区| aaa国产一区| 日韩电影二区| av毛片在线免费| 无码人妻丰满熟妇区96| 国产成人综合亚洲| 6080亚洲精品一区二区| 99久久精品国产一区二区三区| 思热99re视热频这里只精品| 免费黄色片在线观看| 在线视频福利一区| 欧美高清在线观看| 日韩欧美亚洲范冰冰与中字| 老司机精品视频一区二区三区| 精品国产一区二| 三级理论午夜在线观看| 成人手机视频在线| 奇米4444一区二区三区| 欧美美女bb生活片| 99re成人精品视频| 午夜视频一区| 亚洲欧美一级| 亚洲精品传媒| 色欲av无码一区二区人妻| 亚洲sss综合天堂久久| 尤物九九久久国产精品的分类| 亚洲综合图片区| 狠狠色狠狠色综合系列| 最新国产一区| 国产日韩另类视频一区| 久久久久久久影视| 激情五月亚洲色图| 亚洲成人a**址| 成人xxxxx|