精华帖子

如何在sql中使用python函数:dai.DaiUDF

由bq5973r5创建,最终由bq5973r5 被浏览 9 用户

在日常投研里,SQL 擅长数据读写与过滤,但在复杂计算上可用算子有限;Python 则拥有 numpy/scipy/pandas 等丰富工具,但一旦离开 SQL 查询链路,就容易出现“先拉数据 → 再本地算 → 再落表/再 join”的低效流程。\n因此我们需要一种方式:保留 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,必须把标量“扩展回同长度向量”。

\

{link}