python 二次平滑_一次、二次、三次指数平滑计算思想及代码

本文介绍了如何使用Python进行一次、二次和三次指数平滑预测。通过读取Excel数据,用户可以选择指数平滑的次数,并输入相应的参数a。程序计算并输出预估值及均方误差。
摘要由CSDN通过智能技术生成

1 from openpyxl importload_workbook2 importxlsxwriter3

4 if __name__ == '__main__':5 judge = input('请选择使用几次指数平滑:一次请按1;二次请按2;三次请按3:')6 ##这里是打开excel将数据储存到数组里面

7 wb = load_workbook(filename=r'C:\Users\Administrator\Desktop\data.xlsx') ##读取路径

8 ws = wb.get_sheet_by_name("Sheet1") ##读取名字为Sheet1的sheet表

9 info_data_id =[]10 info_data_sales =[]11

12 for row_A in range(1, 3): ## 遍历第1行到2行

13 id = ws.cell(row=row_A, column=1).value ## 遍历第1行到2行,第1列

14 info_data_id.append(id)15 for row_num_BtoU in range(1, len(info_data_id) + 1): ## 遍历第1行到2行

16 row_empty = [] ##建立一个空数组作为临时储存地,每次换行就被清空

17 for i in range(2, 20): ## 遍历第1行到2行,第1到19列

18 data = ws.cell(row=row_num_BtoU, column=i).value19 if data ==None:20 pass

21 else:22 row_empty.append(data) ##将单元格信息储存进去

23 info_data_sales.append(row_empty) ##row_empty每次储存完1到19列后压给info_data_sales,然后row_empty被清空

24 #print(info_data_id)

25 #print(info_data_sales)

26 if judge == '1':27 ##############################下面是计算St(1)下面写为S1_t_######################################

28 print('你选择了一次指数平滑预测')29 ##一次指数平滑的初值为S1_1,用S1_1来储存每一组数据的一次平滑的数值

30 S1_1 =[]31 for m inrange(0, len(info_data_id)):32 S1_1_empty =[]33 x =034 for n in range(0, 3):35 x = x +int(info_data_sales[m][n])36 x = x / 3

37 S1_1_empty.append(x)38 S1_1.append(S1_1_empty)39 #print(S1_1)

40

41 a = [] ##这是用来存放阿尔法的数组

42 info_MSE = [] ##计算均方误差来得到最优的a(阿尔法)

43 for i inrange(0, len(info_data_sales)):44 v = input('请输入第' + str(i + 1) + '组数据的a:')45 a.append(v)46

47 for i inrange(0, len(info_data_sales)):48 MSE =049 for j inrange(0, len(info_data_sales[i])):50 S1_1[i].append(51 float(a[i]) * int(info_data_sales[i][j]) + (1 - float(a[i])) * int(S1_1[i][j])) ##计算预估值

52 MSE = (int(S1_1[i][j]) - int(info_data_sales[i][j])) ** 2 +MSE53 #print(info_data_sales[i][j], S1_1[i][j])

54 MSE = (MSE ** (1 / 2)) / int(len(info_data_sales[i])) ##得到均方误差

55 info_MSE.append(MSE)56 #print(info_MSE)

57 #print(S1_1)

58 for i inrange(0, len(S1_1)):59 print('第' + str(i + 1) + '组的一次平滑预估值为:' + str(S1_1[i][len(S1_1[i]) - 1]) + ';均方误差为:' +str(info_MSE[i]))60

61 if judge == '2':62 ##############################下面是计算St(2)下面写为S2_t_######################################

63 print('你选择了二次指数平滑预测')64

65 ##二次指数平滑的初值为S2_1,用S2_1_new来储存每一组数据的一次平滑的数值

66 S2_1 =[]67 S2_2 =[]68 for m inrange(0, len(info_data_id)):69 S2_1_empty =[]70 x =071 for n in range(0, 3):72 x = x +float(info_data_sales[m][n])73 x = x / 3

74 S2_1_empty.append(x)75 S2_1.append(S2_1_empty)76 S2_2.append(S2_1_empty)77 #print(S2_2)

78 a = [] ##这是用来存放阿尔法的数组

79 info_MSE = [] ##计算均方误差来得到最优的a(阿尔法)

80 for i inrange(0, len(info_data_sales)):81 v = float(input('请输入第' + str(i + 1) + '组数据的a:'))82 a.append(v)83

84 ##下面是计算一次指数平滑的值

85 S2_1_new1 =[]86 for i inrange(0, len(info_data_sales)):87 S2_1_new = [[]] *len(info_data_id)88 for j inrange(0, len(info_data_sales[i])):89 if j ==0:90 S2_1_new[i].append(91 float(a[i]) * float(info_data_sales[i][j]) + (1 - float(a[i])) *float(S2_1[i][j]))92 else:93 S2_1_new[i].append(float(a[i]) * float(info_data_sales[i][j]) + (1 - float(a[i])) *float(94 S2_1_new[i][j - 1])) ##计算一次指数的值

95 S2_1_new1.append(S2_1_new[i])96 #print(S2_1_new1)

97 #print(len(S2_1_new1[i]))

98

99 ##下面是计算二次指数平滑的值

100 S2_2_new1 =[]101 info_MSE = [] ##计算均方误差来得到最优的a(阿尔法)

102 for i inrange(0, len(info_data_sales)):103 S2_2_new = [[]] *len(info_data_id)104 MSE =0105 for j inrange(0, len(info_data_sales[i])):106 if j ==0:107 S2_2_new[i].append(float(a[i]) * float(S2_1_new1[i][j]) + (1 - float(a[i])) *float(S2_2[i][j]))108 else:109 S2_2_new[i].append(float(a[i]) * float(S2_1_new1[i][j]) + (1 - float(a[i])) *float(110 S2_2_new[i][j - 1])) ##计算二次指数的值

111 MSE = (int(S2_2_new[i][j]) - int(info_data_sales[i][j])) ** 2 +MSE112 MSE = (MSE ** (1 / 2)) /int(len(info_data_sales[i]))113 info_MSE.append(MSE)114 S2_2_new1.append(S2_2_new[i])115 #print(S2_2_new1)

116 #print(len(S2_2_new1[i]))

117

118 ##下面是计算At、Bt以及每个预估值Xt的值,直接计算预估值,不一一列举Xt的值了

119 u = input('你要预估多少期?')120 Xt =[]121 for i inrange(0, len(info_data_sales)):122 At = (float(S2_1_new1[i][len(S2_1_new1[i]) - 1]) * 2 - float(S2_2_new1[i][len(S2_2_new1[i]) - 1]))123 Bt = (float(a[i]) / (1 - float(a[i])) *(124 float(S2_1_new1[i][len(S2_1_new1[i]) - 1]) - float(S2_2_new1[i][len(S2_2_new1[i]) - 1])))125 Xt.append(At + Bt *int(u))126 print('第' + str(i + 1) + '组的二次平滑预估值为:' + str(Xt[i]) + ';均方误差为:' +str(info_MSE[i]))127

128 if judge == '3':129 ##############################下面是计算St(3)下面写为S3_t_######################################

130 print('你选择了三次指数平滑预测')131 S3_1 =[]132 S3_2 =[]133 S3_3 =[]134 for m inrange(0, len(info_data_id)):135 S3_1_empty =[]136 x =0137 for n in range(0, 3):138 x = x +float(info_data_sales[m][n])139 x = x / 3

140 S3_1_empty.append(x)141 S3_1.append(S3_1_empty)142 S3_2.append(S3_1_empty)143 S3_3.append(S3_1_empty)144 #print(S3_1)

145 a = [] ##这是用来存放阿尔法的数组

146 info_MSE = [] ##计算均方误差来得到最优的a(阿尔法)

147 for i inrange(0, len(info_data_sales)):148 v = float(input('请输入第' + str(i + 1) + '组数据的a:'))149 a.append(v)150

151 ##下面是计算一次指数平滑的值

152 S3_1_new1 =[]153 for i inrange(0, len(info_data_sales)):154 S3_1_new = [[]] *len(info_data_id)155 for j inrange(0, len(info_data_sales[i])):156 if j ==0:157 S3_1_new[i].append(158 float(a[i]) * float(info_data_sales[i][j]) + (1 - float(a[i])) *float(S3_1[i][j]))159 else:160 S3_1_new[i].append(float(a[i]) * float(info_data_sales[i][j]) + (1 - float(a[i])) *float(161 S3_1_new[i][j - 1])) ##计算一次指数的值

162 S3_1_new1.append(S3_1_new[i])163

164 ##下面是计算二次指数平滑的值

165 S3_2_new1 =[]166 info_MSE = [] ##计算均方误差来得到最优的a(阿尔法)

167 for i inrange(0, len(info_data_sales)):168 S3_2_new = [[]] *len(info_data_id)169 for j inrange(0, len(info_data_sales[i])):170 if j ==0:171 S3_2_new[i].append(float(a[i]) * float(S3_1_new1[i][j]) + (1 - float(a[i])) *float(S3_2[i][j]))172 else:173 S3_2_new[i].append(float(a[i]) * float(S3_1_new1[i][j]) + (1 - float(a[i])) *float(174 S3_2_new[i][j - 1])) ##计算二次指数的值

175 S3_2_new1.append(S3_2_new[i])176

177 ##下面是计算二次指数平滑的值

178 S3_3_new1 =[]179 info_MSE = [] ##计算均方误差来得到最优的a(阿尔法)

180 for i inrange(0, len(info_data_sales)):181 S3_3_new = [[]] *len(info_data_id)182 MSE =0183 for j inrange(0, len(info_data_sales[i])):184 if j ==0:185 S3_3_new[i].append(float(a[i]) * float(S3_2_new1[i][j]) + (1 - float(a[i])) *float(S3_3[i][j]))186 else:187 S3_3_new[i].append(float(a[i]) * float(S3_2_new1[i][j]) + (1 - float(a[i])) *float(188 S3_3_new[i][j - 1])) ##计算三次指数的值

189 MSE = (int(S3_3_new[i][j]) - int(info_data_sales[i][j])) ** 2 +MSE190 MSE = (MSE ** (1 / 2)) /int(len(info_data_sales[i]))191 info_MSE.append(MSE)192 S3_3_new1.append(S3_3_new[i])193 #print(S3_3_new1)

194

195 ##下面是计算At、Bt、Ct以及每个预估值Xt的值,直接计算预估值,不一一列举Xt的值了

196 u = input('你要预估多少期?')197 Xt =[]198 for i inrange(0, len(info_data_sales)):199 At =(200 float(S3_1_new1[i][len(S3_1_new1[i]) - 1]) * 3 - float(S3_2_new1[i][len(S3_2_new1[i]) - 1]) * 3 +float(201 S3_3_new1[i][len(S3_3_new1[i]) - 1]))202 Bt = ((float(a[i]) / (2 * ((1 - float(a[i])) ** 2))) * ((6 - 5 * float(a[i])) *(203 float(S3_1_new1[i][len(S3_1_new1[i]) - 1]) - 2 * (5 - 4 * float(a[i])) *float(204 S3_2_new1[i][len(S3_2_new1[i]) - 1]) + (4 - 3 * float(a[i])) *float(205 S3_3_new1[i][len(S3_3_new1[i]) - 1]))))206 Ct = (((float(a[i])) ** 2) / (2 * ((1 - float(a[i])) ** 2))) *(207 float(S3_1_new1[i][len(S3_1_new1[i]) - 1]) - float(S3_2_new1[i][len(S3_2_new1[i]) - 1])*2 +float(208 S3_3_new1[i][len(S3_3_new1[i]) - 1]))209 Xt.append(At + Bt * int(u) + Ct * (int(u) ** 2))210 print('第' + str(i + 1) + '组的三次平滑预估值为:' + str(Xt[i]) + ';均方误差为:' + str(info_MSE[i]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值