支持的数据类型#

cuDF 支持 NumPy 和 Pandas 支持的多种数据类型,包括数值、日期时间、时间差、分类和字符串数据类型。我们还提供了用于处理小数、类似列表和类似字典数据的特殊数据类型。

cuDF中的所有数据类型都是nullable

数据类型

数据类型(s)

有符号整数

'int8', 'int16', 'int32', 'int64'

无符号整数

'uint32', 'uint64'

浮点数

'float32', 'float64'

日期时间

'datetime64[s]', 'datetime64[ms]', 'datetime64['us'], 'datetime64[ns]'

时间差(持续时间)

'timedelta[s]', 'timedelta[ms]', 'timedelta['us'], 'timedelta[ns]'

类别

CategoricalDtype

字符串

'object''string'

十进制

Decimal32Dtype, Decimal64Dtype, Decimal128Dtype

列表

ListDtype

结构体

StructDtype

NumPy 数据类型#

我们使用NumPy数据类型来处理整数、浮点数、日期时间、时间差和字符串数据类型。因此,就像在NumPy中一样,np.dtype("float32")np.float32"float32"都是指定float32数据类型的可接受方式:

>>> import cudf
>>> s = cudf.Series([1, 2, 3], dtype="float32")
>>> s
0    1.0
1    2.0
2    3.0
dtype: float32

关于 object#

与cuDF中字符串数据相关的数据类型是"np.object"

>>> import cudf
>>> s = cudf.Series(["abc", "def", "ghi"])
>>> s.dtype
dtype("object")

这是为了与Pandas兼容,但可能会引起误解。在NumPy和Pandas中,"object"是与由任意Python对象(不仅仅是字符串)组成的数据相关联的数据类型。然而,cuDF不支持存储任意Python对象。

十进制数据类型#

我们提供了特殊的数据类型来处理十进制数据,即 Decimal32Dtype, Decimal64Dtype, 和 Decimal128Dtype。当您需要存储比浮点表示允许的更高精度的值时,请使用这些数据类型。

cuDF中的十进制数据类型基于定点表示法。一个十进制数据类型由精度刻度组成。精度表示此数据类型每个值中的总位数。例如,与十进制值1.023相关的精度是4。刻度是小数点右侧的总位数。与值1.023相关的刻度是3。

每个十进制数据类型都与一个最大精度相关联:

>>> cudf.Decimal32Dtype.MAX_PRECISION
9.0
>>> cudf.Decimal64Dtype.MAX_PRECISION
18.0
>>> cudf.Decimal128Dtype.MAX_PRECISION
38

创建十进制系列的一种方法是从decimal.Decimal类型的值中创建。

>>> from decimal import Decimal
>>> s = cudf.Series([Decimal("1.01"), Decimal("4.23"), Decimal("0.5")])
>>> s
0    1.01
1    4.23
2    0.50
dtype: decimal128
>>> s.dtype
Decimal128Dtype(precision=3, scale=2)

注意结果的数据类型:1.01, 4.23, 0.50 都可以 用至少3位精度和至少2位小数表示。

然而,值 1.234 需要至少 4 位的精度和至少 3 位的小数位数,因此无法完全使用此数据类型表示:

>>> s[1] = Decimal("1.234")  # raises an error

嵌套数据类型 (ListStruct)#

ListDtypeStructDtype 是 cuDF 中用于处理列表和字典类数据的特殊数据类型。这些被称为“嵌套”数据类型,因为它们使您能够存储列表的列表、结构的列表、列表的结构的列表等。

您可以从现有的Pandas列表和字典系列中分别创建列表和结构系列:

>>> psr = pd.Series([{'a': 1, 'b': 2}, {'a': 3, 'b': 4}])
>>> psr
0 {'a': 1, 'b': 2}
1 {'a': 3, 'b': 4}
dtype: object
>>> gsr = cudf.from_pandas(psr)
>>> gsr
0 {'a': 1, 'b': 2}
1 {'a': 3, 'b': 4}
dtype: struct
>>> gsr.dtype
StructDtype({'a': dtype('int64'), 'b': dtype('int64')})

或者通过从磁盘读取它们,使用一个支持嵌套数据的文件格式

>>> pdf = pd.DataFrame({"a": [[1, 2], [3, 4, 5], [6, 7, 8]]})
>>> pdf.to_parquet("lists.pq")
>>> gdf = cudf.read_parquet("lists.pq")
>>> gdf
           a
0     [1, 2]
1  [3, 4, 5]
2  [6, 7, 8]
>>> gdf["a"].dtype
ListDtype(int64)