首页 > 解决方案 > 用于计算python中间歇croston方法的拟合值的用户定义函数

问题描述

输入数据:-

x  0    2   0   1   0   11  0   0   0   0   2   0 6 3   0   0   0   0   0    
   7    0   0   0   0   0   0   0   3   1   0   0   1   0   1   0   0

这里我使用简单的指数平滑来计算 q_ses 和 a_ses 值。

计算:-

q     2   1    11    2    6    3    7    3    1    1    1 
a     2   2     2    5    2    1    6    8    1    3    2 
q_ses     2  1.9   2.81  2.73 3.07 3.05 3.44 3.4  3.16 2.94
a_ses     2    2      2  2.3  2.27 2.14 2.52 3.08 2.86 2.88
fitted    1  0.95  1.41  1.19 1.35 1.42 1.36 1.11 1.10 1.02

q:- non-zero elements
a:- inter-arrival time
q_ses:-alpha*at+(1-alpha)*ft
a_ses:-alpha*at+(1-alpha)*ft
fitted:-q_ses/a_ses

句法:-

#x=data series
#h=numer of periods to forecast
#alpha=simple exponential smoothing parameter

def croston(x,h,alpha=np.nan):
    if isnull(alpha):
       alpha=0.1
    y= x[x!=0].reset_index()
    y['a'] = y['index'] - y['index'].shift(1)
    y.drop('index', axis=1, inplace=True)
    y= y.bfill()

    #fitteing simple exponential smoothing 

    fit_non_zero=SimpleExpSmoothing(y.iloc[:,0]).
          fit(smoothing_level=alpha,optimized=False)

    fit_inter_arrival=SimpleExpSmoothing(y.iloc[:,1]).
           fit(smoothing_level=alpha,optimized=False)
    #fitted values for non-zero and interarrival time.

    non_zero_fitted=fit_non_zero.fittedvalues
    inter_arrival_fitted=fit_inter_arrival.fittedvalues
    final_predict=non_zero_fitted/inter_arrival_fitted

    # forecast values for h periods

    forecast_q=fit_non_zero.forecast(h)
    forecast_a=fit_inter_arrival.forecast(h)
    final_forecast=forecast_q/forecast_a
    return(final_forecast,final_predict)

通过使用上面的代码,我只得到 q 的拟合值和 a 值,即 11 个观测值,但我想要 x 中所有观测值的拟合值。

我得到了 croston 方法如何产生拟合值的逻辑,但我无法获得所需的代码。

逻辑:- 每个 non_zero 拟合值都被分配为下一个 zero_elements+下一个 non_zero 元素的拟合值。

我在计算部分提到了拟合值。

拟合值的所需输出:-

x: 0    2   0   1   0   11  0   0   0   0   2   0   6   3   0   0   0    
   0    0   7   0   0   0   0   0   0   0   3   1   0   0   1   0   1    0
fitted: NA  0   1   1   0.95    0.95    1.41    1.41    1.41    1.41    1.41     
        1.19    1.19    1.35    1.42    1.42    1.42    1.42    1.42    1.42     
        1.36    1.36    1.36    1.36    1.36    1.36    1.36    1.36    1.11     
        1.1     1.1     1.1     1.02    1.02    0.985   0.985

我想要一个python代码来获取上述输出,

我尝试了一些方法,例如找到零元素位置替换值,但在这种情况下不起作用。

请任何人都可以帮助我解决这个问题。

提前致谢。

标签: pythonintermittent

解决方案


推荐阅读