今天给小伙伴说一下时间序列ARIMA模型建模过程,有帮助到亲的可以点赞加关注,废话不多说直接上代码以及过程。
1.导库
# 导入必要的库
import pandas as pd
import numpy as np
from math import sqrt
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import r2_score
import statsmodels.api as sm
import pymysql
import matplotlib.pyplot as plt
2.连接数据库读取数据
con = pymysql.connect(host='192.172.3.168',user='root',password='123456',database='test',charset='utf8')
# 创建游标
cur = con.cursor()
## sql代码
sql = "select * from carbon_dioxide_emissions_data where country = 'China' and sector='Power'"
cur.execute(sql)
### 将sql查询出来的数据转化为df
result = cur.fetchall()
df = pd.DataFrame.from_records(result,columns=['country','co2','sector','date'])
cur.close()
3.获取电力co2排放量数据
## 拿到中国电力数据
data = df.loc[:,['date','co2']]
4.划分测试集和训练集
## 划分训练集和测试集
train_data = data[(data['date']>='2019-01-01') & (data['date'] <= '2023-06-01')].iloc[:,1].astype(float, copy=True)
test_data = data[(data['date']>='2023-06-01') & (data['date'] <= '2023-07-31')].iloc[:,1].astype(float, copy=True)
print(len(train_data))
print(len(test_data))
5.设置ARIMA模型参数
# # 指定模型及参数,例如 ARIMA(p, d, q) 模型
p = 1 # AR(p) 的阶数
d = 0 # I(d) 的阶数
q = 3 # MA(q) 的阶数
# 创建并拟合 ARIMA 模型
6.建模和预测
# 创建并拟合 ARIMA 模型
model = sm.tsa.ARIMA(train_data, order=(p, d, q))
model_fit = model.fit()
## 预测未来的时间序列
predicted_values = model_fit.predict(1614,1674) # start='2023-07-20', end='2023-08-10'
7.模型评价指标
# # 打印预测结果
# print(predicted_values)
print('mean_absolute_error:',mean_absolute_error(test_data,predicted_values))
print('mean_squared_error:',mean_squared_error(test_data,predicted_values))
print('rmse:',sqrt(mean_squared_error(test_data,predicted_values)))
print('r2 score:',r2_score(test_data,predicted_values))
8.画图以及设置
# epoch,acc,loss,val_acc,val_loss
data = data.iloc[1000:1613,:]
x_axis_data = data['date']
y_axis_data1 = train_data[1000:1614]
print(len(x_axis_data),len(y_axis_data1))
x_axis_data2 = data.iloc[-61:,0]
y_axis_data2 = test_data
y_axis_data3 = predicted_values
# # 画图
# 设置中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 #有中文出现的情况,需要u'内容'
plt.plot(x_axis_data, y_axis_data1, 'b-', alpha=0.5, linewidth=1, label='train')
# plt.plot(x_axis_data2, y_axis_data2, 'r--', alpha=0.5, linewidth=1, label='test')
plt.plot(x_axis_data2, y_axis_data3, 'g-.', alpha=0.5, linewidth=1, label='predict')
plt.legend() # 显示上面的label
plt.title('中国电力co2排量预测')
plt.xlabel('time')
plt.ylabel('batch production of power CO2')
plt.show()
9.效果图
mean_absolute_error: 2150.5333140933108
mean_squared_error: 7011447.891685436
rmse: 2647.9138754282467
r2 score: -1.7977862325381362