from sklearn import linear_model
import numpy as np
import pandas as pd
def time_series_decomposition(data, n):
"""
时间序列分解
预测n个值
"""
#求四项平均和居中平均TC
#data['四项平均'].iloc[2:len(data)-2] = data['销售额'].rolling(4).mean()[3:].tolist()
data.loc[2:len(data)-2, '四项平均'] = data['销售额'].rolling(4).mean()[3:].tolist()
data.loc[2:len(data)-2, '居中平均TC'] = data['四项平均'].rolling(2).mean()[3:].tolist()
#求Y/TC=SI(%)
data['SI'] = data['销售额']/data['居中平均TC']*100
#长期趋势T
t = np.arange(1,len(data)+1).tolist()
y = np.array(data['销售额']).reshape(-1, 1)
x = np.array(t).reshape(-1, 1)
model = linear_model.LinearRegression()
model.fit(x, y)
data['长期趋势T'] = model.predict(x)
#周期变动C
data['周期变动C'] = data['居中平均TC']/data['长期趋势T']*100
#求季节指数
data.index = pd.to_datetime(data['time'], format='%Y-%m-%d %H:%M:%S')
data['month'] = data.index.month
SI_ = data['SI'].groupby(data['month']).mean()
SI_x = 400/np.sum(SI_) #修正系数
#修正后的季节指数
SI = SI_*SI_x
#预测
#周期变动本方法采取历史变动值的均值
result = []
for i in range(n+1)[1:]:
yushu = i % 4
tt = t[-1]+i
T = model.predict([[tt]])
S = list(SI)[yushu-1]/100
C = np.mean(data['周期变动C'])/100
Y = T*S*C #预测
result.append(Y[0][0])
return result
#读取数据
data = pd.read_excel(u'D:\\Personal\\Desktop\\销售额季度数据.xlsx', sheet_name=0)
n = 1
y = time_series_decomposition(data, n)
print(y)