import numpy as np
import pandas as pd
path = u'数据源\\第3周\\data\\data1.csv'
f = open(path, encoding = 'utf-8')
d = pd.read_csv(f)
# d.describe().T.round(2)
# d.corr().round(2)
# Lasso变量选择,相当于筛选特征值
from sklearn.linear_model import LassoLars
model = LassoLars(alpha=0.1) # alpha 代表惩罚项所占的大小
model.fit(d.iloc[:,0:13],d['y'])
pd.DataFrame(model.coef_) #各个特征的系数,也就是权重
# 灰色预测模型函数,适合短期预测
def GM11(x0): # 自定义灰色预测函数
import numpy as np
x1 = x0.cumsum() #1-AGO序列
z1 = (x1[:len(x1)-1] + x1[1:])/2.0 #紧邻均值(MEAN)生成序列
z1 = z1.reshape((len(z1),1))
B = np.append(-z1, np.ones_like(z1), axis = 1)
Yn = x0[1:].reshape((len(x0)-1, 1))
[[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Yn) #计算参数
f = lambda k: (x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2)) #还原值
delta = np.abs(x0 - np.array([f(i) for i in range(1,len(x0)+1)]))
C = delta.std()/x0.std()
P = 1.0*(np.abs(delta - delta.mean()) < 0.6745*x0.std()).sum()/len(x0)
return f, a, b, x0[0], C, P #返回灰色预测函数、a、b、首项、方差比、小残差概率
# 构建新行
d.index = range(1994, 2014)
d.loc[2014] = None
d.loc[2015] = None
d2 = d.copy()
# 运用灰色预测模型
l = ['x2', 'x3', 'x5', 'x8','x10','x12']
for i in l:
f = GM11(d2[i][list(range(1994, 2014))].as_matrix())[0]
d2[i][2014] = f(len(d2)-1) #2014年预测结果
d2[i][2015] = f(len(d2)) #2015年预测结果
d2[i] = d2[i].round(2) #保留两位小数
out_f = u'数据源\\第3周\\data\\data1_GM11_2.csv'
d2[l+['y']].to_csv(out_f) #结果输出