支持的数据类型#
cuDF 支持 NumPy 和 Pandas 支持的多种数据类型,包括数值、日期时间、时间差、分类和字符串数据类型。我们还提供了用于处理小数、类似列表和类似字典数据的特殊数据类型。
cuDF中的所有数据类型都是nullable。
数据类型 |
数据类型(s) |
|---|---|
有符号整数 |
|
无符号整数 |
|
浮点数 |
|
日期时间 |
|
时间差(持续时间) |
|
类别 |
|
字符串 |
|
十进制 |
|
列表 |
|
结构体 |
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
嵌套数据类型 (List 和 Struct)#
ListDtype 和
StructDtype 是 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)