You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

当TA-Lib函数预期接收位置参数与关键字参数时,仅使用关键字参数调用函数的问题排查

解决TA-Lib封装类中可选参数不生效的问题

我来帮你排查这个问题——你遇到的核心问题是TA-Lib的abstract.Function返回的_Function实例,调用方式和你预想的不一样:把所有参数打包成一个字典传进去会导致可选参数被当成输入数据的一部分,而不是函数的配置参数。

问题根源分析

看你原来的调用代码:

fn_result = self.ta_lib_function(self.ta_lib_kwargs)

你把包含closetimeperiodmatype的字典直接传给了_Function实例,但TA-Lib的_Function.__call__方法逻辑是:

  • 如果第一个参数是字典,它会把字典里的键当作输入数据的名称(比如MA函数只需要close),对应的值是输入的时间序列;
  • 函数的可选参数(比如timeperiodmatype)需要单独作为关键字参数传递,不能和输入数据混在同一个字典里。

所以你原来的代码里,timeperiodmatype被当成了输入数据的键,但MA函数不需要这些输入,因此它们被忽略了,函数只能用默认的参数值,导致你觉得可选参数没生效。

解决方案:拆分输入数据与可选参数

我们可以利用TA-Lib函数提供的input_names属性,把传入的kwargs拆分成输入数据可选配置参数两部分,再分别传给_Function实例。

修改后的augment方法代码如下:

def augment(self, df, concat=False):
    # 拆分输入数据(函数要求的序列)和可选参数(函数配置项)
    input_data = {k: v for k, v in self.ta_lib_kwargs.items() if k in self.ta_lib_function.input_names}
    ta_config_params = {k: v for k, v in self.ta_lib_kwargs.items() if k not in self.ta_lib_function.input_names}
    
    # 正确调用TA-Lib函数:输入数据作为第一个参数,可选参数作为关键字参数传递
    fn_result = self.ta_lib_function(input_data, **ta_config_params)
    
    df_out = None
    if len(self.out_cols) == 1:
        df_out = pd.DataFrame(fn_result, index=df.index, columns=self.out_cols)
    else:
        df_out = pd.DataFrame()
        for i in range(len(fn_result)):
            df_out[self.out_cols[i]] = pd.Series(fn_result[i], index=df.index)
    return df_out

关键说明

  • self.ta_lib_function.input_names会返回当前TA-Lib函数需要的输入数据名称列表(比如MA函数返回['close']);
  • 用字典推导式把kwargs分成两部分:input_data是函数需要的时间序列,ta_config_params是可选的配置参数;
  • 调用self.ta_lib_function(input_data, **ta_config_params)时,_Function会正确识别输入数据和可选参数,这样你的timeperiod=100matype=0就会正常生效了。

你可以加一行打印验证拆分是否正确:

print(self.ta_lib_function.input_names)  # MA函数会输出 ['close']

内容的提问来源于stack exchange,提问作者Slappy

火山引擎 最新活动