虽然这个问题似乎已经解决了很多,但我无法弄清楚为什么季节性分解在我的情况下不起作用,尽管我给出了一个带有日期时间索引的数据帧作为输入。以下是我的数据集示例:
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的输出?
答案 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)
您的代码段中有两点。
inplace=True
pd.to_datetime()
函数。