时间序列预测代码
简单移动平均,利用Numpy、Pandas
import random
data = [random.uniform(0, 10) for i in range(100)] # 生成100个 10以内的浮点数
import pandas as pd
import numpy as np
df = pd.DataFrame(data, columns=['value'])
df['SMA_10'] = df['value'].rolling(window=10).mean() #大小为10的窗口
print(df.head(30))
mae = np.mean(np.abs(df['value'] - df['SMA_10'])) # 平均绝对误差评估
print("MAE: ", mae)
指数平滑法
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读入数据
data = pd.read_csv('/Users/xujingfei/Desktop/data.csv', header=None, names=['date', 'value'])
# 设定平滑系数alpha
alpha = 0.99
# 初始化预测值
data['forecast'] = np.nan
# 计算第一个预测值
data.at[1, 'forecast'] = data['value'][0]
# 计算预测值
for i in range(2, len(data)):
data.at[i, 'forecast'] = alpha * data['value'][i-1] + (1-alpha) * data['forecast'][i-1]
# 绘制原始数据和预测值
plt.plot(data['date'], data['value'], label='Actual')
plt.plot(data['date'], data['forecast'], label='Forecast')
plt.legend()
plt.show()
霍尔特指数平滑法
相比较于简单指数平滑,霍尔特将季节性、趋势考虑进来,分为水平部分、趋势部分
# 霍尔特指数平滑
def holt_exponential_smoothing(x, alpha, beta):
"""
霍尔特指数平滑法
x: 时间序列数据
alpha: 水平平滑系数
beta: 趋势平滑系数
"""
n = len(x)
y_hat = np.zeros(n) # 保存预测值
l = np.zeros(n) # 保存水平值
b = np.zeros(n) # 保存趋势值
# 初始化水平值和趋势值
l[0] = x[0] # 水平部分一般使用前几期实际值的平均值
#l[0] = 509
b[0] = x[1] - x[0] # 当初始阶段假定没有趋势的情况下,可以设定为0
#b[0] = 0
# 计算水平值和趋势值
for i in range(1, n):
l[i] = alpha * x[i] + (1 - alpha) * (l[i-1] + b[i-1])
b[i] = beta * (l[i] - l[i-1]) + (1 - beta) * b[i-1]
# 预测
for i in range(n):
y_hat[i] = l[i] + b[i]
return y_hat[:n]
线性回归
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import mean_squared_error,r2_score
# 构造训练数据
x = [[1, 2], [2, 4], [3, 6], [4, 8]]
y = [2, 4, 6, 8]
# 创建线性回归模型并进行训练
model = LinearRegression()
model.fit(x, y)
# 打印模型的系数和截距
print("Coefficients: ", model.coef_)
print("Intercept: ", model.intercept_)
plt.plot(x,y,c='orange')
plt.title('Straight Line')
plt.show()
# # 使用训练好的模型进行预测
X_new = [[5, 1]]
y_pred = model.predict(X_new)
print("Predicted y: ", y_pred)
时间序列分解
分解为趋势、季节、随机