季节性分解:操作数无法与系列上的形状一起广播

Posted

技术标签:

【中文标题】季节性分解:操作数无法与系列上的形状一起广播【英文标题】:seasonal_decompose: operands could not be broadcast together with shapes on a series 【发布时间】:2017-07-10 22:23:23 【问题描述】:

我知道关于这个主题有很多问题,但没有一个能帮助我解决这个问题。我真的被困在这上面了。

用一个简单的系列:

0
2016-01-31  266
2016-02-29  235
2016-03-31  347
2016-04-30  514
2016-05-31  374
2016-06-30  250
2016-07-31  441
2016-08-31  422
2016-09-30  323
2016-10-31  168
2016-11-30  496
2016-12-31  303

import statsmodels.api as sm
logdf = np.log(df[0])
decompose = sm.tsa.seasonal_decompose(logdf,freq=12, model='additive')
decomplot = decompose.plot()

我不断收到:ValueError: operands could not be broadcast together with shapes (12,) (14,)

我几乎尝试了所有方法,只传递了 logdf.values,传递了一个非日志系列。它不起作用。 Numpy 和 statsmodel 版本:

print(statsmodels.__version__)
print(pd.__version__)
print(np.__version__)
0.6.1
0.18.1
1.11.3

【问题讨论】:

你的数据系列前面的零是多少?此外,如果只有一个季节,我们无法估计季节效应。没有办法将季节与趋势或其他影响区分开来。 我认为日期上方的 0 仅表示他有一个熊猫系列,并在这些日期上编入索引。 Max 是对的,熊猫系列在这些日期编入索引。为什么我们不能只用一个季节来估计一个季节效应?无论如何只是一个示例系列,我得到了一个按日期分组的更大数据集(实际上是重新采样),但我仍然得到了这个错误(我猜应该是 numpy 相关的) 你有没有发现这个问题?我也遇到了这个非常烦人的错误。 我认为freq参数应该小于时间序列长度。不是版本问题。 【参考方案1】:

正如@yoonforh 指出的那样,在我的情况下,这是通过将freq 参数设置为小于时间序列长度来解决的。例如。如果你的时间序列ts 看起来像这样:

2014-01-01    0.0
2014-02-01    0.0
2014-03-01    1.0
2014-04-01    1.0
2014-05-01    0.0
2014-06-01    1.0
2014-07-01    1.0
2014-08-01    0.0
2014-09-01    0.0
2014-10-01    1.0
2014-11-01    0.0
2014-12-01    0.0

形状是

(12,)

所以这将给出上述错误:

seasonal_decompose(ts, freq=12, model='additive')

但如果我尝试freq=11 或任何其他小于 12 的int,例如

seasonal_decompose(ts, freq=11, model='additive')

这行得通

【讨论】:

【参考方案2】:

我注意到,对于较新的 pandas 和 statsmodel 版本,它似乎可以工作。

给定一个系列:

2016-01-03    8.326275
2016-01-10    8.898229
2016-01-17    8.754792
2016-01-24    8.658172
2016-01-31    8.731659
2016-02-07    9.047233
2016-02-14    8.799662
2016-02-21    8.783549
2016-02-28    8.782783
2016-03-06    9.081825
2016-03-13    8.737934
2016-03-20    8.658693
2016-03-27    8.666475
2016-04-03    9.029178
2016-04-10    8.781555
2016-04-17    8.720787
2016-04-24    8.633909
2016-05-01    8.937744
2016-05-08    8.804925
2016-05-15    8.766862
2016-05-22    8.651899
2016-05-29    8.653645
...

和pd/sm版本:

statsmodels.__version__ 0.8.0
pandas.__version__ 0.20.1

这是结果:

import statsmodels.api as sm
logdf = np.log(df_series)
decompose = sm.tsa.seasonal_decompose(logdf, model='additive', filt=None, freq=1, two_sided=True)
decompose.plot()

我希望这也能解决你的问题。

【讨论】:

不设置freq=1会破坏分解感?如果我理解正确,季节性和剩余成分将始终为空

以上是关于季节性分解:操作数无法与系列上的形状一起广播的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:操作数无法与形状一起广播 (2501,201) (2501,)

ValueError: 操作数无法与形状 (5,) (30,) 一起广播

如何修复Tensorflow中的“ValueError:操作数无法与形状(2592,)(4,)一起广播”?

如何解释季节性分解图?

ValueError:在进行加权预测时,操作数无法与形状 (7,) (624,3) 一起广播

ValueError:操作数无法与形状一起广播 - inverse_transform- Python