☰
Python天气预测与可视化项目:从LSTM到GUI的完整毕设实践
2026/10/3 3:21:48 网站建设 项目流程

简介:这是一份基于Python的天气预测与可视化高分毕业设计项目,面向计算机相关专业需完成毕业设计、课程设计或期末大作业的学生,也适合想通过完整实战项目提升编程能力的学习者。压缩包共38个文件,约12.17MB,涵盖py源码、ipynb交互式分析笔记、png/jpg可视化图表、csv历史天气数据、json城市字典,以及pkl、h5、joblib格式的预训练模型和docx文档说明。代码部分包含随机森林、LSTM、3层MLP等气温预测模型,提供全国天气信息爬取与临沧历史天气爬取脚本,并实现了正式版与最简版两种GUI可视化界面。配合数据探索模块与文档手册,使用者可快速掌握数据获取、模型训练、结果可视化全流程。目前已有99人学习,项目经导师指导且评审分99分,代码完整可运行,能有效支撑相关选题的二次开发与答辩展示。

1. 基于Python的天气预测与天气可视化项目:为什么说它适合直接拿来当毕设骨架

这个项目我拆完第一遍的感受是:它把课程设计和毕业设计里最容易卡住的三件事——数据怎么来、模型怎么训、结果怎么给老师演示——全都用可运行的代码给串起来了。资源里既有LSTM气温预测、3层MLP(压缩包里的文件名写作MPL,实际是MLP)、随机森林、决策树、线性回归这几个不同复杂度的模型,也有全国天气信息爬虫、临沧历史天气爬虫和数据探索脚本,再加上一套GUI可视化界面。它能解决的问题不是“做出一个高精度气象模型”,而是“让一个普通学生拿到源码之后,能照着跑通、能改、能答辩”。适合两类人:一类是正在做Python课程设计、期末大作业或者毕业设计的计算机相关专业学生;另一类是想要一份完整数据分析与可视化练手项目的学习者。下面我从文件结构、模型参数、GUI流程和踩坑点逐层拆给你看。

2. 先看清代码文件的三类角色:环境依赖、数据集和程序入口

拿到压缩包先别急着双击运行,花十分钟把文件按功能分成三类,后面遇到任何报错都能直接定位到具体文件,而不是对着几十个文件挨个猜。整个项目本质上是一条“爬虫数据入库 → 探索可视化 → 训练模型 → GUI演示”的生产链路,理解这条链,比记住某一行的写法重要得多。

2.1 环境依赖:先装基础库,再单独装TensorFlow

requirements.txt 在压缩包根目录下,但它只适合用来做参考,不建议一上来就无脑pip install -r requirements.txt。原因很简单:不同机器上的Python版本、GPU环境和已装包版本都不一样,一次性全量安装很容易出现依赖冲突,尤其TensorFlow这个包对版本格外敏感。

我一般会分两步装:先把pandas、numpy、scikit-learn、joblib、matplotlib、requests这些纯数据类库装上,确认它们已经正常工作之后,再单独装TensorFlow。Python版本建议保持在3.8到3.10之间,这个区间对TensorFlow 2.x的兼容性最稳定,爬虫和GUI代码也很少碰到语法兼容问题。

conda create -n weather python=3.9 -y conda activate weather pip install pandas numpy scikit-learn joblib matplotlib requests jupyter pip install tensorflow==2.10.0

逻辑说明:第一行创建名为 weather 的独立虚拟环境,避免污染机器上已有的Python环境;第二行激活;第三行安装项目里除深度学习框架以外的通用依赖;最后一行装TensorFlow 2.10.0,这个版本在Windows和macOS上的预编译轮子都比较齐全。

参数说明:版本号选择上,TensorFlow我没有直接写“latest”,因为2.13以后对部分老显卡和旧版CUDA支持不一致,而2.10是兼容性口碑较好的一个稳定版本。如果你机器上已经有可用的TensorFlow环境,可以直接跳过这一步,等到跑模型脚本时再看报错来微调。

装完依赖之后,建议先跑一遍python -c "import pandas, sklearn, tensorflow as tf; print(tf.__version__)"检查核心库是否导入成功。这一步能过滤掉大约一半的环境配置问题。

2.2 数据集文件关系:哪些是爬虫跑出来的,哪些是训练跑出来的

压缩包里的数据文件不多,但每份的职责要分清。WeatherData.csv 是“全国天气信息爬取.py”的产物,属于全国多城市的天气汇总数据,在GUI正式版里主要用来做城市选择和展示;Lingcang202001-202312.csv 是“临沧历史天气爬取.py”爬下来的临沧市2020年1月到2023年12月的历史天气数据,LSTM和MLP模型的训练都基于这份数据。

文件来源用途
WeatherData.csv全国天气信息爬取.pyGUI展示、城市天气查询
Lingcang202001-202312.csv临沧历史天气爬取.py气温预测模型训练
city_dict_1.json / all_county_dict.json爬虫辅助文件城市代码与名称映射
models/*.h5, *.pkl, *.joblib训练脚本输出预测模型的持久化存储
img/*.png, *.jpg运行截图答辩PPT配图、效果展示

这块的认知价值在于:模型文件丢了可以重跑训练脚本生成,CSV丢了可以用爬虫重新爬。整个项目的自愈能力很强,这对毕业设计答辩来说是一个隐藏加分项——老师问“你的数据怎么来的”,你就指着这两个爬虫脚本讲;问“模型怎么来的”,你就指着训练脚本和产物文件讲。

2.3 两个启动入口:训练脚本和GUI程序

项目里有两条清晰的主线。第一条是“机器学习气温预测模型.py”和“LSTM气温预测.py”这类训练脚本,负责训练模型并输出到models目录;第二条是“GUI最简版.py”和“GUI正式版.py”,负责把预测结果和天气数据展示出来。

# 训练入口 python 机器学习气温预测模型.py # LSTM单独训练入口 python LSTM气温预测.py # 交互式可视化入口 python GUI正式版.py

逻辑说明:先跑训练脚本,让models目录下生成h5、pkl、joblib这些模型文件,再启动GUI正式版。如果你直接开GUI但找不到模型文件,界面会弹窗报错或者加载失败,这也是我建议按顺序跑的原因。GUI最简版是给新手做环境验证用的,当你只是想快速确认环境没问题,先跑它最省事。

另外,key_predictions.py 这个脚本在答辩现场很有用,它的核心价值在于给定日期或特征组合,快速输出预测值,不需要每次预测都启动完整GUI。适合在演示前把几个关键日期算好写到笔记里,现场直接背板展示。

3. 气温预测项目怎么落地:LSTM与MLP的参数设定和模型产物用法

训练模型这部分是整个项目的技术核心。很多人第一次跑这类源码容易陷入一个误区,就是打开ipynb从头跑到尾,看到accuracy或者loss就签字画押了。实际上天气预测项目里,数据怎么组织成序列、窗口长度选多少、归一化用的scaler有没有参与逆变换,这些细节才真正决定模型的实用价值。

3.1 拿到CSV先看字段,再决定训练数据怎么构造

Lingcang202001-202312.csv 这份数据我建议先按下面的方式读取,把列名和缺失值情况打出来,再做后续处理。不要拿到文件就假设它有固定的列结构。

import pandas as pd df = pd.read_csv('Lingcang202001-202312.csv') print(df.columns.tolist()) # 查看全部字段名 print(df.isnull().sum()) # 查看各列缺失值数量 print(df.head()) # 查看前5行数据形态

逻辑说明:第一步先输出所有列名,是为了确认日期列、最高温列、最低温列的确切名称;第二步统计缺失值,时间序列数据里空值处理不当,会导致后面的滑窗序列出现断裂;第三步打印前五行,确认日期格式是“2020-01-01”还是“2020/1/1”,这会影响后续解析方式。

参数说明:isnull().sum() 返回的是每一列的缺失值总数,如果发现某列缺失值比例超过5%,需要决定是填充还是丢弃。我一般对气温列优先用前向填充法,比直接删行更能保留时间序列的连续性。

3.2 LSTM建模:窗口长度决定记忆范围

LSTM气温预测.ipynb 和 LSTM气温预测.py 两个文件是同一个模型的双格式版本,ipynb适合边看边跑边改,py适合跑批处理。这里的核心是把一维的时间序列转换成“过去30天预测下一天”的监督学习样本。

import numpy as np def create_sequences(data, window=30): X, y = [], [] for i in range(window, len(data)): X.append(data[i - window:i]) y.append(data[i]) return np.array(X), np.array(y) # 假设 data 是经过归一化后的温度序列 X, y = create_sequences(data, window=30) print(X.shape) # (样本数, 30, 特征数)

逻辑说明:每次取连续的30个时间步作为输入X,第31个时间步作为预测目标y,然后窗口整体向后滑动一步。这就是LSTM最常用的滑窗法——用过去一个月的气温序列去预测下一天的气温。代码里循环做了三件事:切片、对齐、收集,最终返回的是三维数组。

参数说明:window=30是这里最值得调整的超参。它代表模型每次看多长的历史数据。窗口太短,模型学不到周期性规律,典型表现是预测值滞后于实际变化;窗口太长,训练样本数量减少,而且LSTM的记忆能力也会被稀释。从临沧这种亚热带季风气候来看,30天窗口已经能覆盖月尺度上的气温波动节奏。你在自己的项目里可以试一组10、20、30、45的对比实验,把每个窗口的验证集误差记录下来,选误差最小的。

另外,训练之前务必用前一章提到的scaler做归一化,把温度压到0到1区间。预测完再调用scaler.inverse_transform()把结果还原成真实温度。很多用户抱怨模型预测值飘得离谱,八成就是漏了逆变换这一步。

3.3 多模型对照和模型产物加载方式

这个项目的聪明之处在于它不是一个模型单打独斗,而是同时提供了LSTM、3层MLP、随机森林、决策树、线性回归五个模型产物:

模型文件对应算法加载方式
LSTM_temperature_prediction_model.h5LSTMtensorflow.keras.models.load_model
MPL_temperature_prediction_model.h53层MLPtensorflow.keras.models.load_model
random_forest_model.pkl随机森林joblib.load
linear_regression_model.pkl线性回归joblib.load
decision_tree_model.pkl决策树joblib.load
mlp_scaler.joblib / lstm_scaler.joblib归一化器joblib.load

pkl和h5两类文件的加载路径不同。深度学习模型(h5)需要keras里的load_model来加载,它会连同网络结构和权重一起恢复;机器学习模型(pkl)则用joblib.load读取,读取之后直接调predict方法。

import joblib from tensorflow.keras.models import load_model # 加载LSTM lstm_model = load_model('models/LSTM_temperature_prediction_model.h5') # 加载随机森林 rf_model = joblib.load('models/random_forest_model.pkl') # 用一条样本做预测 rf_pred = rf_model.predict([[2023, 6, 15]]) # 年月日作为示例特征

逻辑说明:这里展示的是两个典型模型的加载差异。LSTM模型读进来之后可以直接对序列做预测,而随机森林模型用的是普通结构化特征,特征排列顺序必须和训练时完全一致,否则预测结果会发生漂移。实际的特征组合以代码里的特征列表为准。

参数说明:[[2023, 6, 15]]只是演示占位,真实特征可能是气温、湿度、风速等数值列的组合。当你复制这段代码之前,一定要先看训练脚本里X_train到底包含哪些列,然后按相同顺序构造。

4. 可视化链路拆解:从数据探索到GUI正式版

可视化是这个课题的另一个大板块。压缩包里img目录下有十几张运行截图,很多人在答辩PPT里直接用了这些图。但如果你想在演示现场自己跑出图来,就必须要理解“气温可视化.ipynb”和“GUI正式版.py”这两条可视化路径分别是怎么工作的。

4.1 数据探索和可视化脚本:先看清天气数据的分布形态

数据探索.py 和气温可视化.ipynb的功能有重叠,但侧重点不一样。数据探索脚本偏统计,比如计算每个月平均气温、画出气温随日期变化的折线图、观察异常值的分布;ipynb则适合做交互式调整,跑一段改一段,画出来的图直接保存在当前目录,最终变成你报告里的插图。

这类脚本里最常见的可视化操作是画出气温随时间变化的曲线。第一次跑通之后,你可以做两个小改动让它更贴合自己的报告主题:一是把图例从英文改成中文,二是把单条温度曲线改成最高温和最低温双线绘制。这两处改动成本很低,但视觉效果提升非常明显。

4.2 GUI最简版:理解最小闭环是怎么走通的

GUI最简版.py 是整个项目里最容易读懂的启动文件。它做的事情非常收敛:加载训练好的模型、读入待预测的数据、运行预测并输出结果。这三点串联起来就是一个最小的“加载模型 → 给数据 → 出预测”闭环。

# GUI最简版的核心逻辑示意 import tkinter as tk from tkinter import filedialog from tensorflow.keras.models import load_model model_path = filedialog.askopenfilename(title='请选择模型文件') model = load_model(model_path) def do_predict(): value = entry.get() # 从输入框取日期或特征 result = model.predict(value) # 执行预测 label.config(text=f'预测温度:{result[0][0]:.2f}')

逻辑说明:这四行代码并不完整,但表达的是整个GUI最简版的骨架。窗口先弹一个文件选择框让你挑h5模型文件,然后用户通过输入框提交待预测特征,点击按钮之后触发do_predict函数,把结果显示在标签上。无论界面多复杂,后台永远走这个三步闭环。

参数说明:result[0][0]这种索引方式在气温预测里很常见,它取的是预测结果矩阵的第一个样本的第一个数值,也就是模型认为最有可能的那个温度值。如果你的预测任务是最高温和最低温同时输出,这里的索引就要改为result[0]取整行,对应两个数值。

4.3 GUI正式版:城市选择、全国天气数据和模型预测在一个窗口里

GUI正式版.py 相比最简版多做了三件事:一是集成了全国天气数据的展示逻辑,让窗口可以切换城市;二是把历史温度曲线画在主界面上,形成“过去走势 + 未来预测”的对照;三是把所有模型封装成可以下拉选择的形式,方便切换不同算法查看输出差异。

这段代码在答辩演示时非常讨巧。当你打开GUI正式版,界面上有城市下拉框、温度曲线和预测结果区,整页信息量很足,评审老师一眼就能看出你在可视化上下了功夫。这个框架后续往里面加功能也不难,比如加一个“未来7天预测”按钮,本质上只要把key_predictions.py里已有的逻辑接到GUI的按钮事件上就行。

需要注意的一点是,GUI正式版对模型的加载顺序有要求。如果模型文件还没生成就直接启动GUI,初始化时会因为找不到h5和pkl而报错退出。正常流程永远是先跑训练脚本,再启动正式版GUI。

5. 复现过程中最容易翻车的四个点:排查与参数修正

代码能跑通是一回事,在你自己的电脑上能跑通又是另一回事。项目本身完整度很高,但环境差异经常导致复现失败。以下四条是我在多个环境里跑这套代码后最有体感的踩坑记录,每一条都按“现象、原因、解决”三个维度展开。

5.1 加载pkl模型报错:pickle版本不兼容

现象:执行到joblib.load('random_forest_model.pkl')时抛出UnpicklingError或者ModuleNotFoundError。

原因:pkl文件本质上是用pickle序列化的Python对象,它对Python版本非常敏感。如果训练这个模型的机器用的是Python 3.7,而你本地是3.10,部分内置类的序列化格式会发生变化,加载时就会直接报错。另外还有一种常见情况是压缩包解压后路径被移动过,joblib文件里嵌入的相对路径指向了不存在的位置。

解决:先把joblib更新到最新版再试一次。如果仍然失败,直接用训练脚本重新训练生成一套新的pkl文件。反正在这个项目里,重新训练随机森林只需要几秒钟,这是一条性价比最高的后悔药。从那以后我每次拿到陌生环境下的pkl文件,都默认先重训一次,不再花时间跟序列化版本较劲。

5.2 TensorFlow版本不一致导致h5模型无法加载

现象:运行GUI正式版时报AttributeError: module 'tensorflow' has no attribute 'keras',或者加载h5时报权重结构不匹配。

原因:TensorFlow 1.x和2.x的API差异巨大。如果训练时的代码基于tf.keras编写,而你的本地环境加载的是旧版本TensorFlow,Keras接口就会缺失。反之,如果环境是2.16这类较新版本,某些旧h5文件里保存的优化器配置也可能与新版本不兼容。

解决:统一使用TensorFlow 2.10到2.12之间的版本。装好之后打开Python交互环境,执行import tensorflow as tf; print(tf.__version__)确认版本号。加载h5文件时使用from tensorflow.keras.models import load_model,而不是直接import keras。这一步能规避掉大部分兼容性报错。

5.3 中文路径和CSV编码导致读取失败

现象:爬虫脚本或数据读取脚本在Windows上运行时,报FileNotFoundError或者UnicodeDecodeError。

原因:两条原因同时存在。第一,Windows系统对中文路径支持不好,项目文件夹如果放在“下载/毕业设计资料/天气预测”这类路径下,中间环节一旦对路径做字符串拼接就容易出问题;第二,CSV文件一般用UTF-8编码保存,但部分爬虫数据在写入时用了GBK编码,pandas默认的parser读GBK文件会直接解码失败。

解决:把整个项目文件夹移动到纯英文路径下,比如D:\weather_project,这是最有效的一招。编码方面,在pd.read_csv里显式指定encoding='utf-8'或者encoding='gbk',如果两种都不对,就改用encoding='gb18030',它的字符覆盖面比gbk更全。这一步属于典型的“参数加一个就好了”案例,但不知道的人会被卡很久。

5.4 模型预测值总是偏向历史均值附近

现象:模型训练时的loss值已经很低了,但预测出来的温度普遍集中在15℃到18℃之间,看不出明显的季节波动。

原因:大多数情况下是预测结束之后没有做归一化的逆变换。训练之前用MinMaxScaler把温度压缩到了0到1之间,模型在这个区间里学习规律,预测结果自然也在0到1附近。如果直接在界面上展示这个值,看起来就会是一个“温吞吞”的数字,缺乏季节变化。

解决:预测完成后强制调用scaler.inverse_transform(pred)还原成真实温度区间。要实现这一点,必须在训练时就把scaler保存成joblib文件,也就是models目录下那两个scaler文件的来历。每次加载模型的同时把scaler也加载进来,这是一套组合动作,缺一个效果就不对。

6. 把它改成你自己城市的气温预测:爬虫脚本和重训流程这样改

如果想把项目里的临沧市替换成你自己的城市,操作路径比你想象中简单。整套改造分两步:第一步是让“临沧历史天气爬取.py”抓到你目标城市的历史数据;第二步是让LSTM训练脚本读取新的CSV并重新生成模型。

第一步的关键是找到城市在天气站点URL里的拼音标识。原脚本里写的是Lingcang,你要换成对应的城市拼音。爬虫的核心逻辑通常是按年份和月份循环请求,然后把返回页面里的日期、最高温、最低温解析后追加写入CSV。实际爬虫脚本里会有一个日期范围和城市名的配置区,那个地方就是你要动的位置。这里我要多说一句:爬虫仅限个人学习和小规模测试用,抓取频率要控制住,不要给站点造成压力。

# 临沧历史天气爬取.py 中的城市参数示意(用你本地实际代码为准) city_code = 'kunming' # 替换成目标城市拼音 start_year = 2020 end_year = 2023 output_csv = 'Kunming202001-202312.csv'

第二步改完爬虫脚本之后,把这个新CSV传给模型训练脚本。把“机器学习气温预测模型.py”和“LSTM气温预测.py”里的数据文件路径从Lingcang202001-202312.csv改成新文件名,然后重新运行训练。训练结束会覆盖models目录下的pkl和h5文件,GUI正式版启动时读到的就是基于你自己城市数据训练的模型。

python 临沧历史天气爬取.py python LSTM气温预测.py python GUI正式版.py

改造完之后,建议算一个验证指标:拿最近一个月的真实历史数据,用训练好的LSTM模型逐日预测,把预测值和真实值画在同一张图上。如果预测误差控制在±2℃以内,说明数据和模型基本自洽。从那以后我每次换城市数据,都会先跑数据探索.py看缺失值比例和日期跨度,确认没有空半年没数据,再进训练脚本跑LSTM,最后才敢启动GUI给老师演示。整套流程几分钟就能走一遍。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询