强制类型转换
在使用 upload 接口上传 pandas.DataFrame 时,由于 DolphinDB 类型系统与 Python 类型系统不是一一对应的关系,所以无法直接上传部分类型的数据,例如 UUID、IPADDR、SECOND 等类型。
自 1.30.22.1 版本起,Python API 支持强制类型转换。在使用强制类型转换时,需要在待上传的 pandas.DataFrame 上增加属性 __DolphinDB_Type__,该属性是一个 Python 字典对象,键为列名,值为指定的类型。示例如下:
import dolphindb as ddb import pandas as pd import numpy as np s = ddb.session() s.connect("localhost", 8848, "admin", "123456") df = pd.DataFrame({ 'cint': [1, 2, 3], 'csymbol': ["aaa", "bbb", "aaa"], 'cblob': ["a1", "a2", "a3"], }) s.upload({"df_wrong": df}) print(s.run("schema(df_wrong)")['colDefs'])
输出如下:
name typeString typeInt extra comment
0 cint LONG 5 NaN
1 csymbol STRING 18 NaN
2 cblob STRING 18 NaN
参考PROTOCOL_DDB 可知,如果直接上传 df
,此时 cint
列的 dtype 为 int64,仍会作为 LONG 类型上传;而由于 SYMBOL、BLOB 没有对应的类型,故直接上传的 str 型数据会被视作 STRING 类型。
导入 dolphindb.settings,为待上传的 pandas.DataFrame 添加属性,其字典键为需要指定类型的列名。
import dolphindb.settings as keys df.__DolphinDB_Type__ = { 'cint': keys.DT_INT, 'csymbol': keys.DT_SYMBOL, 'cblob': keys.DT_BLOB, } s.upload({"df_true": df}) print(s.run("schema(df_true)")['colDefs'])
输出如下:
name typeString typeInt extra comment
0 cint INT 4 NaN
1 csymbol SYMBOL 17 NaN
2 cblob BLOB 32 NaN
再次上传后,由输出结果可知 pandas.DataFrame 的各列都被正确转换为指定的类型。
自 1.30.22.4 版本起,Python API 支持指定数据类型为 Decimal32 / Decimal64 的精度。使用示例如下:
from decimal import Decimal df = pd.DataFrame({ 'decimal32': [Decimal("NaN"), Decimal("1.22")], 'decimal64': [Decimal("1.33355"), Decimal("NaN")], }) df.__DolphinDB_Type__ = { 'decimal32': [keys.DT_DECIMAL32, 2], 'decimal64': [keys.DT_DECIMAL64, 5], } s.upload({'df': df}) print(s.run("schema(df)")['colDefs']) print('-' * 30) print(s.run("df"))
输出如下:
name typeString typeInt extra comment 0 decimal32 DECIMAL32(2) 37 2 1 decimal64 DECIMAL64(5) 38 5 ------------------------------ decimal32 decimal64 0 NaN 1.33355 1 1.22 NaN