如何在sql中使用python函数:dai.DaiUDF
在日常投研里,SQL 擅长数据读写与过滤,但在复杂计算上可用算子有限;Python 则拥有 numpy/scipy/pandas 等丰富工具,但一旦离开 SQL 查询链路,就容易出现“先拉数据 → 再本地算 → 再落表/再 join”的低效流程。
因此我们需要一种方式:保留 SQL 的读写效率,同时把 Python 的复杂计算注入到查询中。我们可以使用平台中的dai.DaiUDF函数,它实现了在 Python 里写函数 → 注册成 UDF → SQL 里直接调用。
dai.DaiUDF
dai.DaiUDF (name, function, parameters=None, return_type=None, type=UDFType.NATIVE, null_handling=FunctionNullHandling.DEFAULT, exception_handling=ExceptionHandling.DEFAULT, side_effects=False)
DAI Python UDF类。
参数:
name: str,SQL语句。
function: Callable,函数体。
parameters: List[DaiPyType],参数列表,默认为空。
return_type: DaiPyType,返回值类型,默认为空。
type: UDFType,函数类型,默认为UDFType.NATIVE。
null_handling: FunctionNullHandling,是否处理空值,默认为FunctionNullHandling.DEFAULT。
exception_handling: ExceptionHandling,是否处理异常,默认为ExceptionHandling.DEFAULT。
side_effects: bool,是否产生副作用,默认为False。
自定义函数参数和返回值的数据类型:
DaiType
BIGINT
BIT
BLOB
BOOLEAN
DATE
DOUBLE
FLOAT
HUGEINT
INTEGER
INTERVAL
SMALLINT
SQLNULL
TIME
TIMESTAMP
TIMESTAMP_MS
TIMESTAMP_NS
TIMESTAMP_S
TIMESTAMP_TZ
TIME_TZ
TINYINT
UBIGINT
UINTEGER
USMALLINT
UTINYINT
UUID
VARCHAR
1.写一个最简单的 Python 函数
把输入乘 2(timestwo)
import dai
import numpy as np
def timestwo(x):
return x * 2函数是传入一个 array,返回一个 array
2.注册成 UDF(SQL 才能认得这个函数)
timestwo_udf = dai.DaiUDF(
name="timestwo",
function=timestwo,
return_type="double",
)注册后的 UDF 只在自己的账号下可用,主要是避免全员 import 时加载大量 UDF,带来内存/时间开销。
3.SQL 里像内置函数一样调用
sql = """
select
date,
instrument,
close,
timestwo(close) as factor
from cn_stock_prefactors
"""4.执行查询时把 UDF 放进 udf_list
只要你用到了 udf_list,就必须在 query 的时候传进去。
df = dai.query(
sql,
udf_list=[timestwo_udf],
filters={"date": ["2024-01-01", "2024-02-01"]},
).df()
df5.输出结果
6.关键约束与用法细节
输入向量长度必须与输出向量长度一致;比如你传入 array,不能直接返回一个标量 std,必须把标量“扩展回同长度向量”。