2016-11-11 460 views
0

我有一个python算法,它工作得很好。我输入一个最小关键词(“MinScore”),算法运行并预设结果。典型的MinScore值在0.2到0.99之间。Python Scipy的优化错误“ValueError:长度必须匹配比较”

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

这是我如何调用优化功能:

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

这是从优化过程中的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的值时,它可以完美工作。

期待您的建议! :-)

回答

0

好吧,我想我在这里找到了根本原因。

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

在您的示例中,Optimal_Score是一个对象。我怀疑你试图将Optimal_Score.x作为float传递给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) 

这将返回大熊猫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 

如果指数从列表 'Optimal_Score.x' 浮动的问题解决了。

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] 
+0

感谢Vtour,但是where语句运行良好,我已经运行了很多次了,并且有了工作数据。我认为问题出在我的scipy功能上? – cwse

+0

错误表示您在声明中比较了不同的长度: BRMalg股票[股票] ['持有'] =(股票[股票] ['持有']其中(股票[股票] ['TOTAL_SCORE_'+ MarketIndex +' _'+ str(BetaWindow)]。shift(1) 2016-11-11 03:58:16

+0

感谢Vtour,这看起来像你可能正在做的事!目前在夏威夷,但将检查我的回报:-) – cwse

相关问题