时间序列分析【python代码实现】

时间序列分析是一种用于建模和分析时间上连续观测的统计方法。 它涉及研究数据在时间维度上的模式、趋势和周期性。常见的时间序列分析包括时间序列的平稳性检验、自相关性和部分自相关性分析、时间序列模型的建立和预测等。

下面是一个使用Python实现时间序列分析的示例:

# 导入所需的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

# 读取时间序列数据
data = pd.read_csv('time_series_data.csv', parse_dates=['date'], index_col='date')

# 绘制时间序列折线图
plt.figure(figsize=(10, 6))
plt.plot(data)
plt.xlabel('Date')
plt.ylabel('Value')
plt.title('Time Series Data')
plt.show()

# 检验时间序列的平稳性
result = sm.tsa.adfuller(data['value'])
print('ADF Statistic:', result[0])
print('p-value:', result[1])

# 分解时间序列
decomposition = sm.tsa.seasonal_decompose(data['value'], model='additive')
trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid

# 绘制分解后的时间序列
plt.figure(figsize=(12, 8))
plt.subplot(411)
plt.plot(data, label='Original')
plt.legend(loc='best')
plt.subplot(412)
plt.plot(trend, label='Trend')
plt.legend(loc='best')
plt.subplot(413)
plt.plot(seasonal, label='Seasonality')
plt.legend(loc='best')
plt.subplot(414)
plt.plot(residual, label='Residuals')
plt.legend(loc='best')
plt.tight_layout()
plt.show()

# 计算自相关性和部分自相关性
sm.graphics.tsa.plot_acf(data['value'])
plt.show()

sm.graphics.tsa.plot_pacf(data['value'])
plt.show()

# 建立时间序列模型(ARIMA)
model = sm.tsa.ARIMA(data['value'], order=(1, 0, 1))
model_fit = model.fit(disp=0)

# 模型预测
forecast = model_fit.forecast(steps=10)[0]
print('Forecasted Values:', forecast)

在这个示例中,我们首先导入所需的库,然后使用pd.read_csv函数读取时间序列数据,其中日期列被解析为日期对象,并设置为索引列。接下来,我们使用plt.plot函数绘制了时间序列数据的折线图。

然后,我们使用sm.tsa.adfuller函数对时间序列数据进行平稳性检验。该函数返回ADF统计量和p值,用于判断时间序列数据的平稳性。

接下来,我们使用sm.tsa.seasonal_decompose函数对时间序列进行分解,得到趋势、季节性和残差。然后,使用plt.subplotplt.plot函数绘制了分解后的时间序列图。

之后,我们使用sm.graphics.tsa.plot_acfsm.graphics.tsa.plot_pacf函数计算并绘制了时间序列数据的自相关性和部分自相关性图。

最后,我们使用sm.tsa.ARIMA函数建立ARIMA模型,并使用fit方法拟合模型。然后,我们使用forecast方法对未来的10个时间步进行预测,并打印出预测值。

请注意,在运行代码之前需要安装statsmodels、pandas和matplotlib等库,并将时间序列数据保存为CSV文件(文件名为’time_series_data.csv’)。

一个使用更复杂的时间序列分析算法的例子是通过使用长短期记忆网络(Long Short-Term Memory, LSTM)进行时间序列预测。LSTM是一种适用于处理具有长期依赖关系的序列数据的深度学习模型。
下面是一个使用Python和Keras库实现LSTM进行时间序列预测的示例:

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 读取时间序列数据
data = pd.read_csv('time_series_data.csv', parse_dates=['date'], index_col='date')

# 将数据归一化到0-1的范围
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(data)

# 划分训练集和测试集
train_size = int(len(scaled_data) * 0.8)
train_data = scaled_data[:train_size]
test_data = scaled_data[train_size:]

# 准备训练数据
def prepare_data(data, lookback):
    X, Y = [], []
    for i in range(len(data) - lookback - 1):
        X.append(data[i:(i + lookback), 0])
        Y.append(data[i + lookback, 0])
    return np.array(X), np.array(Y)

lookback = 10
train_X, train_Y = prepare_data(train_data, lookback)
test_X, test_Y = prepare_data(test_data, lookback)

# 转换数据为LSTM所需的输入格式 [样本数, 时间步长, 特征数]
train_X = np.reshape(train_X, (train_X.shape[0], train_X.shape[1], 1))
test_X = np.reshape(test_X, (test_X.shape[0], test_X.shape[1], 1))

# 构建LSTM模型
model = Sequential()
model.add(LSTM(50, input_shape=(lookback, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

# 训练模型
model.fit(train_X, train_Y, epochs=100, batch_size=16, verbose=2)

# 在测试集上进行预测
test_predict = model.predict(test_X)

# 将预测数据进行逆归一化
test_predict = scaler.inverse_transform(test_predict)
test_Y = scaler.inverse_transform([test_Y])

# 绘制预测结果和实际值的对比图
plt.figure(figsize=(12, 6))
plt.plot(test_Y.flatten(), label='True')
plt.plot(test_predict.flatten(), label='Prediction')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('Time Series Prediction using LSTM')
plt.legend()
plt.show()

在示例中,我们首先导入所需的库。然后使用pd.read_csv函数读取时间序列数据,并使用MinMaxScaler将数据归一化到0-1的范围。接下来,我们将数据集划分为训练集和测试集。

然后,我们定义了一个prepare_data函数,用于将时间序列数据转换为LSTM所需的输入格式。然后,我们使用该函数准备训练数据。

接下来,我们将训练数据转换为LSTM所需的输入格式,并使用Sequential函数构建了一个含有一个LSTM层和一个全连接层的模型。然后,我们使用compile方法编译模型,并使用fit方法在训练集上训练模型。

在模型训练完毕后,我们使用训练好的模型对测试集进行预测。然后,我们使用inverse_transform函数将预测结果和实际值逆归一化。最后,我们使用plt.plot函数绘制了预测结果和实际值的对比图。

请注意,在运行代码之前需要安装Keras、scikit-learn、pandas和matplotlib等库,并将时间序列数据保存为CSV文件(文件名为’time_series_data.csv’)。

如果你想更深入地了解人工智能的其他方面,比如机器学习、深度学习、自然语言处理等等,也可以点击这个链接,我按照如下图所示的学习路线为大家整理了100多G的学习资源,基本涵盖了人工智能学习的所有内容,包括了目前人工智能领域最新顶会论文合集和丰富详细的项目实战资料,可以帮助你入门和进阶。

人工智能交流群(大量资料)

在这里插入图片描述

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当涉及时间序列分析时,Python中有几个常用的库和模块可以使用。以下是一个基本的时间序列分析Python代码示例: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.seasonal import seasonal_decompose from statsmodels.tsa.arima.model import ARIMA # 读取数据集 data = pd.read_csv('data.csv', parse_dates=['Date'], index_col='Date') # 可视化数据 plt.figure(figsize=(10, 6)) plt.plot(data) plt.title('Time Series Data') plt.xlabel('Date') plt.ylabel('Value') plt.show() # 分解时间序列 result = seasonal_decompose(data, model='additive', period=12) # 可视化分解后的时间序列 plt.figure(figsize=(10, 8)) plt.subplot(411) plt.plot(data, label='Original') plt.legend(loc='best') plt.subplot(412) plt.plot(result.trend, label='Trend') plt.legend(loc='best') plt.subplot(413) plt.plot(result.seasonal, label='Seasonality') plt.legend(loc='best') plt.subplot(414) plt.plot(result.resid, label='Residuals') plt.legend(loc='best') plt.tight_layout() plt.show() # 构建ARIMA模型 model = ARIMA(data, order=(1, 1, 1)) model_fit = model.fit() # 预测未来值 future_values = model_fit.predict(start=data.index[-1], end=data.index[-1] + pd.DateOffset(months=12)) # 可视化预测结果 plt.figure(figsize=(10, 6)) plt.plot(data, label='Actual') plt.plot(future_values, label='Forecast') plt.title('Time Series Forecast') plt.xlabel('Date') plt.ylabel('Value') plt.legend(loc='best') plt.show() ``` 在上述代码中,我们首先导入了所需的库和模块,然后读取时间序列数据集。接下来,我们可视化了原始时间序列数据,以及对其进行了季节性分解,分别展示了趋势、季节性和残差。然后,我们构建了一个ARIMA模型,并使用该模型进行了未来值的预测,并将预测结果与实际值进行了可视化比较。 请注意,这只是一个简单的示例代码,实际的时间序列分析可能涉及更复杂的数据处理和模型调参过程。具体的分析方法和代码实现可能因不同的情况而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RRRRRoyal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值