Истинная ценность Серии неоднозначна.Используйте a.empty, a.bool (), a.item (), a.any () или a.all () для np.argmax - PullRequest
0 голосов
/ 16 апреля 2019

Я получаю сообщение об ошибке:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Даже если я не оцениваю никаких заявлений. Ошибка появляется, когда я пытаюсь передать это

max_sharpe_idx = np.argmax(results[2])

, где результаты ранее были переданы как

results = np.zeros((3,num_portfolios), object)

и результаты [2] - это массив чисел с плавающей точкой.

Почему возникает эта ошибка, я не могу понять, какие-либо мысли? Может предоставить все функции в случае необходимости.

РЕДАКТИРОВАТЬ: функция, заполняющая результаты:

def random_portfolios(num_portfolios, mean_returns, cov_matrix, risk_free_rate):
    results = np.zeros((3,num_portfolios), object)
    weights_record = []
    for i in range(num_portfolios):
        weights = np.random.random(12)
        weights /= np.sum(weights)
        weights_record.append(weights)
        portfolio_std_dev, portfolio_return = portfolio_annualised_performance(weights, mean_returns, cov_matrix)
        results[0,i] = portfolio_std_dev
        results[1,i] = portfolio_return
        results[2,i] = (portfolio_return - risk_free_rate) / portfolio_std_dev
    return results, weights_record

ОБНОВЛЕНИЕ: при печати типа результатов и результатов [2,0] это вывод:

results: <class 'numpy.ndarray'>
results[2,0]: <class 'pandas.core.series.Series'>

Переменная, которая, вероятно, вызывает проблему:

portfolio_return <class 'pandas.core.series.Series'>

Выходные данные портфолио возвращаются следующим образом:

ABB.ST          0.043190
ALFA.ST         0.015955
AMD             0.031319
SAAB-B.ST       0.018625
ERIC-B.ST       0.080382
FORTUM.HE       0.013456
INVE-B.ST       0.044658
NDA-SE.ST       0.027568
NOKIA-SEK.ST    0.040725
SWED-A.ST       0.013694
TEL2-B.ST       0.038682
VOLV-B.ST       0.003941
dtype: float64

Поскольку возврат портфеля является результатом:

mean_returns = returns.mean()
pandas.core.series.Series

Как мне обойти это? Полный код при необходимости: https://github.com/timoudas/PortfolioOpt Но вывод заключается в том, что существуют проблемы со структурой данных, которые я не знаю, как решить

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Давайте серьезно отнесемся к сообщению об ошибке:

ValueError: Значение истинности Серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Проблема должна быть элементом массива, который является пандой Series!

In [145]: import pandas as pd                                                   
In [146]: S = pd.Series(np.arange(10))                                          

In [148]: x = np.empty(3,object)                                                
In [150]: x[:]=[S,S,S]                                                          
In [151]: x                                                                     
Out[151]: 
array([0    0
1    1
2    2
3    3
4    4
5    5
6    6
....
9    9
dtype: int64], dtype=object)

Теперь я могу воссоздать ваше сообщение об ошибке:

In [152]: np.argmax(x)                                                          
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-152-81bcc042be54> in <module>
----> 1 np.argmax(x)

/usr/local/lib/python3.6/dist-packages/numpy/core/fromnumeric.py in argmax(a, axis, out)
   1101 
   1102     """
-> 1103     return _wrapfunc(a, 'argmax', axis=axis, out=out)
   1104 
   1105 

/usr/local/lib/python3.6/dist-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
     54 def _wrapfunc(obj, method, *args, **kwds):
     55     try:
---> 56         return getattr(obj, method)(*args, **kwds)
     57 
     58     # An AttributeError occurs if the object does not have

/usr/local/lib/python3.6/dist-packages/pandas/core/generic.py in __nonzero__(self)
   1477         raise ValueError("The truth value of a {0} is ambiguous. "
   1478                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1479                          .format(self.__class__.__name__))
   1480 
   1481     __bool__ = __nonzero__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Итак, у вас должен быть массив объектов, который содержит один или несколько Series

Вы даете некоторый код, но не указываете характер (type) переменных:

results[2,i] = (portfolio_return - risk_free_rate) / portfolio_std_dev
0 голосов
/ 17 апреля 2019

Кажется, что results[2] не является массивом с плавающей точкой, иначе то, что вы предоставили, сработало бы.Если конвертация возможна,

np.argmax(results[2].astype(float)) 

должен сделать это.Если это приводит к

ValueError: установка элемента массива с последовательностью.

тогда, я думаю, причина в том, что ваш массив numpy содержит не только числа, но и другие объекты, такие как строки.Ваш массив, изначально имеющий тип object, делает это очень вероятным.Я бы порекомендовал взглянуть на этот пост, а также убедиться, что ваш объект определенно не содержит ничего, кроме чисел с плавающей запятой / целых чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...