首页 > 解决方案 > 在使用数据框的目标函数上使用 Scipy 的蛮力优化

问题描述

我有一个函数,一个目标函数,它采用时间序列数据的数据框,用于计算时间数据上的估计投资回报。该功能如下图所示:

def bwp(x, processed):
    pred,real = x
    money = 1000
    for i in range(0, len(processed)):
        if processed[i, 3] > pred and processed[i-1,4] > real:
            money = money + (money * processed[i, 4])
    return money * -1

我想最小化这个功能,它既便宜又不连续,所以我想用蛮力的方法来优化它。

我正在尝试使用以下代码对此进行优化:

def opt_2(processed):
    bounds = (slice(-1, 1), slice(-1, 1))
    resbrute = optimize.brute(bwp, ranges=bounds, args=processed, full_output=True, finish=optimize.fmin)
    print(resbrute[0])
    print(resbrute[1])

数据框“已处理”是一个包含 3757 行的数据集。运行时我得到的错误是:

TypeError: bwp() takes 2 positional arguments but 3757 were given

我不确定为什么这不起作用,因为我使用“nelder-mead”方法使用 Scipy 运行了另一个函数,并以与上面相同的方式将数据帧提供给“args”并且它能够传递数据帧通过函数。

这个事情谁有经验?

标签: pythonoptimizationscipy-optimize

解决方案


签名不应该bwp是:

# HERE ----v
def bwp(x, *processed):
    ...

而不是:

def bwp(x, processed):
    ...

推荐阅读