Ваша проблема в том, что вы пытаетесь изменить атрибут объекта DecomposeResult
, в то время как вы должны работать с ax
объектом.
Давайте возьмем некоторые данные игрушечного временного ряда:
from pandas_datareader import data
goog = data.DataReader("GOOG", "yahoo")["Adj Close"]
goog.plot();
![enter image description here](https://i.stack.imgur.com/DAjsw.png)
Теперь давайте сделаем желаемую декомпозицию и поместим результаты в Pandas' df
:
from statsmodels.tsa.seasonal import seasonal_decompose
s_dec_multiplicative = seasonal_decompose(goog, model = "multiplicative", freq=12)
observed = s_dec_multiplicative.observed
seasonal = s_dec_multiplicative.seasonal
residual = s_dec_multiplicative.resid
df = pd.DataFrame({"observed":observed, "seasonal":seasonal,"residual":residual}
Наконец, мы готовы к участку:
from matplotlib import dates as mdates
years = mdates.YearLocator() # only print label for the years
months = mdates.MonthLocator() # mark months as ticks
years_fmt = mdates.DateFormatter('%Y-%b')
fmt = mdates.DateFormatter('%b')
_, axes = plt.subplots(nrows=3,ncols=1, figsize=(20, 10))
for i, ax in enumerate(axes):
ax = df.iloc[:,i].plot(ax=ax)
ax.xaxis.set_major_locator(years)
ax.xaxis.set_major_formatter(years_fmt)
ax.xaxis.set_minor_locator(months)
ax.xaxis.set_minor_formatter(fmt)
ax.set_ylabel(df.iloc[:,i].name)
plt.setp(ax.xaxis.get_minorticklabels(), rotation=90)
plt.setp(ax.xaxis.get_majorticklabels(), rotation=90)
![enter image description here](https://i.stack.imgur.com/tWCxj.png)