cuDF 数据类型详解:从 pandas/Arrow 类型到 GPU 上的精度与嵌套结构
发布时间:2026/9/25 2:09:17来源:尧图网络
数据分析数据工程机器学习【免费下载链接】cudfcuDF - GPU DataFrame Library项目地址https://gitcode.com/gh_mirrors/cu/cudf点击查看免费下载本篇指南围绕 cuDFRAPIDS GPU DataFrame 库的数据类型支持文档展开系统梳理 cuDF 支持的全部数据类型数值、日期时间、字符串、Decimal、List、Struct 等及其可空性语义并深入讲解如何通过dtype参数、pandas 可空类型与ArrowDtype指定数据类型。读完本文你将掌握 cuDF 与 pandas/Arrow 类型体系的映射关系、Decimal 定点数精度precision与小数位scale的计算规则以及嵌套类型List/Struct的创建与持久化读写方法。一、cuDF 支持的数据类型总览cuDF 大体上沿用 pandas 支持的数据类型对象覆盖数值、datetime、timedelta 与字符串类型及其可空变体同时cuDF 也兼容 Arrow 类型体系中的 decimal、list 与 struct 类型。cuDF 中所有数据类型都是**可空nullable**的即每个值都可以是缺失值相关语义可参考缺失数据处理。下表列出了 cuDF 支持的主要数据种类及其默认数据类型数据种类默认数据类型有符号整数int8、int16、int32、int64无符号整数uint8、uint16、uint32、uint64浮点数float32、float64日期时间datetime64[s]、datetime64[ms]、datetime64[us]、datetime64[ns]带时区日期时间pandas.DatetimeTZDtype时间间隔时长timedelta64[s]、timedelta64[ms]、timedelta64[us]、timedelta64[ns]类别cudf.core.dtypes.CategoricalDtype字符串pandas.StringDtype十进制cudf.core.dtypes.Decimal32Dtype、cudf.core.dtypes.Decimal64Dtype、cudf.core.dtypes.Decimal128Dtype列表cudf.core.dtypes.ListDtype结构体cudf.core.dtypes.StructDtype区间cudf.core.dtypes.IntervalDtype注意cuDF 没有与pandas.PeriodDtype或pandas.SparseDtype对应的类型。从源码看上述 cuDF 专属 dtype 全部定义在 python/cudf/cudf/core/dtypes.py 中CategoricalDtypeL166、ListDtypeL388、StructDtypeL582、Decimal32Dtype/Decimal64Dtype/Decimal128DtypeL935、L947、L959以及IntervalDtypeL966。它们均继承自_BaseDtypeL161而_BaseDtype又继承自 pandas 的ExtensionDtype与 cuDF 的Serializable——前者保证了与 pandas 类型体系的互操作后者则赋予 dtype 在设备端序列化/反序列化的能力。二、如何指定数据类型cuDF 中所有带dtype参数的 API其参数接受方式与 pandas 保持一致既支持字符串简写也支持 pandas 的可空类型如pandas.Int64Dtype()以及pandas.ArrowDtype。三种写法示例如下 import cudf import pandas as pd import pyarrow as pa s cudf.Series([1, 2, 3], dtypefloat32) s 0 1.0 1 2.0 2 3.0 dtype: float32 s cudf.Series([1, 2, 3], dtypepd.Float64Dtype()) s 0 1.0 1 2.0 2 3.0 dtype: Float32 s cudf.Series([1, 2, 3], dtypepd.ArrowDtype(pa.float64())) s 0 1.0 1 2.0 2 3.0 dtype: double[pyarrow]这些 dtype 对象只是描述数据类型的元数据只要最终映射到同一底层 GPU 数据类型无论通过哪种方式指定数据在 GPU 上执行运算时都不会产生行为差异。从实现角度dtype的解析入口是 dtypes.py 中的dtype()函数其解析顺序为若传入的是 cuDF 扩展类型_BaseDtype实例直接返回尝试将参数解释为 NumPy dtype并校验其是否在SUPPORTED_NUMPY_TO_PYLIBCUDF_TYPES定义于 python/cudf/cudf/utils/dtypes.py支持集合内不支持则抛出TypeError最后尝试解释为 pandas dtype对CategoricalDtype、IntervalDtype、字符串、list、struct、interval、数值含 decimal与带时区 datetime 等类型做转换映射其余无法解释的输入统一抛出TypeError: Cannot interpret ... as a valid cuDF dtype。三、关于object类型的说明在 pandas 中object可以表示字符串数据也可以表示任意 Python 对象 import pandas as pd pd.Series([True, 1, a, pd.Series([])], dtypeobject) 0 True 1 1 2 a 3 Series([], dtype: object) dtype: object pd.Series([a, b, C], dtypeobject) 0 a 1 b 2 C dtype: object而在 cuDF 中object类型只能作为字符串数据的一种表示形式——cuDF 不支持存储任意 Python 对象。这是因为 GPU 上的列式存储要求数据具有统一的、适合并行处理的内存布局无法为每个元素保存互不相同的 Python 对象引用 import cudf s cudf.Series([abc, def, ghi], dtypeobject) s.dtype dtype(object)需要注意的是虽然显示为dtype(object)cuDF 在内部仍会将其视为字符串列处理源码 dtypes.py L93-L96 显示np.dtype.kind U的输入会被接受以向 pandas 的字符串即 object语义对齐。四、Decimal 数据类型定点数的精度与小数位Decimal32Dtype、Decimal64Dtype与Decimal128Dtype是用于存储十进制数据的类型适合需要比浮点数表示更高精度的场景例如金额、汇率等精确计算。4.1 定点数表示precision 与 scalecuDF 的 Decimal 类型基于定点数fixed-point表示由两个参数共同刻画precision精度该 dtype 中每个数值的总位数。例如数值1.023的精度为4scale小数位小数点右侧的位数。数值1.023的 scale 为3。每个 Decimal 数据类型都对应一个最大精度MAX_PRECISION cudf.Decimal32Dtype.MAX_PRECISION 9.0 cudf.Decimal64Dtype.MAX_PRECISION 18.0 cudf.Decimal128Dtype.MAX_PRECISION 38这些上限并非凭空设定。查看源码 dtypes.py L935-L963 可知Decimal32Dtype.MAX_PRECISION np.floor(np.log10(np.iinfo(int32).max))即 32 位有符号整数可容纳的最大十进制位数Decimal64Dtype.MAX_PRECISION np.floor(np.log10(np.iinfo(int64).max))即 64 位有符号整数可容纳的最大位数Decimal128Dtype.MAX_PRECISION 38对应 128 位定点数的业界惯例上限。三个类型的ITEMSIZE分别为 4、8、16 字节与 32/64/128 位的存储宽度一一对应。4.2 从decimal.Decimal创建 Decimal Series一种创建 Decimal Series 的方式是从 Python 标准库的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(precision3, scale2)注意结果 dtype 的推导逻辑1.01、4.23、0.50这三个值都能用至少 3 位精度、至少 2 位小数位表示因此 cuDF 自动选择了Decimal128Dtype(precision3, scale2)。源码中这一推断发生在DecimalDtype._from_decimaldtypes.py L895-L902它读取Decimal.as_tuple()元数据取max(有效数字位数, -指数)作为精度取-指数作为 scale。相反如果写入一个超出该 dtype 表示能力的值如1.234需要至少 4 位精度、3 位小数位则会触发错误 s[1] Decimal(1.234) # raises an error此外DecimalDtype._validatedtypes.py L885-L893会在构造时校验约束precision 超过对应类型的MAX_PRECISION会抛出ValueErrorabs(scale) precision同样非法。4.3 与 Arrow 的互操作Decimal dtype 与 PyArrow 可以互相转换to_arrow/from_arrow见 dtypes.py L839-L877to_arrow返回对应位宽的pa.decimal32/decimal64/decimal128(precision, scale)类型from_arrow则从 Arrow 十进制类型反向构造 cuDF dtype。这一特性使得 cuDF 与 Parquet、Arrow 生态的 decimal 数据可以无缝衔接。五、嵌套数据类型List 与 StructListDtype与StructDtype是 cuDF 用于处理列表状和字典状数据的类型。它们被称为嵌套nested类型因为其类型定义由一个子child类型指定而该子类型本身也可以是 list 或 struct 类型。5.1 从 pandas Series 创建 List/Struct 数据可以从已有的 pandas Series元素分别为字典或列表直接转换为 cuDF 数据 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)})5.2 从磁盘读取嵌套数据也可以借助支持嵌套数据的文件格式如 Parquet参见 IO 文档从磁盘读入 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)5.3 源码视角ListDtype 与 StructDtype 的结构ListDtypedtypes.py L388通过element_type保存子元素类型并提供两个缓存属性element_type列表元素的类型leaf_type递归展开嵌套 list 后最底层元素的类型。例如cudf.ListDtype(cudf.ListDtype(float32))表示float32的列表的列表leaf_type返回float32。空列表在 Arrow 中被推断为listnullcuDF 为与 pandas 对齐会将其映射为np.dtype(object)见 from_arrow 实现。StructDtypedtypes.py L582通过fields字典保存字段名 → 字段 dtype的映射字段 dtype 本身也可以是StructDtype从而支持任意深度的嵌套结构 cudf.StructDtype({a: int64, b: float64}) StructDtype({a: dtype(int64), b: dtype(float64)})两者都实现了to_arrow/from_arrow分别映射到pa.list_()与pa.struct()并通过__eq__/__hash__基于to_arrow()结果保证可哈希、可比较。此外ListDtype与StructDtype都实现了serialize/deserialize与device_serialize协议dtypes.py L539-L564、L696-L730使嵌套 dtype 可以随列数据一同在设备端序列化传递这是 cuDF 分布式/流式场景的基础能力之一。5.4 相关类型Categorical 与 IntervalCategoricalDtypedtypes.py L166表示类别数据包含categories存放于 cuDF Index 的唯一类别集合与ordered是否有序两个属性其内部 codes 使用min_unsigned_type(len(categories))选择尽可能小的无符号整数类型存储L248-L251以节省显存。IntervalDtypedtypes.py L966表示区间数据由subtype区间端点的 dtype与closedleft、right、both、neither四选一默认right刻画并支持从 pandas 的IntervalDtype自动解包转换。六、实践小结类型选择优先使用与 pandas 一致的字符串 dtype 写法需要可空语义或 Arrow 生态互操作时使用pandas.Int64Dtype()或pd.ArrowDtype(pa.float64())。Decimal 精度规划32/64/128 位类型分别支持最多 9/18/38 位精度构造时需保证scale绝对值不超过precision且写入值不得超出 dtype 的精度与小数位上限否则会触发ValueError。嵌套数据处理List/Struct 类型可自由嵌套任意深度既可从 pandas 对象转换也可通过 Parquet 等支持嵌套结构的文件格式直接读取其 dtype 与 Arrow 类型可双向互转。以上内容基于>赞分享数据分析数据工程机器学习【免费下载链接】cudfcuDF - GPU DataFrame Library项目地址https://gitcode.com/gh_mirrors/cu/cudf点击查看免费下载相关推荐Apache DataFusion数据类型系统详解从基本类型到复杂嵌套结构Apache DataFusion数据类型系统详解从基本类型到复杂嵌套结构 在数据处理和分析中理解数据类型系统是高效使用SQL查询引擎的基础。Apache大数据数据分析后端Apache Arrow数据类型系统终极指南从基础类型到复杂嵌套架构Apache Arrow数据类型系统终极指南从基础类型到复杂嵌套架构 Apache Arrow是一个革命性的跨语言内存数据分析平台其核心特性之一就是强大的数数据工程数据分析大数据Radar自定义规则引擎详解Groovy脚本驱动的实时风险决策核心Radar自定义规则引擎详解Groovy脚本驱动的实时风险决策核心 Radar实时风控引擎是一款基于Groovy脚本驱动的自定义规则引擎完美支持中文适用于后端风险控制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网