Python Seasonal分解Freq参数确定

时间:2018-05-31 05:12:34

标签: python statsmodels

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

    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')

但我系统地得到以下错误:

  

:你必须指定一个freq或x必须是一个带有时间序列索引的pandas对象,其频率没有设置为None

虽然我使用的是带有日期时间索引的数据框,但您能解释为什么我应该提供频率输入吗?将频率作为输入参数是否有意义,而我正在寻找季节性作为season_decompose的输出?

3 个答案:

答案 0 :(得分:1)

首先,如果将np.asarray(...)交给season_decompose,它将仅看到一个数组,索引已消失。因此,摆脱np.asarray。

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

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

如果要查找频率的缩写,它们是here

答案 1 :(得分:0)

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设置为某个值的原因。

如果你想知道season_decompose()中的频率是什么 - 它是你数据的属性。因此,如果您逐月收集数据,那么它具有每月频率。

season_decompose()用于计算频率的方法是:_maybe_get_pandas_wrapper_freq()。

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

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

结帐 - _maybe_get_pandas_wrapper_freq https://searchcode.com/codesearch/view/86129760/

希望这有帮助! 如果你发现了一些有趣的东西,请告诉我。

答案 2 :(得分:0)

您的代码段中有两点。

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