微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决克罗斯顿在 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 举报,一经查实,本站将立刻删除。