智能化、流媒體快速增長的時代,每天都會產生海量數據。在處理這些數據時,我們需要的從上而下的系統性設計,包括存儲、維護、分析、查詢、展示等等。回歸到個人,日常工作中我們也會經常有一些重復性的數據分析工作,Python作為一種入門門檻低,使用簡單,擁有豐富的操作庫。它不僅能夠處理復雜數據,甚至于當前火熱的人工智能,在引入Python庫后也能幾行代碼實現。
回歸正題,在大數據處理領域Pandas庫絕對是人人都應該用過且非常熟悉的。它是很多科學庫的依賴庫,Pandas的優勢是:發布早,具有更好的兼容性,Pandas是與整個Python數據科學生態系統一起成長的,與構成機器學習流水線的其他軟件包具有最大的互操作性。在看到它的優勢的同時,我們也逐漸發現了Pandas的不足,其中Pandas最大的不足:性能。
Pandas VS Polars
相反,Polars最大的優勢就是性能,它執行常見運算的速度是Pandas的5~10 倍,且同時Polars運算內存需求遠低于Pandas:通常Pandas需要輸入數據集5~10倍左右的RAM來執行運算,而Polars只用 2~4倍。
為什么Polars會有這么好的性能呢?主要還是因為Polars底層是Rust語言(一種和C/C++一樣快的低級語言)編寫。而Pandas是在NumPy這樣的Python庫基礎上編寫的,雖然NumPy的核心是C編寫,但它仍然受到 Python 處理內存中某些類型時的固有問題的影響。另外,Rust語言允許安全并發,并行能力更強。而Pandas只有一個核心執行運算,自然性能要差不少。
內存占用方面,Polars采用了Apache Arrow(一種獨立于語言的內存格式),具有互操作性優勢,數據無需通過序列化和反序列化以進行傳遞,進程間無需創建副本,直接共享相同的數據。此外,Pandas基于NumPy,在處理整數和浮點列方面非常出色,但難以應對其他數據類型,在處理大數據集時,Pandas可能會使用大量內存。
為了方便換庫,Polars還提供了類似于Pandas的API,使得學習和遷移到Polars的成本相對較低。并且Polars是一個開源項目,鼓勵社區參與和貢獻。
使用舉例
- 安裝Polars
pip3 install polars
- Polars 舉例
Polars 提供了從各種來源加載數據的便捷方法,包括 CSV 文件、Parquet 文件和 Pandas DataFrames。讀取 CSV 或 parquet 文件的方法與 Pandas 庫相同。
例子1:我們先設計一張泰坦尼克號乘客數據集的 CSV 文件。這個數據集通常包含乘客的各種信息,如性別、年齡、票務類別等,以及他們是否存活。
# read a csv file from localimport polars as pl
df = pl.read_csv('d://test.csv')
# 打印出csv文件的前5行
print(df.head())
# 分組和聚合操作
survival_rate_by_gender = df.groupby("Sex").agg([
pl.col("Survived").mean().alias("Survival Rate")
])print(survival_rate_by_gender)
# 復雜操作:按年齡類別分組,并計算存活率
df = df.with_column(
pl.when(pl.col("Age") < 12).then("Child")
.when((pl.col("Age") >= 12) & (pl.col("Age") < 18)).then("Teenager")
.when((pl.col("Age") >= 18) & (pl.col("Age") < 60)).then("Adult")
.when(pl.col("Age") >= 60).then("Senior")
.otherwise("Unknown")
.alias("Age Group")
)
survival_rate_by_age_group = df.groupby("Age Group").agg([
pl.col("Survived").mean().alias("Survival Rate")
])
print(survival_rate_by_age_group)
例子2:我們有一張英雄信息表,包括名字、武力、門派等信息。
importpolarsaspl
#讀取江湖中的英雄帖(數據集)
df=pl.read_csv("heroes.csv")
#選出武功高強的俠客
high_skill_heroes=df.filter(pl.col("武力")>90)
#計算各門派高手數量,如同點名江湖中的豪杰
sect_heroes_count=high_skill_heroes.groupby("門派").agg(pl.count())
#顯示結果,一覽英雄盟主
print(sect_heroes_count)
總結
總的來說,Pandas是一個經過時間驗證的數據處理工具,而Polars則更適用于大規模數據處理和需要更高性能的場景。選擇使用哪個庫取決于你對數據規模、性能和現有生態系統的需求。Polars生態上也在快速成長,未來可期。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.