详解用Python进行时间序列预测的7种方法

  • Post category:Python

详解用Python进行时间序列预测的7种方法

时间序列预测是一种重要的数据分析技术,它可以用于预测未来的趋势和变化。本文将介绍Python中实现时间列预测的7种方法,并提供两个示例说明。

1. 移动平均法

移动平均法是一种简单的时间序列预测方法,它基于过去一段时间的平均值来预测未来的值。具体实现如下:

def moving_average(data, window_size):
    predictions = []
    for i in range(window_size, len(data)):
        window = data[i-window_size:i]
        prediction = sum(window) / window_size
        predictions.append(prediction)
    return predictions

其中,data是要预测的时间序列数据,window_size是移动平均窗口的大小。这个函数将使用移动平均法预测未来的值,并返回预测结果。

以下是示例,演示如何使用移动平均法预测未来的值:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
window_size = 3
predictions = moving_average(data, window_size)
print(predictions)

这个示例使用移动平均法预测未来的值,并输出预测结果。

2. 线性回归法

线性回归法是一种常见的时间序列预测方法,它基于过去的数据来拟合一条直线,然后使用这条直线来预测未来的值。具体实现如下:

from sklearn.linear_model import LinearRegression

def linear_regression(data):
    X = [[i] for i in range(len(data))]
    y = data
    model = LinearRegression()
    model.fit(X, y)
    predictions = model.predict([[i+len(data)] for i in range(3)])
    return predictions

其中,data是要预测的时间序列数据。这个函数将使用线性回归法预测未来的值,并返回预测结果。

以下是一个示例,演示如何使用线性回归法预测未来的值:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
predictions = linear_regression(data)
print(predictions)

这个示例使用线性回归法预测未来的值,并输出预测结果。

3. ARIMA模型

ARIMA模型是一种常见的时间序列预测方法,它基于自回归(AR)和移动平均(MA)模型来预测未来的值。具体实现如下:

from statsmodels.tsa.arima_model import ARIMA

def arima(data, p, d, q):
    model = ARIMA(data, order=(p, d, q))
    model_fit = model.fit(disp=0)
    predictions = model_fit.forecast(steps=3)[0]
    return predictions

其中,data是要预测的时间序列数据,p、d、q是ARIMA模型的参数。这个函数将使用ARIMA模型预测未来的值,并返回预测结果。

以下是一个示例,演示如何使用ARIMA模型预测未来的值:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
p, d, q = 1, 1, 1
predictions = arima(data, p, d, q)
print(predictions)

这个示例使用ARIMA模型预测未来的值,并输出预测结果。

4. Prophet模型

Prophet模型是一种由Facebook开发的时间序列预测方法,它基于加性模型和分解模型来预测未来的值。具体实现如下:

from fbprophet import Prophet

def prophet(data):
    df = pd.DataFrame({'ds': [i for i in range(len(data))], 'y': data})
    model = Prophet()
    model.fit(df)
    future = model.make_future_dataframe(periods=3)
    forecast = model.predict(future)
    predictions = forecast.tail(3)['yhat'].values
    return predictions

其中,data是要预测的时间序列数据。这个函数将使用Prophet模型预测未来的值,并返回预测结果。

以下是一个示例,演示如何使用Prophet模型预测未来的值:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
predictions = prophet(data)
print(predictions)

这个示例使用Prophet模型预测未来的值,并输出预测结果。

5. LSTM模型

LSTM模型是一种常见的深度学习模型,它可以用于时间序列预测。具体实现如下:

from keras.models import Sequential
from keras.layers import LSTM, Dense

def lstm(data):
    X, y = [], []
    for i in range(len(data)-3):
        X.append(data[i:i+3])
        y.append(data[i+3])
    X = np.array(X).reshape(len(X), 3, 1)
    y = np.array(y)
    model = Sequential()
    model.add(LSTM(50, activation='relu', input_shape=(3, 1)))
    model.add(Dense(1))
    model.compile(optimizer='adam', loss='mse')
    model.fit(X, y, epochs=200, verbose=0)
    predictions = model.predict(np.array(data[-3:]).reshape(1, 3, 1))[0]
    return predictions

其中,data是要预测的时间序列数据。这个函数将使用LSTM模型预测未来的值,并返回预测结果。

以下是一个例,演示如何使用LSTM模型预测未来的值:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
predictions = lstm(data)
print(predictions)

这个示例使用LSTM模型预测未来的值,并输出预测结果。

6. CNN-LSTM模型

CNN-LSTM模型是一种结合了卷积神经网络和LSTM模型的深度学习模型,它可以用于时间序列预测。具体实现如下:

from keras.models import Sequential
from keras.layers import LSTM, Dense, Conv1D, MaxPooling1D, Flatten

def cnn_lstm(data):
    X, y = [], []
    for i in range(len(data)-3):
        X.append(data[i:i+3])
        y.append(data[i+3])
    X = np.array(X).reshape(len(X), 3, 1)
    y = np.array(y)
    model = Sequential()
    model.add(Conv1D(filters=64, kernel_size=2, activation='relu', input_shape=(3, 1)))
    model.add(MaxPooling1D(pool_size=2))
    model.add(Flatten())
    model.add(LSTM(50, activation='relu'))
    model.add(Dense(1))
    model.compile(optimizer='adam', loss='mse')
    model.fit(X, y, epochs=200, verbose=0)
    predictions = model.predict(np.array(data[-3:]).reshape(1, 3, 1))[0]
    return predictions

其中,data是要预测的时间序列数据。这个函数将使用CNN-LSTM模型预测未来的值,并返回预测结果。

以下是一个示例,演示如何使用CNN-LSTM模型预测未来的值:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
predictions = cnn_lstm(data)
print(predictions)

这个示例使用CNN-LSTM模型预测未来的值,并输出预测结果。

7. WaveNet模型

WaveNet模型是一种由Google DeepMind开发的深度学习模型,它可以用于时间序列预测。具体实现如下:

from keras.models import Model
from keras.layers import Input, Conv1D, Activation, Add, Multiply

def wavenet(data):
    input_layer = Input(shape=(len(data), 1))
    residual = input_layer
    skip_connections = []
    for i in range(10):
        dilation_rate = 2 ** i
        tanh_out = Conv1D(filters=32, kernel_size=2, dilation_rate=dilation_rate, padding='causal')(residual)
        sigm_out = Conv1D(filters=32, kernel_size=2, dilation_rate=dilation_rate, padding='causal')(residual)
        tanh_out = Activation('tanh')(tanh_out)
        sigm_out = Activation('sigmoid')(sigm_out)
        merged = Multiply()([tanh_out, sigm_out])
        skip_out = Conv1D(filters=1, kernel_size=1)(merged)
        residual = Add()([residual, skip_out])
        skip_connections.append(skip_out)
    out = Add()(skip_connections)
    out = Activation('relu')(out)
    out = Conv1D(filters=1, kernel_size=1)(out)
    model = Model(input_layer, out)
    model.compile(optimizer='adam', loss='mse')
    model.fit(np.array(data).reshape(len(data), 1, 1), np.array(data).reshape(len(data), 1), epochs=200, verbose=0)
    predictions = model.predict(np.array(data[-10:]).reshape(1, 10, 1))[0]
    return predictions

其中,data是要预测的时间序列数据。这个函数将使用WaveNet模型预测未来的值,并返回预测结果。

以下是一个示例,演示如何使用WaveNet模型预测未来的值:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
predictions = wavenet(data)
print(predictions)

这个示例使用WaveNet模型预测未来的值,并输出预测结果。

总之,移动平均法、线性回归法、ARIMA模型、Prophet模、LSTM模型、CNN-LSTM模型和WaveNet模型是常见的时间序列预测方法,它们可以用于预测未来的趋势和变化。在实际用中我们可以根据具体情况选择合适的预测方法。