对以下链接进行了调查,但没有为我提供正在寻找/解决问题的答案:First,Second。
由于机密性问题,我无法发布实际的分解信息,我可以显示当前代码并给出数据集的长度,如果还不够的话,我将删除问题。
import numpy as np
from statsmodels.tsa import seasonal
def stl_decomposition(data):
data = np.array(data)
data = [item for sublist in data for item in sublist]
decomposed = seasonal.seasonal_decompose(x=data, freq=12)
seas = decomposed.seasonal
trend = decomposed.trend
res = decomposed.resid
在一个图中,它表明它根据加性模型正确分解。但是,趋势列表和残差列表在前六个月和最后六个月具有NaN值。当前数据集的大小为10 * 12。理想情况下,此方法应仅工作两年即可。
这是否仍然像第一个链接中所述的那么小?即我需要自己推断出加分吗?
编辑:似乎在趋势和残差的两端,总有一半的频率是NaN。对于减小数据集的大小,这一点仍然适用。
答案 0 :(得分:2)
根据此Github链接,另一个用户也有类似的问题。他们“解决”了这个问题。为了避免NaN,可以传递一个额外的参数。
decomposed = seasonal.seasonal_decompose(x=data, freq=12, extrapolate_trend='freq')
然后将使用线性最小二乘法来最佳近似值。 (Source)
很显然,这些信息确实是在他们的文档中,并且经过了清楚的解释,但我完全错过了/对其进行了误解。因此,我要为遇到同样问题的人回答自己的问题,以使他们免于经历我的冒险。
答案 1 :(得分:0)
根据下面的参数定义,将extrapolate_trend设置为0以外的值会使趋势估计恢复为其他估计方法。当我有一些估计结果时,我遇到了这个问题。
extrapolate_trend : int or 'freq', optional
If set to > 0, the trend resulting from the convolution is
linear least-squares extrapolated on both ends (or the single one
if two_sided is False) considering this many (+1) closest points.
If set to 'freq', use `freq` closest points. Setting this parameter
results in no NaN values in trend or resid components.