import pandas as pd
import numpy as np
import sys
class GM():
def do(self):
result = pd.DataFrame([3831732.0, 3913824.0, 3928907.0, 4282130.0, 4453911.0, 4548852.0, 4962579.0, 5029338.0, 5070216.0, 5210706.0, 5407087.0, 5744550.0, 5994973.0, 6236312.0, 6529045.0, 6791495.0, 7110695.0, 7431755.0, 7512997.0, 7599295.0])
data = result
data.index = range(1,len(result) + 1)
data.loc[21] = None
data.loc[22] = None
f = self.GM11(data[0][list(range(1,len(result) - 1))].as_matrix())[0]
data[0][21] = f(len(data) - 1)
data[0][22] = f(len(data))
print(data)
def GM11(self,x0): #自定义灰色预测函数
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、首项、方差比、小残差概率
if __name__=='__main__':
gm = GM()
gm.do()