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]))