详解用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模型是常见的时间序列预测方法,它们可以用于预测未来的趋势和变化。在实际用中我们可以根据具体情况选择合适的预测方法。