cuDF滚动UDF调用cuPy函数报错,计算滞后1阶皮尔逊自相关失败
报错原因
cuDF 21.10版本的滚动窗口apply方法默认使用Numba CUDA的nopython模式编译自定义函数,以实现GPU原生加速。cupy.corrcoef不属于Numba CUDA支持的可编译函数集合,因此在编译阶段无法识别该属性,抛出LoweringError。
解决方案
方案1:手动实现皮尔逊相关系数计算(兼容21.10版本)
直接在UDF中用基础算术运算实现滞后1阶自相关系数的计算逻辑,所有运算均在Numba CUDA的支持范围内:
import math import cudf def cuda_corr(x): n = len(x) lag = 1 valid_cnt = n - lag sum_x = 0.0 sum_y = 0.0 sum_xy = 0.0 sum_x_sq = 0.0 sum_y_sq = 0.0 for i in range(valid_cnt): xi = x[i] yi = x[i+lag] sum_x += xi sum_y += yi sum_xy += xi * yi sum_x_sq += xi * xi sum_y_sq += yi * yi # 皮尔逊相关系数计算公式 numerator = valid_cnt * sum_xy - sum_x * sum_y denominator = math.sqrt((valid_cnt * sum_x_sq - sum_x ** 2) * (valid_cnt * sum_y_sq - sum_y ** 2)) return 0.0 if denominator == 0 else numerator / denominator # 调用时指定engine和raw参数 cdf = cudf.from_pandas(df['ex_col']) res = cdf.rolling( window=3, min_periods=3, center=False ).apply(cuda_corr, engine='numba', raw=True)
方案2:升级RAPIDS版本使用内置方法
若可以升级环境,RAPIDS 22.02及以上版本已经内置了滚动窗口自相关计算接口,无需自定义UDF:
# 版本>=22.02可直接调用 res = cdf.rolling( window=3, min_periods=3, center=False ).autocorr(lag=1)
内容的提问来源于stack exchange,提问作者Idan Regev
相关产品推荐
相关产品推荐

