входные данные: -
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 и значений, т. е. для 11 наблюдений, но я хочу подгонянные значения для всех наблюдений в x.
Я получил логику того, как метод Кростона производит подобранные значения, но я не могучтобы получить требуемый код для этого.
логика: - каждому ненулевому подобранному значению присваиваются как подогнанные значения для следующих нулевых элементов + следующего ненулевого элемента.
я упомянул подогнаннымзначения в расчетной части.
желаемый вывод для подогнанных значений: -
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 для получения вышеуказанного вывода,
Я попробовал некоторые подходы, такие как поиск нулевых позиций элементов, заменяющих значения, но в этом случае это не работает.
, пожалуйста, кто-нибудь может мне помочь решить эту проблему.
заранее спасибо.