x and y must have same first dimension, but have shapes (1,) and (50,) - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: x and y must have same first dimension, but have shapes (1,) and (50,) (/thread-39162.html) |
x and y must have same first dimension, but have shapes (1,) and (50,) - asja2010 - Jan-11-2023 Hey there python community, after successfully plotting a graph, when it comes to plotting the frontier of it, I get this message: ValueError: x and y must have same first dimension, but have shapes (1,) and (50,)This is the graph: plt.figure(figsize=(22,7)) plt.scatter(expectedVolatility,expectedReturn,c=sharpeRatio) plt.xlabel('expected volatility') plt.ylabel('expected log returns') plt.colorbar(label='sharpe ratio') plt.scatter(expectedVolatility[maxIndex],expectedReturn[maxIndex],c='red') plt.plot(volatility_opt,returns, '--') plt.show()I know this kind of error is very common and in my humble opinion probably it arises from here: returns = np.linspace(0, 1.50, num= 50, endpoint=True, retstep=False, dtype=None, axis=0) volatility_opt = []and the output is volatility_opt [10.194341397342678]as the volatility_opt shouldn't be obviously just one value. I can't find yet precisely the origin, where could it be? RE: x and y must have same first dimension, but have shapes (1,) and (50,) - deanhystad - Jan-11-2023 Include entire error message, including stack trace. If you post code, please post the code that is related to the issue. You say that volatility_opt should not be just one value, but you don't include any code showing how volatility opt is generated. RE: x and y must have same first dimension, but have shapes (1,) and (50,) - asja2010 - Jan-12-2023 The error message is the following: ValueError Traceback (most recent call last) <ipython-input-182-1237a1515f04> in <module> 5 plt.colorbar(label='sharpe ratio') 6 plt.scatter(expectedVolatility[maxIndex],expectedReturn[maxIndex],c='red') ----> 7 plt.plot(volatility_opt,returns, '--') 8 plt.show() C:\Anaconda3\lib\site-packages\matplotlib\pyplot.py in plot(scalex, scaley, data, *args, **kwargs) 2838 @_copy_docstring_and_deprecators(Axes.plot) 2839 def plot(*args, scalex=True, scaley=True, data=None, **kwargs): -> 2840 return gca().plot( 2841 *args, scalex=scalex, scaley=scaley, 2842 **({"data": data} if data is not None else {}), **kwargs) C:\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in plot(self, scalex, scaley, data, *args, **kwargs) 1741 """ 1742 kwargs = cbook.normalize_kwargs(kwargs, mlines.Line2D) -> 1743 lines = [*self._get_lines(*args, data=data, **kwargs)] 1744 for line in lines: 1745 self.add_line(line) C:\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in __call__(self, data, *args, **kwargs) 271 this += args[0], 272 args = args[1:] --> 273 yield from self._plot_args(this, kwargs) 274 275 def get_next_color(self): C:\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in _plot_args(self, tup, kwargs) 397 398 if x.shape[0] != y.shape[0]: --> 399 raise ValueError(f"x and y must have same first dimension, but " 400 f"have shapes {x.shape} and {y.shape}") 401 if x.ndim > 2 or y.ndim > 2: ValueError: x and y must have same first dimension, but have shapes (1,) and (50,)For what concerns volatility_opt: def negativeSR(w): w = np.array(w) R = np.sum(meanlogReturns*w) V = np.sqrt(np.dot(w.T, np.dot(Sigma,w))) SR = R/V return -1*SR def b(w): return np.sum(w)-1 w0 = [0.25, 0.25, 0.25, 0.25] bounds = ((0,1), (0,1), (0,1), (0,1)) constraints = ({'type': 'eq', 'fun': b}) w_opt = minimize(negativeSR, w0, method='SLSQP', bounds=bounds, constraints=constraints) w_opt returns = np.linspace(0, 1.50, num= 50, endpoint=True, retstep=False, dtype=None, axis=0) volatility_opt = [] def GR(w): w = np.array(w) R = np.sum(meanlogReturns*w) return R def minimizeMyvolatility(w): w =np.array(w) V = np.sqrt(np.dot(w.T, np.dot(Sigma, w))) return V for R in returns: constraints = ({'type': 'eq', 'fun': b}, {'type': 'eq', 'fun': lambda w: GR(w) - R}) opt = minimize(minimizeMyvolatility, w0, method = 'SLSQP', bounds = bounds, constraints = constraints) volatility_opt.append(opt['fun'])with b as : def b(w): return np.sum(w)-1and Sigma and w as : weight = np.zeros((a, 4)) expectedReturn = np.zeros(a) expectedVolatility = np.zeros(a) sharpeRatio = np.zeros(a) meanlogReturns = logReturns.mean() Sigma = logReturns.cov() for k in range(a): w = np.array(np.random.random(4)) w = w / np.sum(w) weight[k,:] = wReturns of 4 tickers from yahoo lib with their closing price from 4/01/22 to 4/01/22 (or 01/4/22 to 10/4/22). LogReturns is just the log function of returns multiplied by 250 days. In fact, till the Sharpe Ratio and the frontier's plot everything was running smoothly. RE: x and y must have same first dimension, but have shapes (1,) and (50,) - deanhystad - Jan-12-2023 An indentation error? for R in returns: constraints = ({'type': 'eq', 'fun': b}, {'type': 'eq', 'fun': lambda w: GR(w) - R}) opt = minimize(minimizeMyvolatility, w0, method = 'SLSQP', bounds = bounds, constraints = constraints) --->volatility_opt.append(opt['fun']) RE: x and y must have same first dimension, but have shapes (1,) and (50,) - asja2010 - Jan-12-2023 (Jan-12-2023, 03:46 PM)deanhystad Wrote: An indentation error? Yes, that's it, now it works! I've triple-checked everything and as a pure rookie, I haven't considered the indentation... Thank you very much for real, mr. Deanhystad :) RE: x and y must have same first dimension, but have shapes (1,) and (50,) - deanhystad - Jan-12-2023 In Python, indentation is code. |