嫌pandas慢又不想改代碼怎麼辦?來試試Modin

2021-01-10 騰訊網

但方法的改進上難免會遇到上限瓶頸,比如數據非常大的時候。最近看到了一篇也是關於對pandas提速的文章,但是從另一個角度,工具。使用它可以很好的突破操作優化上的瓶頸,而這個工具就是Modin。

Modin存在的意義就是:更改一行代碼來提速pandas工作流程。

Pandas在數據科學領域就無需介紹了,它提供高性能,易於使用的數據結構和數據分析工具。但是,在處理過多的數據時,單核上的Pandas就顯得心有餘而力不足了,大家不得不求助於不同的分布式系統來提高性能。然而,提高性能的權衡伴隨著陡峭的學習曲線。從本質上講,用戶可能只是希望Pandas運行得更快,並不希望對其特定的硬體設置優化其工作流程。這意味著大家希望使用相同Pandas腳本作用於10KB數據集和10TB數據集。 Modin對優化pandas提供了解決方案,以便數據科學家可以花更多時間從數據中提取價值,而不是在工具上。

Modin

Modin是加州大學伯克利分校RISELab的早期項目,旨在促進分布式計算在數據科學中的應用。它是一個多進程Dataframe庫,具有與pandas相同的API,允許用戶加速其Pandas工作流程。

Modin在8核計算機上將Pandas查詢加速4倍,只需要用戶更單行代碼。該系統專為現有的Pandas用戶而設計,他們希望程序能夠更快地運行並且無需重大代碼更改即可更好地擴展。這項工作的最終目標是能夠在雲設置中使用Pandas。

安裝

Modin是完全開源的,可以在GitHub上找到:

https://github.com/modin-project/modin

Modin可以從PyPI安裝:

pip install modin

對於Windows,其中一個依賴項是Ray。在Windows上本身尚不支持Ray,因此為了安裝它,需要使用WSL(適用於Linux的Windows子系統)。

Modin是如何加速運行的?

在筆記本電腦上

考慮一款4核現代筆記本電腦,dateframe可以很好地適用其上。pandas只使用其中一個CPU核,但是,modin確使用了所有的核。

pandas vs modin CPU核使用對比

modin所做的基本上就是增加了CPU所有內核的利用率,從而提供了更好的性能。

在一個更大型機器上

在大型機器上,modin的有利用率變得更加明顯。讓我們假裝有一些伺服器或一些非常強大的機器。pandas仍將使用單核,而modin將使用全部核。以下是144核心計算機上read_csv操作下,pandas和modin的性能比較。

pandas有一個很明顯的線性增長,這是因為它一直只使用一個核。可能很難看到綠色條紋,因為modin的運行時間非常短。

Modin的架構

我們來看看Modin的架構。

DataFrame分區

分區模式沿著列和行分區,因為它在列數和支持的行數方面給Modin提供了靈活性和可伸縮性。

系統架構

Modin被分成不同的層:

Pandas API暴露在最頂層。

下一層包含查詢編譯器,它從pandas API層接收查詢並執行某些優化。

最後一層是分區管理器,負責數據布局和洗牌,分區和序列化發送到每個分區的任務。

modin的標準架構

在Modin中實現pandas API

pandas API是非常多的,這可能是它具有如此廣泛的應用的原因。

pandas API

在這麼多的操作下,modin遵循了一種數據驅動的方法。意思是說modin的創造者分析了一下大多數人在pandas中所使用的操作。他們去了Kaggle並對那裡出現的腳本和筆記進行了大量搜索,並最終弄明白了最受歡迎的pandas方法如下:

pd.read_csv是目前pandas中使用最多的方法,其次是pd.Dataframe。因此,在modin中,他們開始實現這些方法並按照它們的受歡迎程度對它們進行優化:

目前,modin支持大約71%的pandas API。

這代表了基於該研究的約93%的使用量。

Ray

Modin使用Ray提供了一種省事兒的方式來加速pandas的notebooks,腳本和庫。Ray是一個高性能的分布式執行框架,面向大規模機器學習和強化學習應用程式。可以在單個機器上運行相同的代碼以實現高效的多進程處理,並且可以在群集上使用它來進行大型計算。你可以在GitHub上找到Ray:

https://github.com/ray-project/ray

Usage

Importing

Modin包裝了pandas並透明地分發數據和計算,通過一行代碼更改加速了pandas的工作流程。用戶繼續使用以前的pandas notebooks,同時可以體驗到Modin的相當大的加速,即使在一臺機器上也是如此。只需要修改import語句,其中需要導入modin.pandas而不是簡單的pandas。

import numpy as np

import modin.pandas as pd

我們使用由隨機整數組成的Numpy構建一個數據集。注意,我們不必在此處指定分區。

當我們列印出類型時,它是一個Modin的數據框。

type(df)

如果我們用head命令列印出前5行,它會像pandas一樣呈現HTML表。

df.head()

對比

Modin管理數據分區和洗牌,以便用戶可以專注於從數據中提取值。以下代碼在具有32GB RAM的2013年4核iMac上運行。

pd.read_csv

read_csv是迄今為止最常用的pandas操作。當我們在pandas vs modin中使用read_csv時,可以快速地比較出來。

pandas

%%time

import pandas

pandas_csv_data = pandas.read_csv("../800MB.csv")

CPU times: user 26.3 s, sys: 3.14 s, total: 29.4s

Wall time: 29.5 s

Modin

%%time

modin_csv_data = pd.read_csv("../750MB.csv")

CPU times: user 76.7 ms, sys: 5.08 ms, total: 81.8 ms

Wall time: 7.6 s

使用Modin,只需更改import語句,read_csv在4核計算機上的運行速度可提高4倍。

df.groupby

pandas groupby編寫得非常好,速度非常快。但即便如此,modin仍然勝過pandas。

pandas

%%time

import pandas

_ = pandas_csv_data.groupby(by=pandas_csv_data.col_1).sum()

CPU times: user 5.98 s, sys: 1.77 s, total: 7.75 s

Wall time: 7.74 s

Modin

%%time

results = modin_csv_data.groupby(by=modin_csv_data.col_1).sum()

CPU times: user 3.18 s, sys: 42.2 ms, total: 3.23 s

Wall time: 7.3 s

默認為pandas實現

如果想要使用尚未實現或優化的pandas API,實際上可以默認使用pandas。這使得該系統可用於使用尚未在Modin中實現操作的notebooks,即使性能會因為使用pandas API而下降。當默認為pandas時,你會看到一個警告:

dot_df = df.dot(df.T)

一旦計算完成,它將返回分布式Modin DataFrame。

type(dot_df)

--

結論

Modin仍然處於早期階段,似乎是對pandas非常有前途的補充。Modin處理用戶的所有分區和混洗,以便我們可以專注於我們的工作流程。Modin的基本目標是使用戶能夠在小數據和大數據上使用相同的工具,而無需擔心更改API以適應不同的數據大小。

來源:

https://towardsdatascience.com/get-faster-pandas-with-modin-even-on-your-laptops-b527a2eeda74

https://rise.cs.berkeley.edu/blog/modin-pandas-on-ray-october-2018/

專注於數據科學領域的知識分享

歡迎在文章下方留言與交流

Python數據科學【讀者福利】

相關焦點

  • 想讓pandas運行更快嗎?那就用Modin吧
    而 Modin 能夠將 pandas 的運行速度提高好幾倍,而無需切換 API 來適應不同的數據規模。「通過更改一行代碼擴展你的 pandas 工作流。」Pandas 是數據科學領域的工作者都熟知的程序庫。它提供高性能、易於使用的數據結構和數據分析工具。
  • 提高數據處理效率,一行代碼開啟Pandas四倍速!
    快來了解新庫Modin,可以分割pandas的計算量,提高數據處理效率,一行代碼即刻開啟Pandas四倍速。首先了解一些基礎知識:Pandas作為Python中用於處理數據的庫,能簡單且靈活地處理不同種類、大小的數據。除此之外,Pandas還有許多函數有助於輕鬆處理不同數據。
  • 懶人秘籍:教你如何避免編寫pandas代碼
    但是,在處理過多的數據時,單核上的Pandas就顯得心有餘而力不足了,大家不得不求助於不同的分布式系統來提高性能。然而,提高性能的權衡常常伴隨著陡峭的學習曲線。而大家都在儘可能地避免這種懸崖峭壁,結果可想而知,都轉向了如何避免編寫pandas代碼。在過去4年裡,筆者一直使用pandas作為數據分析的主要工具。
  • 在pandas中使用pipe()提升代碼可讀性
    簡介我們在利用pandas開展數據分析時,應儘量避免過於「碎片化」的組織代碼,尤其是創建出過多不必要的「中間變量」,既浪費了「內存」,又帶來了關於變量命名的麻煩,更不利於整體分析過程代碼的可讀性,因此以流水線方式組織代碼非常有必要。
  • Pandas on Ray:僅需改動一行代碼,即可讓Pandas加速四倍
    目前,Apache Spark 是最高性能的分布式選擇了,但是如果未對 Pandas 代碼做出足夠多的修改,你無法使用 Apache Spark 運行 Pandas 代碼。大規模數據科學任務向來都是丟給分布式計算專家來做的,或者至少是熟悉此類概念的人員。大多數分布式系統的設計者給用戶提供了調節「旋鈕」,並留下了大量的系統配置。因此,高系統性能需要用明顯更加陡峭的學習曲線來折中。
  • Python學習120課 pandas簡介kaggle下載數據及pandas讀取外部數據
    現在我們開始學習pandas,pandas一般用的更多,pandas是基於numpy去寫的。pandas是一個專門做數據結構和數據分析的庫。●pandas的安裝推薦使用anaconda,只要安裝了anaconda,它裡面就會自帶pandas,這會為我們省去很多的麻煩。接下來就是用pandas去處理數據,數據從哪來呢?
  • 用Pandas演示tips的小技巧,學到了嗎?
    下載Jupyter notebook,一起動動小手來試試吧!設置創建一個10行3列的數據幀,數值隨機。還可以在pandas分析伺服器上製作API,這樣就可以在網頁瀏覽器的數據幀中追蹤最新數值。注意,這需要用到lxml軟體包,可以用pip安裝lxml。
  • pandas指南:做更高效的數據科學家
    你需要有經驗的人來告訴你。今天我要告訴你們的是:在數據科學中,有一個軟體包是你們絕對需要學習的,那就是pandas。而pandas真正有趣的地方是,很多其他的包也在裡面。pandas是一個核心包,因此它具有來自其他各種包的特性。pandas類似於Python中的Excel:它使用表(即DataFrame)並對數據進行轉換,但它還能做更多。
  • 圖解四個實用的pandas函數!
    作者:Baijayanta Roy來源:towardsdatascience編譯&內容補充:早起Python在用python進行機器學習或者日常的數據處理中,pandas是最常用的Python庫之一,熟練掌握pandas是每一個數據科學家的必備技能,本文將用代碼+圖片詳解Pandas中的四個實用函數!
  • 快速解釋如何使用pandas的inplace參數
    介紹在操作dataframe時,初學者有時甚至是更高級的數據科學家會對如何在pandas中使用inplace參數感到困惑。更有趣的是,我看到的解釋這個概念的文章或教程並不多。它似乎被假定為知識或自我解釋的概念。不幸的是,這對每個人來說都不是那麼簡單,因此本文試圖解釋什麼是inplace參數以及如何正確使用它。
  • 【跟著stackoverflow學Pandas】- Pandas修改列的類型
    Pandas: change data type of columns - Pandas修改列的類型我們利用pandas進行數據處理經常會遇到數據類型不符的問題
  • 如何使用Pandas-Profiling進行探索性數據分析
    我們可以通過執行探索性數據分析(EDA)來實現這一點。這包括找出每個變量的數據類型、目標變量的分布、每個預測變量的不同值的數量、數據集中是否有重複值或缺失值等。進行EDA探索機器學習數據集的過程往往是非常耗時的。什麼是Pandas-Profiling?Pandas-profiling是一個開源Python庫,它只需一行代碼即可為任何機器學習數據集生成漂亮的交互式報告。
  • 如何用pandas更快地進行數據可視化?
    作者:劉早起來源:早起Python(公眾號)如果你經常使用Python進行數據分析,那麼對於pandas一定不會陌生,但是Pandas除了在數據處理上大放異彩,隨著版本的不斷更新,Pandas的繪圖功能在某些情況下甚至要比matplotlib更加適用,本文就將介紹如何用
  • 如何通過一頓飯來說明NumPy與pandas的功用
    而在這股勢力中,其主角及成員便是NumPy、pandas、matplotlib以及scipy。本文要簡單介紹的則是主力中的主力:NumPy與pandas。誠然,R語言幾乎專注於統計分析,其第三方包無數,有著統計學的深度以及各學科統計分析應用的廣度,並且也在與Python的較量中不甘示弱。
  • 快速介紹Python數據分析庫pandas的基礎知識和代碼示例
    我創建了這個pandas函數的備忘單。這不是一個全面的列表,但包含了我在構建機器學習模型中最常用的函數。讓我們開始吧!NaN(非數字的首字母縮寫)是一個特殊的浮點值,所有使用標準IEEE浮點表示的系統都可以識別它pandas將NaN看作是可互換的,用於指示缺失值或空值。有幾個有用的函數用於檢測、刪除和替換panda DataFrame中的空值。
  • 如何在Python中編寫簡單代碼,並且速度超越Spark?
    數據科學家們用pandas進行探索。然後,其他的數據工程師團隊重新編寫相同的邏輯代碼並使其大規模工作,或者使用Spark令其與實時流一同工作。當數據科學家需要更改邏輯或將一個不同的數據集用於他/她的模型時,則會進行一次次地迭代。除了注意業務邏輯之外,還要分別或同時在Hadoop和Kubernetes構建集群,並應用整個CI / CD過程手動進行管理。
  • 從小白到大師,這裡有一份Pandas入門指南
    總之,它提供了被稱為 DataFrame 和 Series(對那些使用 Panel 的人來說,它們已經被棄用了)的數據抽象,通過管理索引來快速訪問數據、執行分析和轉換運算,甚至可以繪圖(用 matplotlib 後端)。
  • 懂Excel就能輕鬆入門Python數據分析包pandas(七):分列
    後來才發現,原來不是 Python 數據處理厲害,而是他有數據分析神器—— pandas前言今天從兩個需求來看看數據分列功能,由於 Excel 自帶功能比較弱,在處理稍微複雜的需求時會顯得力不從心,因此,本系列文章將引入 Excel 中一個非常高效的數據處理插件—— Power Query,並且看看 pandas 是怎樣靈活解決。
  • Python數據分析利器,Pandas入門介紹,幫你便捷高效處理複雜數據
    pandas的矩陣運算可以幫我們結構化成表格數據,省去大量自己拼接表格數據的代碼開銷。本章知識點:pandas 安裝和使用pandas 數據結構(Series)pandas 數據結構(DataFrame)pandas 安裝和使用通過 pip install pandas可以直接安裝安裝pandas和相關聯的庫。
  • 如何用Pandas庫實現MySQL資料庫的讀寫?
    可以使用pip命令安裝SQLAlchemy模塊:  '資料庫類型+資料庫驅動名稱://用戶名:口令@機器地址:埠號/資料庫名'  Pandas讀寫MySQL資料庫  我們需要以下三個庫來實現Pandas讀寫MySQL資料庫:  pandas  sqlalchemy