使用Scipy.brute优化接收DataFrame的目标函数时参数报错如何解决
报错原因
- Scipy的
optimize.brute的args参数要求传入参数元组,你直接传入可迭代的processed对象时,Python会自动将其拆解为多个独立的位置参数传入bwp函数,你的processed共有3757行,因此会抛出“需要2个参数但收到3757个”的类型错误。 - 此前使用nelder-mead方法可正常运行,大概率是你之前传参时无意识写对了单元素元组格式。
修复方法
仅需要将args参数的取值改为单元素元组即可,在processed后补充一个英文逗号声明为元组。另外你当前bwp函数中用的processed[i, 3]是Numpy数组的索引写法,如果你传入的确实是Pandas的DataFrame,需要同步修改为iloc索引,避免后续触发索引报错。
修改后的完整代码如下:
# 修复索引写法后的目标函数 def bwp(x, processed): pred,real = x money = 1000 for i in range(0, len(processed)): if processed.iloc[i, 3] > pred and processed.iloc[i-1,4] > real: money = money + (money * processed.iloc[i, 4]) return money * -1 # 修复传参格式后的优化函数 def opt_2(processed): bounds = (slice(-1, 1), slice(-1, 1)) # 注意args参数传入的是单元素元组,后面必须加逗号 resbrute = optimize.brute(bwp, ranges=bounds, args=(processed,), full_output=True, finish=optimize.fmin) print(resbrute[0]) print(resbrute[1])
内容的提问来源于stack exchange,提问作者tribo32
相关产品推荐
相关产品推荐

