如何在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()

df

5.输出结果


6.关键约束与用法细节

输入向量长度必须与输出向量长度一致;比如你传入 array,不能直接返回一个标量 std,必须把标量“扩展回同长度向量”。