问题描述
我正在努力使用 Croston 的方法,我将其应用于间歇性需求数据集。 我使用的库如下:https://pypi.org/project/croston//.
我使用的数据集由 6 年的间歇性需求数据组成:Erratic and intermittent demand datasets。间歇性需求模式以红色显示。从图中可以看出,需求时段的无需求切换间隔。根据 Syntetos、Boylan 和 Croston (2005) 的说法,间隔的平均长度为 15,需求的平均长度为 3,因此 ADI 为 5,这使其成为间歇性需求序列。我使用的代码是这样的:
Crost1 = croston.fit_croston(intermittent_time_series['D'],1,'original')
Croston = pd.DataFrame(np.concatenate([Crost1['croston_fittedvalues'],Crost1['croston_forecast']]))
Croston.index = pd.to_datetime(Croston.index,unit='D')
intermittent_time_series['Croston'] = Croston
虽然我得到的输出看起来很奇怪。它正确地符合前几个(零需求)观测值,但在这些观测值之后,它都给出了大约 1 的值。我想知道我做错了什么。当然,我想要更好地估计间歇性需求。
为了提高拟合度,我调查了论坛以寻求解决方案,但找不到任何解决方案。我还尝试切换方法('原始'/'sba'/'sbj'/'tsb'),并查看了源代码。不幸的是,我没有设法想出一个解决方案。
提前致谢, 大安。
编辑
我不知道如何通过 interwebz 共享数据帧,但我可以共享用于创建需求的代码:
def intermittent_demand(demand_period,interval,stop):
Dt = []
while stop < years*days:
temp = round(interval + np.random.normal(0,5,size=None))
if stop + temp > years*days:
Dt = Dt + (years*days - stop) * [0]
stop = years*days
else:
Dt = Dt + temp * [0]
stop = stop + temp
temp = round(demand_period + np.random.normal(0,1.2,size=None))
if stop + temp > years*days:
Dt = Dt + (years*days - stop) * [0]
stop = years*days
else:
Dt = Dt + temp * [1]
stop = stop + temp
for day in range(years*days):
if Dt[day] == 1:
Dt[day] = math.ceil(a_intermittent + error_inter[day])
return Dt
for day in range (days*years):
intermittent_time_series = intermittent_demand(demand_period,stop)
其中 days = 365,years = 6,demand_period = 3,interval = 15,stop = 0,a_intermittent = 4,and error_inter = 'np.random.normal(avg,2dev,days年)'
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)