任务19:实现山东省气温预测

article/2025/8/22 4:53:17

任务描述

知识点

  • 时间序列分析

重  点

  • 指数平滑法
  • ARIMA模型
  • Python连接数据库,查询数据

内  容

  • 读取并创建时序数据
  • 使用指数平滑法建立模型,并预测下一年山东省各月的平均气温
  • 使用ARIMA建立模型,并预测下一年山东省各月的平均气温
  • 对比两种模型的优劣
  • 将预测的数据更新到数据库中

任务指导

1. 读取并创建时序数据

  • 数据集为2000年1月到2020年12月每月各省的平均气温数据(数据存于MySQL数据库中,数据库为china_all,存于province_temp_all表中)。
  • 读取数据后,建立时间索引的序列数据。
  • 通过图形查看数据的特征。

2. 使用指数平滑法建立模型,并预测下一年各月的最低气温

  • 根据数据的特征,建立相应的指数平滑法模型。
  • 创建该模型的拟合图
  • 对模型效果进行评估
  • 预测下一年各月的最低气温

3. 使用ARIMA建立模型,并预测下一年各月的最低气温

  • 根据数据的特征,对数据进行差分使数据平稳。
  • 找到ARIMA模型的最优参数
  • 根据最优参数建立ARIMA模型
  • 对模型效果进行评估
  • 预测下一年各月的最低气温
  • 将指数平滑法预测的2023年各月的山东气温数据更新到province_temp数据库表中

任务实现

1. 读取并创建时序数据

1)安装pymysql和sqlalchemy库

可以打开anaconda自带的Prompt或Windows的cmd,输入如下:

pip install pymysql sqlalchemy

如果下载速度过慢,推荐使用国内镜像,如下:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pymysql sqlalchemy

2)引入相应的库

from sqlalchemy import create_engine,text
import pandas as pd
import numpy as np
from statsmodels.tsa import holtwinters as hw
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.gofplots import qqplot
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
import warnings
warnings.filterwarnings('ignore')

3)读取数据,建立时序数据

SQLAlchemy是一个基于Python实现的orm框架,该框架建立在DB API之上,使用关系对象映射进行数据库操作,简而言之是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果,是第三方的orm框架,可以独立于web项目使用。

SQLAlchemy本身无法操作数据库,其必须以来pymysql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:mysql+pymysql://<username>:<password>@<host>/<dbname>]。

数据存于MySQL数据库中,数据库为china_all,存于province_temp_all表中。

数据库安装在Master环境中,各参数如下:

username:root

password:root

host:192.168.4.190:3306(备注:3306为数据库服务默认的端口,前面的ip需要根据自己的实际环境进行修改)

dbname:province_temp_all

engine=create_engine('mysql+pymysql://root:root@192.168.4.190:3306/china_all')
sql=text('select * from province_temp_all')
connect = engine.connect()
mydata=pd.read_sql(sql,connect)
print(mydata.info())

可以看到,数据共有9384行4列。

print(mydata.head())

获取山东省平均气温数据

temp_sd=mydata[mydata['province']=='山东']
print(temp_sd.head())

建立时序数据。温度的数据膨胀因子为10,因此在处理温度时应除以10来还原。

date=pd.period_range('2000/01',periods=len(temp_sd),freq='M')
temp_data=pd.DataFrame(temp_sd['temp'].values/10,index=date,columns=['temp'])
print(temp_data.head())
print(temp_data.tail())

可以看到,数据为2000年1月到2022年12月的平均温度数据

绘制时序图

temp_data.plot()

从图中可以看到,平均气温的趋势性几乎没有,但是存在季节性,即每年的7、8月份左右存在波峰,12、1月份存在波谷。因此可以用相加的模型来处理。

2. 使用指数平滑法建立模型,并预测下一年各月的最低气温

1)建立指数平滑法模型。

hw_model=hw.ExponentialSmoothing(temp_data,trend='add',seasonal='add',seasonal_periods=12).fit()
print(hw_model.summary())

可以看到,α、β、γ的估计值分别是 0.06,1.7262e-11 和2.9277e-09。 α 是非常低,意味着在当前时间点估计得水平是基于历史观测值。 beta 的估计值是接近0.00,表明估计出来的趋势部分的斜率在整个时间序列上是不变的,并且应该是等于其初始值。 直观的感觉, 水平改变非常多,但是趋势部分的斜率b却仍然是大致相同的。同样gamma 的值( 接近为0) 表明当前时间点的季节性部分的估计基于历史观测值。

2)创建该模型的拟合图

temp_data.plot()
hw_model.fittedvalues.plot(label='fitted_values',legend=True)

3)对模型效果进行评估

查看残差自相关图

plot_acf(hw_model.resid)

可以看到,残差滞后20阶的自相关系数都在标准范围内,说明残差几乎没有自相关。

残差平稳性检验

adfuller(hw_model.resid)

可以看到,p值非常小,几乎为0,说明残差是平稳序列。

#残差正态性
plt.figure()
plt.hist(hw_model.resid,density=True)
hw_model.resid.plot(kind='kde')
plt.show()

qqplot(hw_model.resid,line='s')

从直方图、核密度图和正态QQ图可以看到,残差几乎服从正态分布。

4)预测下一年各月的平均气温

temp_forecast1=hw_model.predict(start='2023/01',end='2023/12')
print(temp_forecast1)

绘图

temp_data.plot()
temp_forecast1.plot(label='forecast',legend=True)

3. 使用ARIMA建立模型,并预测下一年各月的气温

1)根据数据的特征,对数据进行差分使数据平稳。

temp_data_diff1=temp_data.diff(12).dropna()   #去除季节性
temp_data_diff2=temp_data_diff1.diff().dropna()
temp_data_diff2.plot()

从图形上看,数据已经趋于平稳

单位根检验

adfuller(temp_data_diff2['temp'])

可以看到,p值非常小,几乎为0,说明数据已经是平稳序列。

2)找到ARIMA模型的最优参数

  • 通过自相关和偏自相关图形寻找
plot_acf(temp_data_diff2)

plot_pacf(temp_data_diff2)

通过acf图,定q=1,通过pacf,定p=3,因此ARIMA模型的参数为ARIMA(3,1,1)

  • 通过循环寻找最优参数
index=0
parma_df=pd.DataFrame(columns=['p','d','q','AIC'])
for p in range(6):for q in range(6):        try:myfit=ARIMA(temp_data_diff1,order=(p,1,q)).fit()parma_df.loc[index]=[p,1,q,myfit.aic]index+=1except:passmin_param=parma_df.loc[parma_df['AIC'].idxmin()]
print(parma_df)
print('最优的参数为index=%d,p=%d,d=1,q=%d,AIC=%f.2'%(min_param.name,min_param['p'],min_param['q'],min_param['AIC']))

可以看到,最优的p、q值为第35个,p=5,q=5。

3)根据最优参数建立ARIMA模型

arima_model=ARIMA(temp_data_diff1,order=(5,1,5)).fit()
print(arima_model.summary())

返回一份格式化的模型报告,包含模型的系数、p值、AIC和BIC等详细指标。

查看拟合图

#还原季节差分
temp_fittedvalues=temp_data.shift(12,freq='M')['temp']+arima_model.fittedvalues
temp_data.plot()
temp_fittedvalues.plot(label='fitted_values',legend=True)

4)对模型效果进行评估

#残差自相关图
plot_acf(arima_model.resid)

在残差滞后20阶的自相关图可以看到,自相关系数都在标准范围内,均接近于0,说明残差基本没有自相关性

残差平稳性检验

adfuller(arima_model.resid)

可以看到,通过单位根检验,可以看到p值接近0,不存在单位根,因此可以认为残差序列是平稳的。

残差正态性

plt.figure()
plt.hist(arima_model.resid,density=True)
arima_model.resid.plot(kind='kde')
plt.show()
qqplot(arima_model.resid,line='s')

从直方图、

核密度图和正态QQ图可以看到,残差几乎服从正态分布。

5)预测下一年各月的最低气温

temp_forecast_diff1=arima_model.forecast(12)
print(temp_forecast_diff1)

还原季节差分

temp_forecast=temp_data.iloc[-12:,:].shift(12,freq='M')['temp']+temp_forecast_diff1
print(temp_forecast)

绘图

temp_data.plot()
temp_forecast.plot(label='forecast',legend=True)

4. 比较两种模型的优劣

#指数平滑法RMSE
hw_mse=np.power(temp_data['temp'].iloc[12:,].values-hw_model.fittedvalues.iloc[12:,].values,2).mean()
hw_rmse=np.sqrt(hw_mse)
#ARIMA模型RMSE
arima_mse=np.power(temp_data['temp'].iloc[12:,].values-temp_fittedvalues.iloc[:-12,].values,2).mean()
arima_rmse=np.sqrt(arima_mse)
print('指数平滑法RMSE为%.4f,ARIMA模型RMSE为%.4f'%(hw_rmse,arima_rmse))

通过比较指数平滑法和ARIMA的同期数据计算的RMSE(均方根误差),可以看到指数平滑法的RMSE更小,因此,指数平滑法的模型精度更高。

5. 将预测的数据更新到数据库中

在province_temp表中,存了各省份1-12月的平均气温和预测气温,预测气温为0。

先查看province_temp表中山东的数据,(需要进入mysql)如下:

select * from province_temp where province="山东";

然后继续在Spyder中,通过前面的指数平滑法预测后,将预测的数据更新到数据库表中

for i in range(len(temp_forecast1)):mytext='update province_temp set temp_forecast=%.4f where province="山东" and month=%d' % (temp_forecast1[i],i+1)sql=text(mytext)connect = engine.connect()connect.execute(sql)

运行以上代码块,然后在MySQL中查看山东的气温数据,如下:

可以看到,山东预测的气温数据已经更新到数据库表中。


http://www.hkcw.cn/article/VKUDAisybC.shtml

相关文章

C++ - STL #什么是STL #STL的版本 #闭源开源 #STL的六大组件

文章目录 前言 一、什么是STL 二、STL的版本 1、原始版本 2、P.J.版本 3、RW版本 4、SGI版本 三、闭源、开源 四、STL的六大组件 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索&#xff1b; 一、什么是STL STL(standard template libaray 标准模板库)&#…

学习STC51单片机22(芯片为STC89C52RCRC)

记住这个AT指令千万不要去脑子记&#xff0c;要用手册查 每日一言 努力不是为了感动谁&#xff0c;而是为了不辜负自己的野心。 硬件&#xff1a;ESP8266 wife模块 蓝牙&#xff0c;ESP-01s&#xff0c;Zigbee&#xff0c;NB-lot等通信模块都是基于AT指令的设计 老样子 我们用…

华为OD机试真题——统计匹配的二元组个数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《统计匹配的二元组个数》:…

LLMTIME: 不用微调!如何用大模型玩转时间序列预测?

今天是端午节&#xff0c;端午安康&#xff01;值此传统佳节之际&#xff0c;我想和大家分享一篇关于基于大语言模型的时序预测算法——LLMTIME。随着人工智能技术的飞速发展&#xff0c;利用大型预训练语言模型&#xff08;LLM&#xff09;进行时间序列预测成为一个新兴且极具…

Unity3D仿星露谷物语开发56之保存角色位置到文件

1、目标 游戏中通过Save Game保存角色位置&#xff0c;当重启游戏后&#xff0c;通过Load Game可以恢复角色的位置。 2、Player对象操作 &#xff08;1&#xff09;组件添加 给Hierarchy下的Player组件添加Generate GUID组件。 &#xff08;2&#xff09;修改SceneSave.cs脚…

AI书签管理工具开发全记录(八):Ai创建书签功能实现

文章目录 AI书签管理工具开发全记录&#xff08;八&#xff09;&#xff1a;AI智能创建书签功能深度解析前言 &#x1f4dd;1. AI功能设计思路 &#x1f9e0;1.1 传统书签创建的痛点1.2 AI解决方案设计 2. 后端API实现 ⚙️2.1 新增url相关工具方法2.1 创建后端api2.2 创建crea…

【计算机网络】第3章:传输层—概述、多路复用与解复用、UDP

目录 一、概述和传输层服务 二、多路复用与解复用 三、无连接传输&#xff1a;UDP 四、总结 &#xff08;一&#xff09;多路复用与解复用 &#xff08;二&#xff09;UDP 一、概述和传输层服务 二、多路复用与解复用 三、无连接传输&#xff1a;UDP 四、总结 &#xff08…

leetcode hot100刷题日记——30.两数之和

解答&#xff1a; 方法一&#xff1a;迭代 迭代大致过程就是&#xff1a; 算两条链表的当前位的和&#xff0c;加上上一位留下来的进位&#xff0c;就是新链表的当前位的数字。计算当前的进位。 这样&#xff0c;我们迭代需要的东西是&#xff1a;链表1&#xff0c;链表2&…

飞腾D2000与FPGA结合的主板

UD VPX-404是基于高速模拟/数字采集回放、FPGA信号实时处理、CPU主控、高速SSD实时存储架构开发的一款高度集成的信号处理组合模块&#xff0c;采用6U VPX架构&#xff0c;模块装上外壳即为独立整机&#xff0c;方便用户二次开发。 UD VPX-404模块的国产率可达到100%&#xff0…

Baklib知识中台驱动服务升级

知识中台架构升级路径 在数字化转型背景下&#xff0c;Baklib通过重构知识中台的技术底座与服务体系&#xff0c;形成了分层解耦的模块化架构。该架构以四库体系为核心支撑&#xff0c;通过分布式存储引擎与语义分析算法的深度耦合&#xff0c;实现了多源异构数据的标准化接入…

NHANES指标推荐:ALI

文章题目&#xff1a;A cross-sectional study examining the relationship between the advanced lung cancer inflammation index and prostate cancer 中文标题&#xff1a;一项检查晚期肺癌炎症指数与前列腺癌之间关系的横断面研究 发表杂志&#xff1a;Journal of Health…

Python训练打卡Day38

Dataset和Dataloader类 知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 在遇到大规模数据集时&#xff0c;显存常常无法一次性存储所有数据&#xff0c;所以需要使用分批训练的…

leetcode付费题 353. 贪吃蛇游戏解题思路

贪吃蛇游戏试玩:https://patorjk.com/games/snake/ 问题描述 设计一个贪吃蛇游戏,要求实现以下功能: 初始化游戏:给定网格宽度、高度和食物位置序列移动操作:根据指令(上、下、左、右)移动蛇头规则: 蛇头碰到边界或自身身体时游戏结束(返回-1)吃到食物时蛇身长度增加…

NLP学习路线图(十三):正则表达式

在自然语言处理&#xff08;NLP&#xff09;的浩瀚宇宙中&#xff0c;原始文本数据如同未经雕琢的璞玉。而文本预处理&#xff0c;尤其是其中至关重要的正则表达式技术&#xff0c;正是将这块璞玉转化为精美玉器的核心工具集。本文将深入探讨正则表达式在NLP文本预处理中的原理…

【算法】动态规划

一、动态规划的基本思想 动态规划算法与分治法类似&#xff0c;其基本思想也是将待求解的较大规模问题分解为若干个较小的子问题&#xff0c;先求解子问题&#xff0c;再从这些子问题的解得到原问题的解。 但动态规划法有自己的特点。分治法的子问题相互独立&#xff0c;适合动…

设计模式——原型设计模式(创建型)

摘要 本文详细介绍了原型设计模式&#xff0c;这是一种创建型设计模式&#xff0c;通过复制现有对象&#xff08;原型&#xff09;来创建新对象&#xff0c;避免使用new关键字&#xff0c;可提高性能并简化对象创建逻辑。文章阐述了其优点&#xff0c;如提高性能、动态扩展和简…

java程序从服务器端到Lambda函数的迁移与优化

source&#xff1a;https://www.jfokus.se/jfokus24-preso/From-Serverful-to-Serverless-Java.pdf 从传统的服务器端Java应用&#xff0c;到如今的无服务器架构。这不仅仅是技术名词的改变&#xff0c;更是开发模式和运维理念的一次深刻变革。先快速回顾一下我们熟悉的“服务…

57、IdentityServer4概述

IdentityServer4是一个基于ASP.NET Core的开源身份认证和授权框架&#xff0c;实现了OpenID Connect和OAuth 2.0协议。它为现代应用程序提供集中式的身份验证和授权服务&#xff0c;支持单点登录&#xff08;SSO&#xff09;、令牌颁发与验证、会话管理等功能&#xff0c;广泛应…

2025.5.29 学习日记 docker概念以及基本指令

Docker&#xff1a; Docker 是一种开源的容器化平台&#xff0c;用于快速部署应用程序&#xff0c;实现开发、测试和生产环境的一致性。 一、Docker 核心概念 镜像&#xff08;Image&#xff09; 只读的模板文件&#xff0c;用于创建容器&#xff0c;类似虚拟机的镜像&#x…

AI与智能驾驶的关系和原理:技术融合与未来展望-优雅草卓伊凡一、AI大模型基础原理与智能驾驶

AI与智能驾驶的关系和原理&#xff1a;技术融合与未来展望-优雅草卓伊凡 一、AI大模型基础原理与智能驾驶 1.1 AI大模型的核心架构 本内容由优雅草木心为卓伊凡提供技术辅助讲解&#xff0c;毕竟木心目前正在比亚迪。 人工智能大模型是基于深度学习的复杂神经网络系统&#…