Python中关于间歇性需求的Croston方法

2024-09-30 16:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在与克罗斯顿的方法作斗争,我正在间歇性需求数据集上应用该方法。 我使用的库如下: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左右。我不知道我做错了什么。当然,我希望更好地估计间歇性需求

为了提高拟合度,我研究了论坛的解决方案,但没有找到任何解决方案。我还尝试切换方法('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)

其中,天=365,年=6,需求周期=3,间隔=15,停止=0,间歇=4,错误=np.random.normal(平均值,2dev,天years)


Tags: 数据方法timenpdtdaystempstop