Python 季节性分解 Freq 参数确定



尽管这个问题似乎已经解决了很多,但我无法弄清楚为什么季节性分解在我的情况下不起作用,尽管我给出了一个带有日期时间索引的数据框作为输入。这是我的数据集的示例:

Customer order actual date  Sales Volumes
0   01/01/1900                           300
1   10/03/2008                          3000
2   15/11/2013                            10
3   23/12/2013                           200
4   04/03/2014                             5
5   17/03/2014                            30
6   22/04/2014                             1
7   26/06/2014                           290
8   30/06/2014                            40

代码片段如下所示:

from statsmodels.tsa.seasonal import seasonal_decompose
df_agg['Customer order actual date'] = pd.to_datetime(df_agg['Customer order actual date'])
df_agg = df_agg.set_index('Customer order actual date')
df_agg.reset_index().sort_values('Customer order actual date', ascending=True)
decomposition = seasonal_decompose(np.asarray(df_agg['Sales Volumes'] ), model = 'multiplicative')

但是我系统地收到以下错误:

:必须指定频率,或者 x 必须是具有时间序列索引且频率未设置为"无"的 pandas 对象

您能否解释一下为什么尽管我使用的是带有日期时间索引的数据帧,但我应该给出频率输入?在我正在寻找季节性作为seasonal_decompose输出时,将频率作为输入参数是否有意义?

seasonal_decompose 函数通过inferred_freq获取频率。 这是链接 - https://pandas-docs.github.io/pandas-docs-travis/generated/pandas.DatetimeIndex.html

另一方面,Inferred_freq由infer_freq生成,Infer_freq使用序列的值而不是索引。 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.infer_freq.html

这可能是即使使用时间序列索引也需要将 freq 设置为值的原因。

如果您想知道 seasonal_decompose(( 中的频率是多少 - 这是您数据的属性。因此,如果您逐月收集数据,那么它有每月频率。

seasonal_decompose(( 中用于计算频率的方法是:_maybe_get_pandas_wrapper_freq((。

我对seasonal_decompose((做了一些研究,这里有一些链接可以帮助你理解函数的源代码-

季节性分解的源代码 - https://github.com/statsmodels/statsmodels/blob/master/statsmodels/tsa/seasonal.py

退房 - _maybe_get_pandas_wrapper_freq https://searchcode.com/codesearch/view/86129760/

希望这有帮助! 如果您发现除此之外还有有趣的东西,请告诉我。

代码片段上的两点。

  1. 在代码的第 4 行上,您正在重置索引,但您没有将其分配给值,如果您想就地执行此操作,您应该添加inplace=True
  2. 季节性分解适用于时间序列,因此数据需要具有日期时间索引。(您可以在加载 CSV 时执行此操作,也可以使用pd.to_datetime()函数。

首先,如果你把一个np.asarray(...(交给seasonal_decompose,它只会看到一个数组,你的索引消失了。所以摆脱np.asarray。

其次,如果你看一下df_agg['Sales Volumes'].index你会看到freq=None - 这就是导致函数抱怨的原因。你需要一个现有的频率,如D,M,等等。您可以通过df_agg.asfreq('D'(设置频率来实现频率。

最后但并非最不重要的一点是:您的样本数据没有遵循任何频率 - asfreq 会填满它们 - 但你会得到大量的 NaN。

如果您想查找频率的缩写,它们就在这里。

最新更新