强制类型转换
在使用 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