我有一个具有以下结构的数据框:
"数据"
Demand x(t)
week
1 18
2 29
3 25
4 35
5 40
6 45
7 49
8 42
9 31
10 30
11 25
12 22
我计划使用具有指数平滑的Holt方法来估计下一时期的预测。为此,我将使用两个新列:level和trend,知道第一行(第1周)的数据:
demand level trend
week
1 18 18.0 7.0
2 29 NaN NaN
3 25 NaN NaN
4 35 NaN NaN
5 40 NaN NaN
6 45 NaN NaN
7 49 NaN NaN
8 42 NaN NaN
9 31 NaN NaN
10 30 NaN NaN
11 25 NaN NaN
12 22 NaN NaN
要完成预测,我需要估算每周的水平和趋势,以前一周为基础。我能够通过使用for循环来实现它:
for idx in range(2,13):
new_level = alpha*data.loc[idx].demand + (1-alpha)*(data.loc[idx-1].level + data.loc[idx-1].trend)
new_trend = beta*(new_level -data.loc[idx-1].level) + (1-beta)*(data.loc[idx-1].trend)
data.loc[idx] = (data.loc[idx].demand, new_level, new_trend)
和结果
demand level trend
week
1 18.0 18.000000 7.000000
2 29.0 27.000000 7.660000
3 25.0 29.830000 6.066100
4 35.0 35.448050 5.918243
5 40.0 40.683147 5.692805
6 45.0 45.687976 5.465773
7 49.0 50.076874 5.110404
8 42.0 48.593639 2.934503
9 31.0 41.264071 -0.452640
10 30.0 35.405716 -2.236526
11 25.0 29.084595 -3.584443
12 22.0 23.750076 -4.161968
我想知道是否有更好的方法。我尝试使用shift,但我的问题是水平和趋势都取决于当前数据和先前计算的数据"在飞行中#34;所以我将需要以某种方式同时使用两列的cal来使用:
data['level'] = alpha*data.demand + (1-alpha)*(data.level.shift(1)+data.trend.shift(1))
data['trend'] = beta*(data.level-data.level.shift(1)) + (1-beta)*data.trend.shift(1)
任何建议?