1

我正在为间歇性需求数据集应用 Croston 的方法而苦苦挣扎。我使用的库如下:https ://pypi.org/project/croston// 。

我使用的数据集包含 6 年的间歇性需求数据:不稳定和间歇性需求数据集。间歇性需求模式以红色显示。从图中可以看出,需求周期的无需求切换间隔。根据 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 的值。我想知道我做错了什么。当然,我希望更好地估计间歇性需求。

为了提高拟合度,我调查了论坛的解决方案,但我找不到任何解决方案。我还尝试切换方法('original'/'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,interval,stop)

其中 days = 365, years = 6, demand_period = 3, interval = 15, stop = 0, a_intermittent = 4, and error_inter = 'np.random.normal(avg, 2 dev, days years)'

4

0 回答 0