简介这是一套面向高校学生与Python初学者的天气预测与可视化完整项目源码适用于课程设计、期末大作业或数据分析入门练习。项目按爬取与处理数据、数据预测含评价方法、数据可视化三部分组织配有详细使用说明文档可帮助读者理解从原始数据到预测结果再到图表呈现的完整链路。压缩包共24个文件约1.42MB包含4个Python脚本、4个CSV数据集、1个已训练模型文件、1个HTML页面及多张效果截图另附readme说明与依赖忽略配置结构清晰便于按模块查阅。目前已有203人学习下载。读者可据此获得可直接运行的完整代码、训练与测试数据、模型文件及图文说明既能对照复现预测流程也能借鉴评价指标与可视化实现方式适合作为课程作业参考或二次开发基础。1. 从一份能跑通的天气预测大作业说起期末周临近不少同学在找一份能直接跑通、结构清晰的 Python 天气预测项目。这份资源包含完整源码、训练数据、模型文件和一份中文使用文档目录里有main.py、GetData.py、ProcessData.py、GetModel.py四个核心脚本外加date_train.csv、date_test.csv、date_valid.csv三份数据以及一个已经训练好的Model.pkl。它解决的不是从零教你 Python的问题而是给你一条已经走通的链路爬天气数据、清洗特征、训练模型、评估误差、最后出可视化图表。适合正在做课程设计、需要交一份有预测有图表的大作业、又不想在环境配置上耗掉三天的人。我拿到包之后第一件事是看readme.md和main.py的调用顺序确认它到底能不能在我机器上复现下面把整个过程拆开讲。2. 拆包先看结构四个脚本各自管什么2.1 目录清单与模块职责拿到压缩包解压后根目录下大致是这些内容文件/目录作用main.py主入口串联数据获取、处理、训练、可视化GetData.py从天气网抓取原始数据产出china_today.csvProcessData.py清洗、划分训练/测试/验证集产出三份 date_*.csvGetModel.py读取训练集训练模型并保存为Model.pkldate_train.csv/date_test.csv/date_valid.csv已划分好的数据集Model.pkl预训练模型可直接加载做预测天气网.html爬取目标页面的本地留存image/下若干 jpg可视化结果截图readme.md使用说明这个结构的好处是职责分离清楚抓数据、洗数据、训模型、出图各管一段。你改爬虫只动GetData.py换模型只动GetModel.py不会牵一发动全身。常见做法是先把main.py从头读一遍看清楚它 import 了哪些模块、按什么顺序调用再决定是整体跑还是分步跑。2.2 依赖环境与版本确认项目基于 Python用到的库从脚本名和功能推断至少涉及pandas、numpy、requests、beautifulsoup4、scikit-learn、matplotlib。先确认本机 Python 版本再装依赖# 确认 Python 版本建议 3.8 及以上 python --version # 一次性安装常用依赖 pip install pandas numpy requests beautifulsoup4 scikit-learn matplotlib # 如果项目根目录有 requirements.txt优先用它 pip install -r requirements.txt逻辑说明python --version先排除版本过低导致的语法不兼容pip install那行覆盖了爬取、处理、建模、绘图四类库。参数上scikit-learn负责模型训练和评价指标matplotlib负责出图beautifulsoup4配合requests做页面解析。如果装完 import 报错八成是某个库版本太新改了 API常见做法是降到文档里提到的版本区间或者用虚拟环境隔离# 建虚拟环境避免污染全局 python -m venv venv # Windows 激活 venv\Scripts\activate # macOS / Linux 激活 source venv/bin/activate提示先跑通再改代码。很多人一上来就改模型参数结果报错分不清是环境问题还是自己改坏了血泪经验是先原样跑一遍留个基准。3. 数据链路从天气网抓取到三份 CSV3.1 爬取脚本 GetData.py 的输入输出GetData.py的职责是把网页上的天气数据抓下来落成china_today.csv。它依赖本地留存的天气网.html作为解析目标这样即使目标站点结构变动你也能对着本地文件调解析逻辑。典型写法是用requests拿页面、BeautifulSoup定位表格或列表节点再逐行抽字段import requests from bs4 import BeautifulSoup import pandas as pd # 读取本地留存的页面避免频繁请求 with open(天气网.html, r, encodingutf-8) as f: html f.read() soup BeautifulSoup(html, html.parser) # 定位数据行具体选择器按实际页面结构调整 rows soup.select(ul.weather_list li) records [] for row in rows: records.append({ city: row.select_one(.city).get_text(stripTrue), temp: row.select_one(.temp).get_text(stripTrue), weather: row.select_one(.wea).get_text(stripTrue), }) df pd.DataFrame(records) df.to_csv(china_today.csv, indexFalse, encodingutf-8-sig)逻辑说明先读本地 HTML 而不是直接请求网络是为了让解析逻辑可复现、不受网络波动影响。select里的选择器必须和天气网.html的真实结构对上对不上就返回空列表。encodingutf-8-sig是为了 Excel 打开不乱码。参数上indexFalse去掉行号列避免后续读取多出一列无用索引。如果你要抓实时数据把读文件换成requests.get(url)即可但记得加请求头和延时别把人家站点打挂。3.2 清洗与划分ProcessData.py 干了什么ProcessData.py把原始 CSV 变成能喂给模型的三份数据集。核心动作通常包括去掉缺失值、把温度字段从字符串转成数值、把日期解析成时间序列、按时间顺序切分训练/验证/测试。时间序列不能随机打乱划分否则会用未来数据预测过去这是最常见的翻车点import pandas as pd df pd.read_csv(china_today.csv) # 温度字段常带 ℃ 或 °先清洗成数值 df[temp] df[temp].str.replace(℃, ).str.replace(°, ).astype(float) # 日期解析并排序时间序列必须按时间排 df[date] pd.to_datetime(df[date]) df df.sort_values(date).reset_index(dropTrue) # 按 7:1:2 顺序切分不能 shuffle n len(df) train df.iloc[:int(n * 0.7)] valid df.iloc[int(n * 0.7):int(n * 0.8)] test df.iloc[int(n * 0.8):] train.to_csv(date_train.csv, indexFalse) valid.to_csv(date_valid.csv, indexFalse) test.to_csv(date_test.csv, indexFalse)逻辑说明str.replace链式去掉温度单位再astype(float)是处理带单位数值字段的标准套路。sort_values(date)保证时间顺序iloc切片按比例顺序切分绝不sample随机抽。参数上7:1:2 是常见比例验证集用来调参、测试集只在最后评估用一次。如果你发现date_train.csv里日期是乱的说明上游没排序模型效果会虚高这是典型的评估失真。3.3 三份 CSV 的字段与用途对照文件用途使用时机date_train.csv训练模型建模阶段反复用date_valid.csv调参、选模型训练中验证date_test.csv最终评估只评估一次注意验证集和测试集别混用。拿测试集调参等于提前偷看答案报告里的分数好看但没意义答辩时被问一句你怎么调的参就露馅。4. 建模与评估Model.pkl 怎么来的、怎么用4.1 GetModel.py 的训练流程GetModel.py读训练集、训练模型、存成Model.pkl。天气预测常见做法是把它当回归问题预测温度数值或分类问题预测晴/雨。从资源里有Model.pkl看它用的是scikit-learn的模型加pickle序列化import pandas as pd import pickle from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error, r2_score train pd.read_csv(date_train.csv) valid pd.read_csv(date_valid.csv) # 特征与目标按实际列名调整 features [humidity, wind, pressure] target temp model RandomForestRegressor(n_estimators100, random_state42) model.fit(train[features], train[target]) # 验证集评估 pred model.predict(valid[features]) print(MAE:, mean_absolute_error(valid[target], pred)) print(R2:, r2_score(valid[target], pred)) # 保存模型 with open(Model.pkl, wb) as f: pickle.dump(model, f)逻辑说明RandomForestRegressor对特征缩放不敏感、抗过拟合适合这种中小规模表格数据。random_state42固定随机种子保证结果可复现。评估用 MAE平均绝对误差看预测偏差多少度R2 看拟合优度。参数上n_estimators100是树的数量调大更稳但更慢features列表必须和 CSV 列名严格一致写错直接 KeyError。保存用pickle.dump加载时pickle.load即可。4.2 加载已有模型直接预测资源里已经给了Model.pkl你可以跳过训练直接预测这在赶作业时很省事import pandas as pd import pickle with open(Model.pkl, rb) as f: model pickle.load(f) test pd.read_csv(date_test.csv) pred model.predict(test[[humidity, wind, pressure]]) test[pred_temp] pred test.to_csv(date_pred.csv, indexFalse) print(test[[date, temp, pred_temp]].head())逻辑说明pickle.load反序列化模型特征列必须和训练时完全一致顺序和名称都不能变否则预测结果错得离谱还不报错。test[[humidity, wind, pressure]]这里列名要对着你实际的 CSV 改。常见坑是训练时用了五列、预测时只给三列sklearn 会直接抛特征数量不匹配的错这反而是好事怕的是列数对但顺序错那才是黑匣子。4.3 评价指标怎么读指标含义好坏的判断MAE平均绝对误差越小越好单位同温度MSE均方误差对大误差敏感R2拟合优度越接近 1 越好可为负提示R2 为负说明模型还不如直接拿均值预测这时候别急着交先回去查特征和划分。5. 避坑与排查跑不通时先看这几条5.1 编码报错UnicodeDecodeError现象读 CSV 或 HTML 时抛UnicodeDecodeError: utf-8 codec cant decode。原因Windows 下 Excel 存的 CSV 常是 GBK 编码或者网页本身不是 UTF-8。解决读的时候显式指定编码pd.read_csv(x.csv, encodinggbk)写的时候用utf-8-sig兼顾 Excel。5.2 特征列名不匹配KeyError现象model.predict或fit时报某个列名不存在。原因CSV 实际列名和代码里写的不一致可能是大小写、空格或中文列名。解决先print(df.columns.tolist())把真实列名打出来再逐字对照代码里的列表别靠肉眼猜。5.3 时间序列随机划分导致分数虚高现象验证集 R2 高达 0.99测试集一塌糊涂。原因划分时用了train_test_split(shuffleTrue)把未来数据混进了训练集。解决改回按时间顺序iloc切片确保训练集时间早于验证集、验证集早于测试集。5.4 模型加载后预测结果全一样现象Model.pkl加载后预测出来所有值相同。原因多半是特征传错比如传了全 0 或传了索引列。解决检查传入的 DataFrame 是不是真的有你想要的列print(X.head())看一眼数值是否正常。5.5 爬虫拿到空数据现象china_today.csv只有表头没有内容。原因页面选择器和天气网.html实际结构对不上或者页面是 JS 动态渲染的。解决打开天气网.html用浏览器开发者工具核对选择器动态渲染的页面得换解析方式或找数据接口。6. 可视化与进阶把预测结果画成能交差的图出图是这份作业拿分的关键评审看的不只是数字还有图表是否清晰。main.py里通常会用matplotlib画真实值 vs 预测值的对比曲线。下面这段可以直接抄改列名即可import pandas as pd import matplotlib.pyplot as plt import matplotlib # 中文字体Windows 用 SimHeimacOS 用 Arial Unicode MS matplotlib.rcParams[font.sans-serif] [SimHei] matplotlib.rcParams[axes.unicode_minus] False df pd.read_csv(date_pred.csv) df[date] pd.to_datetime(df[date]) plt.figure(figsize(12, 5)) plt.plot(df[date], df[temp], label真实温度, linewidth1.5) plt.plot(df[date], df[pred_temp], label预测温度, linestyle--) plt.xlabel(日期) plt.ylabel(温度) plt.title(天气预测结果对比) plt.legend() plt.tight_layout() plt.savefig(pred_vs_true.png, dpi150) plt.show()逻辑说明rcParams两行解决中文乱码和负号显示问题这是 matplotlib 出图最常见的玄学。plot两条线对比真实和预测linestyle--区分预测线。dpi150保证截图清晰tight_layout防止标签被裁。参数上figsize按需调横轴是日期时建议宽一点。进阶一点你可以把误差也画出来或者做多城市对比。验证方法很简单把date_pred.csv里temp和pred_temp两列的差值算出来画成误差分布直方图如果误差集中在 0 附近且没有明显偏移说明模型没系统性偏差。我一般还会把 MAE 标在图上答辩时一眼就能说清精度。从那以后我每次拿到这类项目都强制先原样跑一遍main.py留基准再动任何一行代码这样出问题能立刻定位是环境还是改动。希望帮到你。本文还有配套的精品资源点击获取
