- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正确执行加法模型有一些问题。
我有那个数据框:
当我运行此代码时:
import statsmodels as sm
import statsmodels.api as sm
decomposition = sm.tsa.seasonal_decompose(df, model = 'additive')
fig = decomposition.plot()
matplotlib.rcParams['figure.figsize'] = [9.0,5.0]
我收到了这条消息:
最佳答案
具有相同的 ValueError,这只是我自己的一些测试和少量研究的结果,并没有声称它是完整或专业的。请评论或回答任何发现错误的人。
当然,您的数据应该按索引值的正确顺序排列,您可以使用 df.sort_index(inplace=True)
来保证这一点。 ,正如您在回答中所述。这本身并没有错,尽管错误消息与排序顺序无关,而且我已经检查过这一点:在我对手头的巨大数据集的索引进行排序时,错误不会消失。是的,我也必须对 df.index 进行排序,但是分解()也可以处理未排序的数据以及项目在此处和那里及时跳转的情况:然后您只需从左到右再向后得到很多蓝线,直到整个图形都充满它。更重要的是,通常,排序已经是正确的顺序了。就我而言,排序无助于修复错误。因此,我也怀疑索引排序是否修复了您的情况下的错误,因为:错误实际上说明了什么?
值错误:您必须指定:
Period of the series. Must be used if x is not a pandas object or ifthe index of x does not have a frequency. Overrides defaultperiodicity of x if x is a pandas object with a timeseries index.
period = len(df_nested)
(= 周期数)以获得季节性和趋势的最佳分割。如果每个周期的元素随时间变化,其他值可能会更好。
len(df_unnested)/2
.
period = 10
.
period=20
相反,这会引发以下错误:
ValueError: x must have 2 complete cycles requires 40observations. x only has 20 observation(s)
period = 1
应该已经把它拿走了,但是对于时间序列分析,“=1”并没有揭示任何新东西,每个周期只有1个项目,趋势与原始数据相同,季节性为0,残差始终为0.
df_test = pd.DataFrame({'timestamp': [1462352000000000000, 1462352100000000000, 1462352200000000000, 1462352300000000000],
'listData': [[1,2,1,9], [2,2,3,0], [1,3,3,0], [1,1,3,9]],
'duration_sec': [3.0, 3.0, 3.0, 3.0]})
tdi = pd.DatetimeIndex(df_test.timestamp)
df_test.set_index(tdi, inplace=True)
df_test.drop(columns='timestamp', inplace=True)
df_test.index.name = 'datetimeindex'
df_test = df_test.explode('listData')
sizes = df_test.groupby(level=0)['listData'].transform('size').sub(1)
duration = df_test['duration_sec'].div(sizes)
df_test.index += pd.to_timedelta(df_test.groupby(level=0).cumcount() * duration, unit='s')
结果 df_test['listData'] 如下所示:
2016-05-04 08:53:20 1
2016-05-04 08:53:21 2
2016-05-04 08:53:22 1
2016-05-04 08:53:23 9
2016-05-04 08:55:00 2
2016-05-04 08:55:01 2
2016-05-04 08:55:02 3
2016-05-04 08:55:03 0
2016-05-04 08:56:40 1
2016-05-04 08:56:41 3
2016-05-04 08:56:42 3
2016-05-04 08:56:43 0
2016-05-04 08:58:20 1
2016-05-04 08:58:21 1
2016-05-04 08:58:22 3
2016-05-04 08:58:23 9
现在看看不同时期的整数值。
period = 1
:
result_add = seasonal_decompose(x=df_test['listData'], model='additive', extrapolate_trend='freq', period=1)
plt.rcParams.update({'figure.figsize': (5,5)})
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()
period = 2
:
result_add = seasonal_decompose(x=df_test['listData'], model='additive', extrapolate_trend='freq', period=2)
plt.rcParams.update({'figure.figsize': (5,5)})
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()
period = 4
:
result_add = seasonal_decompose(x=df_test['listData'], model='additive', extrapolate_trend='freq', period=int(len(df_test)/4))
plt.rcParams.update({'figure.figsize': (5,5)})
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()
period = 8
:
result_add = seasonal_decompose(x=df_test['listData'], model='additive', extrapolate_trend='freq', period=int(len(df_test)/2))
plt.rcParams.update({'figure.figsize': (5,5)})
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()
sm.tsa.seasonal_decompose(df, model = 'additive', period = int(len(df)/2))
2. 的详细信息:“... 或 x 必须是一个带有 DatetimeIndex 且频率未设置为 None 的 Pandas 对象”
sm.tsa.seasonal_decompose(df.asfreq('MS'), model = 'additive')
见
How to set frequency with pd.to_datetime()?有关更多详细信息,以及有关如何处理差距的信息。
df_test.asfreq('s')
的输出(=频率以秒为单位):
2016-05-04 08:53:20 1
2016-05-04 08:53:21 2
2016-05-04 08:53:22 1
2016-05-04 08:53:23 9
2016-05-04 08:53:24 NaN
...
2016-05-04 08:58:19 NaN
2016-05-04 08:58:20 1
2016-05-04 08:58:21 1
2016-05-04 08:58:22 3
2016-05-04 08:58:23 9
Freq: S, Name: listData, Length: 304, dtype: object
你在这里看到,虽然我的数据只有 16 行,但引入以秒为单位的频率迫使 df 为 304 行,只能从“08:53:20”到“08:58:23”,这里造成 288 个间隙.更重要的是,在这里你必须打准确的时间。如果您将 0.1 甚至 0.12314 秒作为您的实际频率,则您将不会命中大多数带有索引的项目。
df_test.asfreq('min')
:
2016-05-04 08:53:20 1
2016-05-04 08:54:20 NaN
2016-05-04 08:55:20 NaN
2016-05-04 08:56:20 NaN
2016-05-04 08:57:20 NaN
2016-05-04 08:58:20 1
我们看到只有第一分钟和最后一分钟被填满,其余的没有被击中。
df_test.asfreq('d')
:
2016-05-04 08:53:20 1
我们看到您只得到第一行作为结果 df,因为只有一天覆盖。它会给你找到的第一个项目,其余的被丢弃。
关于python - 分解()时间序列 : ValueError: You must specify a period or x must be a pandas object with a DatetimeIndex with a freq not set to None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60017052/
我是一名优秀的程序员,十分优秀!