
简介这是一份基于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 环境依赖先装基础库再单独装TensorFlowrequirements.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 python3.9 -y conda activate weather pip install pandas numpy scikit-learn joblib matplotlib requests jupyter pip install tensorflow2.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, window30): 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, window30) print(X.shape) # (样本数, 30, 特征数)逻辑说明每次取连续的30个时间步作为输入X第31个时间步作为预测目标y然后窗口整体向后滑动一步。这就是LSTM最常用的滑窗法——用过去一个月的气温序列去预测下一天的气温。代码里循环做了三件事切片、对齐、收集最终返回的是三维数组。参数说明window30是这里最值得调整的超参。它代表模型每次看多长的历史数据。窗口太短模型学不到周期性规律典型表现是预测值滞后于实际变化窗口太长训练样本数量减少而且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_modelMPL_temperature_prediction_model.h53层MLPtensorflow.keras.models.load_modelrandom_forest_model.pkl随机森林joblib.loadlinear_regression_model.pkl线性回归joblib.loaddecision_tree_model.pkl决策树joblib.loadmlp_scaler.joblib / lstm_scaler.joblib归一化器joblib.loadpkl和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(textf预测温度{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编写而你的本地环境加载的是旧版本TensorFlowKeras接口就会缺失。反之如果环境是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里显式指定encodingutf-8或者encodinggbk如果两种都不对就改用encodinggb18030它的字符覆盖面比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给老师演示。整套流程几分钟就能走一遍。希望帮到你。本文还有配套的精品资源点击获取