克罗斯顿在 Python 中处理间歇性需求的方法

问题描述

我正在努力使用 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 (将#修改为@)