轉自:早起python
cuDF (Pandas GPU 平替),用於載入、連線、聚合、過濾和其他數據操作。
cuDF介紹
cuDF是一個基於Apache Arrow列記憶體格式的Python GPU DataFrame庫,用於載入、連線、聚合、過濾和其他數據操作。cuDF還提供了類似於pandas的API。
GitHub:https://github.com/rapidsai/cudf
Documentation:https://docs.rapids.ai/api/cudf/stable
相關框架介紹
cuDF: cuDF是一個Python GPU DataFrame庫,它基於Apache Arrow的列式記憶體格式,用於載入、連線、聚合、過濾和以類似pandas的DataFrame風格API操縱表格數據。它允許數據工程師和數據科學家透過類似於pandas的API輕松加速其工作流程,而無需深入研究CUDA編程的細節。cuDF的設計旨在在GPU上處理大規模數據集,提供了對數據處理任務的高效能支持。
Dask: Dask是一個靈活的Python平行計算庫,使得在工作流程中平滑而簡單地實作規模化。在CPU上,Dask使用Pandas來並列執行DataFrame分區上的操作。它允許使用者以更大規模處理數據,充分發揮計算資源,而無需對程式碼進行大規模更改。
Dask-cuDF:
Dask-cuDF在需要的情況下擴充套件Dask,以允許其DataFrame分區使用cuDF GPU DataFrame而不是Pandas DataFrame進行處理。例如,當呼叫
dask_cudf.read_csv(...)
時,集群的GPU透過呼叫
cudf.read_csv()
來執行解析CSV檔的工作。這使得在GPU上利用cuDF的高效能數據處理能力,從而加速大規模數據處理任務。
cuDF和Pandas比較
cuDF是一個DataFrame庫,它與Pandas API密切匹配,但直接使用時並不是Pandas的完全替代品。在API和行為方面,cuDF和Pandas之間存在一些差異。以下是cuDF和Pandas之間的相似之處和差異的對比:
支持的操作:
cuDF支持許多與Pandas相同的數據結構和操作,包括Series、DataFrame、Index等,以及它們的一元和二元操作、索引、過濾、連線、分組和視窗操作等。
數據型別:
cuDF支持Pandas中常用的數據型別,包括數值、日期時間、時間戳、字串和分類數據型別。此外,cuDF還支持用於十進制、列表和「結構」值的特殊數據型別。
缺失值:
與Pandas不同,cuDF中的所有數據型別都是可為空的,意味著它們可以包含缺失值(用cudf.NA表示)。
叠代:
在cuDF中,不支持對Series、DataFrame或Index進行叠代。因為在GPU上叠代數據會導致極差的效能,GPU最佳化用於高度並列操作而不是順序操作。
結果排序:
預設情況下,cuDF中的join(或merge)和groupby操作不保證輸出排序。與Pandas相比,需要顯式傳遞
sort=True
或在嘗試匹配Pandas行為時啟用
mode.pandas_compatible
選項。
浮點運算:
cuDF利用GPU並列執行操作,因此操作的順序不總是確定的。這影響浮點運算的確定性,因為浮點運算是非關聯的。在比較浮點結果時,建議使用cudf.testing模組提供的函式,允許您根據所需的精度比較值。
列名:
與Pandas不同,cuDF不支持重復的列名。最好使用唯一的字串作為列名。
沒有真正的「object」數據型別:
與Pandas和NumPy不同,cuDF不支持「object」數據型別,用於儲存任意Python物件的集合。
.apply()函式限制:
cuDF支持.apply()函式,但它依賴於Numba對使用者定義的函式(UDF)進行JIT編譯並在GPU上執行。這可以非常快速,但對UDF中允許的操作施加了一些限制。
何時使用cuDF和Dask-cuDF
cuDF:
當您的工作流在單個GPU上足夠快,或者您的數據在單個GPU的記憶體中輕松容納時,您會希望使用cuDF。
當數據量不大,可以在單個GPU記憶體中處理時,cuDF提供了對單個GPU上高效能數據操作的支持。
Dask-cuDF:
當您希望在多個GPU上分布您的工作流程時,或者您的數據量超過了單個GPU記憶體的容量,或者希望同分時析許多檔中分布的數據時,您會希望使用Dask-cuDF。
Dask-cuDF允許您在分布式GPU環境中進行高效能的數據處理,特別是當數據集太大,無法容納在單個GPU記憶體中時。
cuDF程式碼案例
import os
import pandas as pd
import cudf
# Creating a cudf.Series
s = cudf.Series([1, 2, 3, None, 4])
# Creating a cudf.DataFrame
df = cudf.DataFrame(
{
"a": list(range(20)),
"b": list(reversed(range(20))),
"c": list(range(20)),
}
)
# read data directly into a dask_cudf.DataFrame with read_csv
pdf = pd.DataFrame({"a": [0, 1, 2, 3], "b": [0.1, 0.2, None, 0.3]})
gdf = cudf.DataFrame.from_pandas(pdf)
gdf
# Viewing the top rows of a GPU dataframe.
ddf.head(2)
# Sorting by values.
df.sort_values(by="b")
# Selecting a single column
df["a"]
# Selecting rows from index 2 to index 5 from columns ‘a’ and ‘b’.
df.loc[2:5, ["a", "b"]]
# Selecting via integers and integer slices, like numpy/pandas.
df.iloc[0:3, 0:2]
# Selecting rows in a DataFrame or Series by direct Boolean indexing.
df[df.b > 15]
# Grouping and then applying the sum function to the grouped data.
df.groupby("agg_col1").agg({"a": "max", "b": "mean", "c": "sum"})