"LinAlgError: задан 0-мерный массив. Массив должен быть как минимум двухмерным", НО я знаю, что передаю двухмерный аргумент - PullRequest
0 голосов
/ 20 марта 2020

Мой первый вопрос, так что благодарен за отзыв о том, как лучше помочь вам помочь мне:)

На моей маме c (Мохаве, 10.14.6 с Python версия 3.7.6.final. 0), я получаю вышеуказанную ошибку.
Я подтвердил, что моя матрица аргументов имеет 2 измерения (8 x 8). Я работал через Traceback и успешно использовал соответствующую матрицу аргументов в каждой из подфункций, но не в основной функции "monteCarlo".

Кстати, это код из книги Маркоса Лопеса де Прадо "ROBUST" ОЦЕНКА ЭФФЕКТИВНОГО ГРАНИЦА "Я сделал несколько модификаций, когда код устарел (2. *), а некоторые другие, чтобы убедиться, что я работаю с ожидаемой матрицей.

Большое, большое спасибо intrepid, кто заботится и осмеливается прочитать все это.

Ниже сообщения об ошибке приведен фрагмент кода и результаты, вырезанные из Jupyter Notebook.


> 
LinAlgError                               Traceback (most recent call last)
<ipython-input-313-a5db76f0dc0a> in <module>
----> 1 monteCarlo(mu0=hist_ann_px_chg, cov0 = CovMatrix, nObs = NumObs, nSims=500, bWidth=.25, minVarPortf = False, shrink=False)
> 
<ipython-input-308-b7fbaf4dca14> in monteCarlo(mu0, cov0, nObs, nSims, bWidth, minVarPortf, shrink)
      5         mu1,cov1=simCovMu(mu0,cov0,nObs,shrink)
      6         if minVarPortf:mu1=None
----> 7         if bWidth>0:cov1=deNoiseCov(cov1,nObs*1./cov1.shape[1],bWidth)
      8         w1.loc[i]=optPort(cov1,mu1).values.flatten()
      9         w1_d.loc[i]=optPort_nco(cov1,mu1,int(cov1.shape[0]/2)).values.flatten()
> 
<ipython-input-306-062b76320e88> in deNoiseCov(cov0, q, bWidth)
     35 def deNoiseCov(cov0,q,bWidth):
     36     corr0=cov2corr(cov0)
---> 37     eVal0,eVec0=getPCA(corr0)
     38     eMax0,var0=findMaxEval(np.diag(eVal0),q,bWidth)
     39     nFacts0=eVal0.shape[0]-np.diag(eVal0)[::-1].searchsorted(eMax0)
> 
<ipython-input-306-062b76320e88> in getPCA(matrix)
     16 def getPCA(matrix):
     17 # Get eVal,eVec from a Hermitian matrix
---> 18     eVal,eVec=np.linalg.eigh(matrix)
     19     indices=eVal.argsort()[::-1] # arguments for sorting eVal desc
     20     eVal,eVec=eVal[indices],eVec[:,indices]
> 
<__array_function__ internals> in eigh(*args, **kwargs)
> 
~/opt/anaconda3/lib/python3.7/site-packages/numpy/linalg/linalg.py in eigh(a, UPLO)
   1432 
   1433     a, wrap = _makearray(a)
-> 1434     _assert_stacked_2d(a)
   1435     _assert_stacked_square(a)
   1436     t, result_t = _commonType(a)
> 
~/opt/anaconda3/lib/python3.7/site-packages/numpy/linalg/linalg.py in _assert_stacked_2d(*arrays)
    205         if a.ndim < 2:
    206             raise LinAlgError('%d-dimensional array given. Array must be '
--> 207                     'at least two-dimensional' % a.ndim)
    208 
    209 def _assert_stacked_square(*arrays):
> 
LinAlgError: 0-dimensional array given. Array must be at least two-dimensional

Ниже приведено функция, которая выдает ошибку при вызове с этим оператором:

monteCarlo(mu0=hist_ann_px_chg, cov0 = CovMatrix, nObs = NumObs, nSims=500, bWidth=.25, minVarPortf = False, shrink=False)

import pandas as pd
from scipy import stats
from pandas_datareader import data as pdr
from pandas.util.testing import assert_frame_equal
import yfinance as yf


yf.pdr_override() # <== that's all it takes :-)

# download dataframe
hist_data = pdr.get_data_yahoo("^GSPC ^VIX ^DJI ^IXIC ^FTSE ^GDAXI ^STOXX50E ^N225", start="2015-01-01", end="2020-01-1")
hist_data = hist_data.iloc[:,0:8]
hist_dly_px_chg = hist_data.pct_change()


NumObs = hist_dly_px_chg.shape[0]
CovMatrix = hist_dly_px_chg.cov()
print(type(CovMatrix)) # data.frame

CovMatrix = np.matrix(CovMatrix) # matrix (8 x 8)
print(type(CovMatrix))
print(CovMatrix.shape)
print(CovMatrix.ndim)
hist_ann_px_chg = hist_dly_px_chg.mean()
print(hist_ann_px_chg*NumObs)

Когда я вызываю эту функцию:

print(np.linalg.eigh(CovMatrix))

я получаю Я думаю, что ожидал, поэтому я не могу сказать, где разъединение:


(array([9.76607795e-07, 9.09734518e-06, 1.06092016e-05, 2.18149708e-05,
   7.30351257e-05, 1.16439127e-04, 2.39270121e-04, 7.82633431e-03]), matrix([[-4.82280240e-01, -4.58375572e-01, -5.31172874e-01,
      3.50650316e-02, -4.92673400e-01, -9.94286171e-02,
      1.25967021e-01,  7.37740277e-02],
    [-2.33051153e-02,  3.95717701e-02,  7.84798502e-02,
      8.95759250e-01,  1.02359842e-01, -1.47818043e-01,
      3.93700956e-01,  4.49340838e-02],
    [ 2.54965439e-02, -5.36050910e-01,  4.44240943e-01,
     -3.24298395e-01,  1.74936958e-01, -2.59428034e-01,
      5.54982822e-01,  5.97336351e-02],
    [ 8.28138825e-01, -8.35526265e-02, -1.54346913e-01,
      2.26457229e-02, -5.01976954e-01, -1.04165506e-01,
      1.19382708e-01,  7.60638006e-02],
    [-2.83219910e-01,  4.59584143e-01,  5.09453905e-01,
     -8.28536548e-02, -6.32657429e-01, -1.32770810e-01,
      1.28593449e-01,  8.79835438e-02],
    [ 1.06886068e-03, -7.82137852e-03,  1.94908915e-02,
     -2.38832357e-02, -9.03973958e-02,  9.05732488e-01,
      4.12218925e-01,  2.32359154e-02],
    [-1.33763053e-02,  5.31709637e-01, -4.80196149e-01,
     -2.88561906e-01,  2.10778168e-01, -2.24495845e-01,
      5.52334217e-01,  5.78853425e-02],
    [ 2.25154661e-03,  6.27599544e-04, -3.43348735e-03,
      6.49094855e-04, -1.06569389e-01, -4.16245867e-02,
      1.23854342e-01, -9.85673773e-01]]))

1 Ответ

0 голосов
/ 20 марта 2020

Так кому я должен верить, вам или компьютеру?

Давайте посмотрим на ошибку. На самом низком уровне a находится проблемный массив. Наблюдая, мы видим, что это массив corr0, переданный getPCA: getPCA(corr0)

, который создается corr0=cov2corr(cov0), где cov0 - cov1, переданный deNoiseCov(cov1,...)

mu1,cov1=simCovMu(mu0,cov0,nObs,shrink)

Я не знаю, что делают cov2corr и simCovMu. Но так как deNoiseCov кажется вашим кодом, я предполагаю, что вы могли бы поставить туда несколько отпечатков c, проверяя форму и тип.

Поскольку этот код поступает из PY2, имейте в виду, что список из списка py2 Создатели являются генератором, как в py3. np.array(range(3)) все еще работает, но во многих других случаях будут создаваться скалярные (0d) массивы (например, map).

Также использование np.matrix устарело; он больше не очень полезен - но он все еще работает (поэтому, вероятно, не является причиной ошибок).

...