“ LinAlgError:给出了0维数组。数组必须至少为二维”,但我知道我正在传递2D参数

问题描述 投票:0回答:1

我的第一个问题,非常感谢您提供有关如何更好地帮助您的帮助:)

在我的Mac(Mojave,10.14.6,Python版本3.7.6.final.0)上,出现上述错误。我已经确认我的参数矩阵有2个维度(8 x 8)。我已经完成了Traceback的工作,并成功地在每个子函数中使用了相关的参数矩阵,但没有在主函数“ monteCarlo”上使用它。

BTW,这是MarcosLópezde Prado的“有效前沿的强大估算器”中的代码我对代码已经过时(2. *)进行了一些修改,并进行了一些其他修改以帮助确保我自己正在使用期望的矩阵。

非常感谢无畏的勇敢者,他们关心并敢于通读所有这些内容。

错误消息下方是从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]]))
python pandas numpy linear-algebra covariance
1个回答
0
投票

那么,您还是计算机,我应该相信谁?

让我们看看错误。在最低级别a是问题数组。往上看,我们看到它是传递给corr0getPCA数组:getPCA(corr0)

corr0=cov2corr(cov0)创建,其中cov0是传递给cov1deNoiseCov(cov1,...)

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

我不知道cov2corrsimCovMu会做什么。但是由于deNoiseCov似乎是您的代码,因此我认为您可以在此处放置一些诊断打印文件,检查形状和dtype。

由于此代码来自PY2,请注意,许多py2列表创建者都是py3中的生成器。 np.array(range(3))仍然有效,但是许多其他情况会创建标量(0d)数组(例如map)。

而且np.matrix的使用已经过时;它不再非常有用-但它仍然有效(因此可能不是错误的原因)。

© www.soinside.com 2019 - 2024. All rights reserved.