Python Scipy优化错误“ValueError:长度必须匹配才能比较”

时间:2016-11-11 02:28:16

标签: python pandas optimization scipy minimize

我有一个python算法,完全正常。我输入了最小标准(“MinScore”),算法运行并预先输出结果。典型的MinScore值介于0.2和0.99之间。

但是为什么我使用scipy optimize来尝试找到MinScore值的最低算法输出,我得到以下错误:“ValueError:长度必须匹配才能比较”。

这就是我调用Optimize函数的方法:

Optimal_Score = spo.minimize(BRMalg, 0.81, method='SLSQP',
options={'disp':True}, bounds=[(-1.00,1.00)])

这是来自Optimize过程的algorthim错误的地方:

MinHoldScore = MinScore
Stocks['HOLD'] = (Stocks['HOLD'].where(Stocks['Total Score'].shift(1) < MinScore, True).where(Stocks['Total Score'].shift(1) >= MinHoldScore, False).ffill().fillna(False).astype(bool))

这是完整的错误消息:

> Traceback (most recent call last):
File "\\PYTHON CODE.py", line 327, in <module>
> Optimal_Score = spo.minimize(BRMalg, 0.81, method='SLSQP', options={'disp':True}, bounds=[(-1.00,1.00)])   
File "C:\\scipy\optimize\_minimize.py",
> line 455, in minimize constraints, callback=callback, **options)   
File "C:\Users\\scipy\optimize\slsqp.py",
> line 363, in _minimize_slsqp fx = func(x)   
File "C:\Users\\scipy\optimize\optimize.py",
> line 289, in function_wrapper return function(*(wrapper_args + args))
File "T:\\PYTHON CODE.py", line 288, in BRMalg
> Stocks[Ticker]['HOLD'] = (Stocks[Ticker]['HOLD'].where(Stocks[Ticker]['TOTAL_SCORE_'+MarketIndex+'_'+str(BetaWindow)].shift(1) < MinBuyScore, True)
File "C:\Users\\pandas\core\ops.py", 
> line 740, in wrapper raise ValueError('Lengths must match to compare') ValueError: Lengths must match to compare

任何想法?非常奇怪的是,当不使用SCIPY OPTIMIZE并且仅传递MinScore = 0.82的值时,它完全有效。

期待您的建议! : - )

1 个答案:

答案 0 :(得分:0)

好的,我认为我找到了根本原因。

scipy.optimize.minimize的docs状态返回表示为OptimizeResult对象的优化结果。重要的属性是:x解决方案数组。

在您的示例中,Optimal_Score是一个对象。我怀疑你试图将Optimal_Score.x作为浮点数传递给MinBuyValue,但它实际上是一个列表。

让我举一个玩具版本。

BRMalg = lambda x: 1 + x + x ** 2 - x ** 3
Optimal_Score = minimize(BRMalg, 0.5, method='SLSQP', options={'disp': True}, bounds=[(-1.00, 1.00)])
print(Optimal_Score.x)
adict = {'Ticker': ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'],
         'Total_Score': [1, 2, 3, 4, 5, 6],
         'HOLD': [False, False, False, False, False, False]}
Stocks = pd.DataFrame(adict)
Stocks.set_index('Ticker', inplace=True)
Stocks['HOLD'] = Stocks['HOLD'].where(Stocks['Total_Score'].shift(1) < Optimal_Score.x, True)

这将返回pandas ValueError:

Optimization terminated successfully.    (Exit mode 0)
Traceback (most recent call last):
Stocks['HOLD'] = Stocks['HOLD'].where(Stocks['Total_Score'].shift(1) < Optimal_Score.x, True)
File "\pandas\core\ops.py", line 822, in wrapper raise ValueError('Lengths must match to compare')
ValueError: Lengths must match to compare
[-0.33315628]
Process finished with exit code 1

如果我们从列表&#39; Optimal_Score.x&#39;中索引浮点数。问题得到解决。

Stocks['HOLD'] = Stocks['HOLD'].where(Stocks['Total_Score'].shift(1) < Optimal_Score.x[0], True)
Optimization terminated successfully.    (Exit mode 0)
        Current function value: [ 0.81481488]
        Iterations: 7
        Function evaluations: 21
        Gradient evaluations: 7
[-0.33315628]