支持的数据类型#

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

cuDF 中的所有数据类型都是可为空的

数据类型

数据类型(s)

有符号整数

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

无符号整数

'uint32', 'uint64'

浮点

'float32', 'float64'

日期时间

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

Timedelta (持续时间)

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

类别

CategoricalDtype

字符串

'object''string'

十进制

Decimal32Dtype, Decimal64Dtype, Decimal128Dtype

列表

ListDtype

Struct

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 对象。

十进制数据类型#

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

cuDF 中的十进制数据类型基于定点表示。十进制数据类型由一个 精度 和一个 小数位数 组成。精度表示该 dtype 中每个值的总位数。例如,与十进制值 1.023 关联的精度是 4。小数位数是小数点右边的总位数。与值 1.023 关联的小数位数是 3。

每种十进制数据类型都有一个最大精度限制

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

创建十进制 Series 的一种方法是使用 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.014.230.50 都可以用至少 3 的精度和至少 2 的小数位数来表示。

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

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

嵌套数据类型(ListStruct#

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

您可以分别从现有的 Pandas 列表 Series 和字典 Series 创建列表 Series 和 struct Series

>>> 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)