本篇文章只要是通過例子實踐來簡單瞭解含有趨勢成分的時間序列的預測方法。
時間序列的趨勢可以分爲線性趨勢和非線性趨勢兩大類,倘若這種趨勢能夠延續到未來,就可以利用趨勢進行外推預測。
有趨勢序列的預測方法主要有線性趨勢預測、非線性趨勢預測和自迴歸模型預測等。但本篇主要介紹線性趨勢和非線性趨勢的預測方法。
線性趨勢:是指現象隨着時間的推移而呈現出穩定增長或下降的線性變化規律。
指數曲線:用於描述以幾何級數遞增或遞減的現象,即時間序列的觀察值按指數規律變化,或者說時間序列的逐期觀察值按一定的比率增長或衰減。
多階曲線:有些現象的變化形態比較複雜,它們不是按照某種固定的形態變化,而是有升有降,在變化過程中可能有幾個拐點。
線性趨勢方程:
指數曲線的趨勢方程:
K階曲線的趨勢方程:
python實踐以下面的數據展開:
# 先導入相關包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 顯示中文字體
plt.rcParams['axes.unicode_minus'] = False # 顯示負號
# 導入以上數據
files_path = "E:\\xx_python實踐\\"
df = pd.read_excel("時間序列.xlsx")
df["t2"] = df["t"]**2 # 爲二階曲線做準備
df["t3"] = df["t"]**3 # 爲三階曲線做準備
- 擬合線性趨勢線
def linear_trend(x, y):
lreg = LinearRegression()
lreg.fit(x, y)
coef = round(lreg.coef_[0][0],4)
intercept = round(lreg.intercept_[0], 4)
pred = lreg.predict(x)
plt.plot(pred)
plt.title("線性趨勢方程 yt={} + ({})t".format(intercept, coef))
plt.show()
return (intercept, coef)
linear_trend(df[['t']], df[['y']])
- 擬合二階曲線
def second_order_trend(x, y):
lreg = LinearRegression()
lreg.fit(x, y)
coef = lreg.coef_[0]
intercept = round(lreg.intercept_[0], 4)
pred = lreg.predict(x)
plt.plot(pred)
plt.title("二階曲線 yt={} + ({})t + ({})t**2".format(intercept, round(coef[0],4), round(coef[1], 4)))
plt.show()
return (intercept, coef)
second_order_trend(df[['t','t2']], df[['y']])
- 擬合三階曲線
def third_order_trend(x, y):
lreg = LinearRegression()
lreg.fit(x, y)
coef = lreg.coef_[0]
intercept = round(lreg.intercept_[0], 4)
pred = lreg.predict(x)
plt.plot(pred)
plt.title("三階曲線 yt={} + ({})t + ({})t**2 + ({})t**3".format(
intercept, round(coef[0],4),round(coef[1], 4), round(coef[2], 4)))
plt.show()
return (intercept, coef)
third_order_trend(df[['t','t2', 't3']], df[['y']])
- 擬合指數趨勢線
def exp_trend(x, y):
y = np.log(y)
lreg = LinearRegression()
lreg.fit(x, y)
coef = np.exp(lreg.coef_[0][0])
intercept = np.exp(lreg.intercept_[0])
pred = x.applymap(lambda x: round(intercept * math.pow(coef, x), 2))
plt.plot(x, pred)
plt.title("指數曲線方程 yt={} x {}**t".format(round(intercept,3), round(coef, 3)))
plt.show()
return (intercept, coef)
exp_trend(df[['t']], df[['y']])