时间序列预测代码

简单移动平均,利用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)

时间序列分解

分解为趋势、季节、随机

posted @ 2023-02-21 22:38  烦恼1234  阅读(22)  评论(0编辑  收藏  举报