pandas rolling apply调用的自定义函数如何返回多个返回值?
问题原因
pandas 的 rolling.apply() 方法默认要求传入的自定义函数只能返回单个标量值。你返回多值元组时,pandas 无法将元组识别为可聚合的数值类型,因此抛出 No numeric types to aggregate 错误。
解决方案
以下是两种常用的兼容多返回值的实现方式:
方案1:修改自定义函数返回Series(兼容性最好)
直接将你需要返回的多个值封装为 pandas Series 对象,apply 执行时会自动将返回的 Series 展开为 DataFrame 的多列:
import pandas as pd def max_dd(ser): # 保留你原有计算 i、j、dd 的逻辑 # compute i,j,dd return pd.Series([i, j, dd], index=['date1', 'date2', 'dd']) # 调用时直接接收返回的多列DataFrame res_df = df.rolling(window).apply(max_dd, raw=False) # 按需提取对应列 date1, date2, dd = res_df['date1'], res_df['date2'], res_df['dd']
注意要指定 raw=False(该参数默认值就是False,低版本pandas需手动指定),保证函数接收的输入是Series类型,返回的Series才能被正确识别。
方案2:使用result_type参数自动展开(适合不想修改原函数的场景)
如果你不想改动原有的max_dd函数,可在调用时通过result_type='expand'参数让pandas自动把返回的元组/列表展开为多列,该参数在pandas 1.1.0及以上版本支持:
# 原函数无需修改 def max_dd(ser): # compute i,j,dd return i,j,dd # 调用时指定result_type参数 res_df = df.rolling(window).apply(max_dd, raw=False, result_type='expand') res_df.columns = ['date1', 'date2', 'dd'] date1, date2, dd = res_df['date1'], res_df['date2'], res_df['dd']
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

