偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Pandas圖鑒之一:Pandas vs Numpy

數(shù)據(jù)庫 其他數(shù)據(jù)庫
如果你100%?確定你的列中沒有缺失值,那么使用df.column.values.sum()?而不是df.column.sum()?來獲得x3-x30?的性能提升是有意義的。在存在缺失值的情況下,Pandas的速度是相當(dāng)不錯(cuò)的,對(duì)于巨大的數(shù)組(超過10?個(gè)元素)來說,甚至比NumPy還要好。

圖片圖片

Pandas[1]是用Python分析數(shù)據(jù)的工業(yè)標(biāo)準(zhǔn)。只需敲幾下鍵盤,就可以加載、過濾、重組和可視化數(shù)千兆字節(jié)的異質(zhì)信息。它建立在NumPy庫的基礎(chǔ)上,借用了它的許多概念和語法約定,所以如果你對(duì)NumPy很熟悉,你會(huì)發(fā)現(xiàn)Pandas是一個(gè)相當(dāng)熟悉的工具。即使你從未聽說過NumPy,Pandas也可以讓你在幾乎沒有編程背景的情況下輕松拿捏數(shù)據(jù)分析問題。

Pandas 給 NumPy 數(shù)組帶來的兩個(gè)關(guān)鍵特性是:

異質(zhì)類型 —— 每一列都允許有自己的類型

索引 —— 提高指定列的查詢速度

事實(shí)證明,這些功能足以使Pandas成為Excel和數(shù)據(jù)庫的強(qiáng)大競爭者。

Polars[2]是Pandas最近的轉(zhuǎn)世(用Rust編寫,因此速度更快,它不再使用NumPy的引擎,但語法卻非常相似,所以學(xué)習(xí) Pandas 后對(duì)學(xué)習(xí) Polars 幫助非常大。

Pandas 圖鑒系列文章由四個(gè)部分組成:

Part 1. Motivation

Part 2. Series and Index

Part 3. DataFrames

Part 4. MultiIndex

我們將拆分成四個(gè)部分,依次呈現(xiàn)~建議關(guān)注和星標(biāo)@公眾號(hào):數(shù)據(jù)STUDIO,精彩內(nèi)容等你來~

Part 1 Motivation

假設(shè)你有一個(gè)文件,里面有一百萬行逗號(hào)分隔的數(shù)值,像這樣:

圖片圖片

冒號(hào)后的空格僅用于說明問題。通常情況下,沒有空格。

而你需要用NumPy對(duì) "哪些城市的面積超過450平方公里,人口低于1000萬" 這樣的基本問題給出答案。

通常情況下,不推薦使用將整個(gè)表送入NumPy數(shù)組的粗暴解決方案。NumPy數(shù)組是同質(zhì)類型的(=所有的值都有相同的類型),所以所有的字段都會(huì)被解譯為字符串,在比大小方面也不盡人意。

雖然NumPy也有結(jié)構(gòu)化數(shù)組和記錄數(shù)組,允許不同類型的列,但它們主要是為了與C代碼對(duì)接。當(dāng)用于一般用途時(shí),它們有以下缺點(diǎn):

不太直觀(例如,你將面臨到處都是<f8和<U8這樣的常數(shù));

與普通的NumPy數(shù)組相比,有一些性能問題;

在內(nèi)存中連續(xù)存儲(chǔ),所以每增加或刪除一列都需要對(duì)整個(gè)數(shù)組進(jìn)行重新分配;

仍然缺乏Pandas DataFrames的很多功能。

如果將每一列存儲(chǔ)為一個(gè)單獨(dú)的NumPy向量。之后可以把它們包成一個(gè)dict,這樣,如果以后需要增加或刪除一兩行,就可以更容易恢復(fù) "數(shù)據(jù)庫" 的完整性。下面是它的樣子:

圖片圖片

至此我們已經(jīng)邁出了重新實(shí)現(xiàn)Pandas的第一步。

現(xiàn)在,下面有幾個(gè)例子來說明Pandas可以做一些NumPy不能做的事情(或者需要付出巨大努力才能完成)。

Pandas Showcase

如下表所示:

圖片圖片

它描述了一個(gè)網(wǎng)上商店的多樣化產(chǎn)品線,總共有四種不同的產(chǎn)品。與前面的例子相比,它既可以用NumPy數(shù)組表示,也可以用Pandas DataFrame表示,效果同樣不錯(cuò)。但來看看它的一些常見操作。

1.Sorting

用Pandas按列排序更有可讀性,你可以看到如下:

圖片圖片

這里argsort(a[:,1])計(jì)算了使a的第二列以升序排序的排列方式,然后外部的a[...]相應(yīng)地重新排列a的行。Pandas可以在一個(gè)步驟中完成。

2.按columns排序

如果我們需要使用權(quán)重列按價(jià)格列打破平局進(jìn)行排序,那么對(duì)于NumPy來說卻有些糟糕:

圖片圖片

如果選擇使用NumPy,我們首先按重量排序,然后再按價(jià)格應(yīng)用第二次排序。一個(gè)穩(wěn)定的排序算法可以保證第一次排序的結(jié)果在第二次排序時(shí)不會(huì)丟失。用NumPy還有其他方法,但都不如用Pandas簡單和優(yōu)雅。

3.增加一列

從語法和架構(gòu)上來說,用Pandas添加列要好得多:

圖片圖片

Pandas不需要像NumPy那樣為整個(gè)數(shù)組重新分配內(nèi)存;它只是為新的列添加一個(gè)引用,并更新一個(gè)列名的 registry。

4.快速元素搜索

對(duì)于NumPy數(shù)組,即使搜索的元素是第一個(gè),仍然需要與數(shù)組大小成比例的時(shí)間來找到它。使用Pandas,可以對(duì)我們預(yù)期最常被查詢的列進(jìn)行索引,并將搜索時(shí)間減少到On。

圖片圖片

索引欄有以下限制:

它需要記憶和時(shí)間來建立。

它是只讀的(在每次追加或刪除操作后需要重新建立)。

這些值不需要是唯一的,但只有當(dāng)元素是唯一的時(shí)候才會(huì)發(fā)生加速。

它需要熱身:第一次查詢比NumPy慢一些,但隨后的查詢就明顯快了。

5.按列連接

如果想用另一個(gè)表的信息來補(bǔ)充一個(gè)基于共同列的表,NumPy幾乎沒有用。而Pandas更好,特別是對(duì)于1:n的關(guān)系。

圖片圖片

Pandas連接有所有熟悉的 inner, left, right, 和 full outer 連接模式。

6.按列分組

數(shù)據(jù)分析中另一個(gè)常見的操作是按列分組。例如,為了獲得每種產(chǎn)品的總銷售量,可以做如下操作:

圖片圖片

除了sum,Pandas還支持各種聚合函數(shù):mean, max,min, count等等。

7.透視表

Pandas最強(qiáng)大的功能之一是 pivot 表。它類似于將多維空間投射到一個(gè)二維平面。

圖片圖片

雖然用NumPy當(dāng)然可以實(shí)現(xiàn)。而Pandas也有df.pivot_table,它將分組和透視結(jié)合在一個(gè)工具中。

說到這里,你可能會(huì)想,既然Pandas這么好,為什么還會(huì)有人使用NumPy呢?NumPy沒有好壞之分,它只是有不同的使用情況:

  • 隨機(jī)數(shù)(例如,用于測試)
  • 線性代數(shù)(例如,用于神經(jīng)網(wǎng)絡(luò))。
  • 圖像和圖像堆疊(例如,用于CNN)。
  • 微分、積分、三角學(xué)和其他科學(xué)人員。

簡而言之,NumPy和Pandas的兩個(gè)主要區(qū)別如下:

圖片圖片

現(xiàn)在看看這些功能是否以性能的降低為代價(jià)。

Pandas的速度

下面對(duì)NumPy和Pandas的典型工作負(fù)載進(jìn)行了基準(zhǔn)測試:5-100列;103-10?行;整數(shù)和浮點(diǎn)數(shù)。下面是1行和1億行的結(jié)果:

圖片圖片

從測試結(jié)果來看,似乎在每一個(gè)操作中,Pandas都比NumPy慢!而這并不意味著Pandas的速度比NumPy慢!

當(dāng)列的數(shù)量增加時(shí),沒有什么變化。而對(duì)于行的數(shù)量,二者的對(duì)比關(guān)系(在對(duì)數(shù)尺度上)如下圖所示:

圖片圖片

對(duì)于小數(shù)組(百行以下),Pandas似乎比NumPy慢30倍,對(duì)于大數(shù)組(百萬行以上)則慢3倍。

怎么可能呢?我們提交一個(gè)功能請(qǐng)求,建議Pandas通過df.column.values.sum()重新實(shí)現(xiàn)df.column.sum()了?這里的values屬性提供了對(duì)底層NumPy數(shù)組的訪問,并帶來了3-30倍的速度提升。

答案是否定的。Pandas 在這些基本操作上是如此緩慢,因?yàn)樗_地處理了缺失值。在Pandas中,做了大量的工作來統(tǒng)一NaN在所有支持的數(shù)據(jù)類型中的用法。根據(jù)定義(在CPU層面上強(qiáng)制執(zhí)行),nan+任何東西的結(jié)果都是nan。

所以在numpy中計(jì)算求和時(shí):

>>> np.sum([1, np.nan, 2])
nan

但使用pandas計(jì)算求和時(shí):

>>> pd.Series([1, np.nan, 2]).sum()
3.0

一個(gè)公平的比較是用np.nansum代替np.sum,np.nanmean代替np.mean,等等。突然間...

圖片圖片

對(duì)于超過一百萬元素的數(shù)組,Pandas變得比NumPy快1.5倍。對(duì)于較小的數(shù)組,它仍然比NumPy慢15倍,但通常情況下,操作在0.5毫秒或0.05毫秒內(nèi)完成并不重要--反正是快了。

如果你100%確定你的列中沒有缺失值,那么使用df.column.values.sum()而不是df.column.sum()來獲得x3-x30的性能提升是有意義的。在存在缺失值的情況下,Pandas的速度是相當(dāng)不錯(cuò)的,對(duì)于巨大的數(shù)組(超過10?個(gè)元素)來說,甚至比NumPy還要好。

我們將連載個(gè)后續(xù)部分,敬請(qǐng)期待~

參考資料

[1]Pandas: https://pandas.pydata.org/

[2]Polars: https://www.pola.rs/

責(zé)任編輯:武曉燕 來源: 數(shù)據(jù)STUDIO
相關(guān)推薦

2023-08-01 12:57:42

PandasSeriesIndex

2017-11-02 13:20:08

數(shù)據(jù)處理PythonNumpy

2022-09-20 10:50:34

PandasNumPy

2020-03-10 08:55:50

PandasNumPy函數(shù)

2023-10-15 17:07:35

PandasPython庫

2023-06-12 00:36:28

迭代向量化Pandas

2022-07-06 06:17:51

PandasScipynumpy

2019-09-11 14:34:13

排序算法數(shù)據(jù)科學(xué)

2020-04-03 13:50:19

數(shù)據(jù)分析PandasNumPy

2020-06-04 10:49:53

Pandas字符串技巧

2021-01-13 11:13:46

ExcelPandas代碼

2021-07-07 09:50:23

NumpyPandasPython

2021-02-19 10:59:29

NumpyPandasPython

2018-04-03 12:07:53

數(shù)據(jù)清洗PandasNumpy

2023-09-08 13:11:00

NumPyPandasPython庫

2022-08-24 11:54:10

Pandas可視化

2023-08-11 11:19:52

數(shù)據(jù)集Merge函數(shù)

2022-09-05 08:04:16

mergeconcat?pandas

2019-11-01 10:49:21

技術(shù)開源應(yīng)用

2019-12-25 14:08:50

Pandas數(shù)據(jù)計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)