Matplotlib错误:x和y必须具有相同的第一个维度,但具有形状(100,)和(449,) &g



我正试图了解更多关于隐马尔可夫,并在网上找到了这个代码。除了最后出现ValueError: x和y必须具有相同的第一维,但具有形状(100,)和(449,),引用这行:---->当试图绘制最终结果时,使用plt.plot(predicted_dates,close_val[N+1:-246])。

你得原谅我,这是我玩python和jupyter笔记本的第5天,所以如果你能像个孩子(没有编程经验)一样给我解释一下,我会很感激的。

%matplotlib inline
import datetime
import numpy as np
import pandas as pd
from pandas_datareader import data 
from hmmlearn.hmm import GaussianHMM
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.dates import YearLocator, MonthLocator
import warnings
warnings.filterwarnings('ignore')
ticker = 'EA'
start_date = datetime.date(2019, 1, 1)
end_date = datetime.date.today()
Stocks = data.DataReader(ticker, 'yahoo', start_date, end_date)
Stocks.reset_index(inplace = True, drop=False)
Stocks.drop(['Open', 'High', 'Low', 'Adj Close', 'Volume'], axis=1, inplace=True)
Stocks['Date'] = Stocks['Date'].apply(datetime.datetime.toordinal)
Stocks = list(Stocks.itertuples(index=False, name=None))
dates = np.array([q[0] for q in Stocks], dtype=int)
close_val = np.array([q[1] for q in Stocks])
close = [close_val[j] / close_val[j-1] for j in range(1, len(close_val))]
fig = plt.figure()
fig, ax = plt.subplots(figsize=(12,8))
plt.title('Stock Price over Time (EA)', fontsize=14)
ax.plot_date(dates, close_val, '-', label='Close')
plt.gca().xaxis.set_major_locator(MonthLocator())
plt.xlabel('Date', fontsize = 14)
plt.ylabel('Close (price)', fontsize = 14)
plt.legend()
ax.autoscale_view()
fig.autofmt_xdate()
plt.show()
N = 5
train_x = list(map(lambda el:[el], close[:N]))
model = GaussianHMM(n_components=2, covariance_type='diag', n_iter=1000)
predicted_prices = []
predicted_dates = []
for idx in range(100):
model.fit(train_x)
state = model.predict(train_x)[-1]
means = model.means_[state]
current_price = Stocks[N+idx][1]
current_date = datetime.date.fromordinal(dates[N+idx])
predicted_date = current_date + datetime.timedelta(days=1)
predicted_dates.append(predicted_date)
train_x.append([means[0]])
predicted_prices.append(current_price * means[0])
train_x.pop(0)

print('Actual:',close_val[N+1:-246], 'n','Prediction:', predicted_prices)
plt.figure(figsize=(12,8))
plt.title('Close (price)', fontsize=14)
**plt.plot(predicted_dates,close_val[N+1:-246])**
plt.plot(predicted_dates,predicted_prices)
plt.legend(['Actual', 'Predicted'])
plt.grid(True)
plt.show()

我将-246改为-595,这样形状将是1:1,它解决了这个问题。虽然我不完全明白发生了什么,但这是解决办法。

相关内容