當前位置: 妍妍網 > 碼農

cuDF,能取代 Pandas 嗎?

2024-04-03碼農

轉自:早起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([123None4])
    # 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": [0123], "b": [0.10.2None0.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:30: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"})