资讯动态

Python天气预测与可视化项目源码:从数据抓取到模型训练全流程

发布时间:2026/10/12 22:11:01 来源:尧图企业网站定制
简介这份资源是面向高校学生与Python初学者的一套天气预测与可视化完整项目源码适用于期末大作业、课程设计或数据分析入门练习。项目按爬取与处理数据、数据预测含评价方法、数据可视化三部分组织代码经过本地编译验证可运行评审分达95分以上难度适中内容经助教老师审定能满足学习与直接使用需求。压缩包共24个文件约1.42MB包含4个py脚本负责数据抓取、处理、建模与主流程4个csv数据文件与1个pkl模型文件支撑训练与测试另有html页面、md使用文档及12张jpg效果截图便于对照理解运行结果。目前已有203人学习下载。读者可据此获得一套结构清晰的完整赛题方案掌握从数据采集到模型评价再到图表呈现的完整链路并借助使用文档快速复现与二次修改。1. 从一份能跑通的天气预测源码说起它到底解决了什么很多同学做期末大作业时卡点从来不是“不会写 Python”而是不知道一个完整的数据项目该长什么样。这份基于 Python 的天气预测和天气可视化源码恰好把这条链路走通了从天气网抓数据、清洗成训练集、用模型做预测、再把结果画成图。它不是一个孤立的算法片段而是一个能从头跑到尾的小型工程。项目里带了GetData.py、ProcessData.py、GetModel.py、main.py四个核心脚本外加date_train.csv、date_test.csv、date_valid.csv三份数据以及一个已经训练好的Model.pkl。对正在找“python 天气预测和天气可视化项目代码”的人来说这份资源的价值在于它把数据采集、特征处理、模型训练、可视化展示四个环节都摆在了明面上你可以直接读、直接改、直接交。适合谁适合需要一份结构完整、能本地复现的课程设计参考的本科生也适合想快速了解天气预测项目全貌的入门开发者。2. 拆开目录看设计四个脚本如何串成一条数据流水线2.1 从GetData.py到china_today.csv数据从哪来这份资源的第一段链路是数据获取。GetData.py负责从天气网页面抓取原始数据输出china_today.csv和天气网.html。很多同学拿到源码后直接跑main.py结果报错说找不到date_train.csv原因就是跳过了抓取和生成训练数据这一步。常见做法是先确认GetData.py里的目标 URL 和解析规则是否还能匹配当前页面结构再执行抓取。下面是我一般会先跑一遍的检查脚本用来确认抓取结果是否落盘、字段是否齐全。# check_raw.py import pandas as pd import os # 检查原始抓取文件是否存在 raw_path china_today.csv if not os.path.exists(raw_path): print(china_today.csv 不存在请先运行 GetData.py) else: df pd.read_csv(raw_path) print(行数:, len(df)) print(列名:, df.columns.tolist()) print(df.head(3))这段代码的逻辑很简单先判断文件是否存在避免直接read_csv抛出FileNotFoundError再打印行数和列名确认抓取到的字段是否包含日期、温度、天气状况等后续建模需要的信息。参数上raw_path要和你实际运行GetData.py后的输出路径一致。如果列名出现乱码通常是编码问题可以在read_csv里加encodingutf-8或encodinggbk试一次。这一步不通过后面所有预测都是空中楼阁。2.2ProcessData.py与三份 CSV训练集、测试集、验证集怎么分ProcessData.py是整条流水线的清洗和切分环节。它把抓取到的原始数据整理成date_train.csv、date_test.csv、date_valid.csv三份文件。很多课程设计只分训练和测试这份资源多了一个验证集说明它在设计时考虑了模型调参时的过拟合问题。常见做法是训练集用于拟合模型验证集用于调整超参数测试集只在最后评估时用一次。如果你要改切分比例不要直接改 CSV 文件而是回到ProcessData.py里找切分逻辑通常是一个train_test_split或者按时间顺序切片的操作。# inspect_split.py import pandas as pd for name in [date_train.csv, date_test.csv, date_valid.csv]: df pd.read_csv(name) print(f{name}: {df.shape}, 日期范围: {df.iloc[0,0]} ~ {df.iloc[-1,0]})这段代码用来快速核对三份数据的规模和日期范围。参数说明df.shape返回行数和列数iloc[0,0]和iloc[-1,0]假设第一列是日期列。如果发现训练集和测试集日期重叠说明切分时没有按时间顺序做这在时间序列任务里是一个典型错误。天气数据是有时序性的随机切分会让模型“偷看”未来信息导致评估分数虚高。这一点在后面的避坑章节还会展开。2.3GetModel.py与Model.pkl模型训练和持久化GetModel.py负责训练模型并保存为Model.pkl。资源里已经附带了一个训练好的Model.pkl这意味着你可以先跳过训练直接用main.py加载模型做预测和可视化。但如果你要改特征、换算法就需要重新跑GetModel.py。常见做法是先用附带的Model.pkl跑通全流程确认环境和依赖没问题再动训练脚本。这样能把“环境问题”和“代码问题”分开排查省去很多来回折腾的时间。# load_model.py import joblib model joblib.load(Model.pkl) print(模型类型:, type(model)) # 如果模型有 feature_names_in_ 属性可以打印特征名 if hasattr(model, feature_names_in_): print(训练特征:, model.feature_names_in_)这段代码的作用是加载Model.pkl并查看模型类型和训练时使用的特征名。参数上joblib.load是 scikit-learn 生态里常用的模型加载方式比直接pickle.load更稳定。如果报错ModuleNotFoundError说明你当前环境缺少训练时用到的某个库需要根据报错信息补装。如果模型没有feature_names_in_属性说明训练时用的是 numpy 数组而不是 DataFrame这时候就要回到GetModel.py里确认特征构造方式。2.4main.py与可视化预测结果怎么变成图main.py是入口脚本通常负责串联加载数据、加载模型、生成预测、调用可视化。资源里的image目录和wps*.jpg截图大概率是运行结果的效果图。可视化部分一般会用 matplotlib 或 pyecharts把真实值和预测值画在同一张图上方便直观判断模型好坏。如果你运行后图片没有弹出先检查是不是在无图形界面的环境里跑或者plt.show()被注释掉了。常见做法是加一行plt.savefig(result.png)把图直接存到本地避免依赖窗口显示。3. 本地复现的完整步骤从环境到出图3.1 环境准备与依赖安装这份资源的核心依赖大概率包括 pandas、numpy、scikit-learn、matplotlib、requests、beautifulsoup4。不要一上来就pip install一堆包先看readme.md里有没有写明版本要求。如果没有我一般会按下面这个顺序装遇到报错再针对性补。# 建议先建虚拟环境避免污染全局 python -m venv weather_env # Windows 激活 weather_env\Scripts\activate # macOS / Linux 激活 source weather_env/bin/activate # 安装核心依赖 pip install pandas numpy scikit-learn matplotlib requests beautifulsoup4 joblib这段命令的逻辑是先隔离环境再装依赖。参数说明python -m venv weather_env创建一个名为weather_env的虚拟环境激活命令因操作系统而异。如果你用的是 Anaconda也可以用conda create -n weather_env python3.9。版本上Python 3.8 到 3.10 通常兼容性最好太新的版本有时会让某些老库编译失败。装完后用pip list核对一下确认没有漏装。3.2 按顺序运行四个脚本环境就绪后不要直接跑main.py。正确的顺序是先GetData.py抓数据再ProcessData.py生成训练测试集然后GetModel.py训练模型最后main.py做预测和可视化。如果你不想重新训练可以跳过GetModel.py直接用附带的Model.pkl。python GetData.py python ProcessData.py python GetModel.py python main.py每一步跑完都建议检查输出文件是否生成。GetData.py跑完看china_today.csv和天气网.htmlProcessData.py跑完看三份 CSV 是否更新GetModel.py跑完看Model.pkl的时间戳main.py跑完看是否弹出图片或生成结果文件。如果某一步报错先看报错最后一行通常是缺库、路径不对或字段名不匹配。路径问题最常见建议在脚本里用os.path.dirname(__file__)拼接绝对路径而不是写死相对路径。3.3 参数怎么改切分比例、模型选择和可视化字段这份资源的可玩性在于参数调整。切分比例在ProcessData.py里常见是 7:2:1 或 8:1:1模型选择在GetModel.py里可能是线性回归、随机森林或时间序列模型可视化字段在main.py里决定画温度、湿度还是天气状况。改参数时一次只改一个改完重新跑对应脚本观察结果变化。不要一次性改三四个地方否则出问题很难定位是哪个改动导致的。# 示例在 GetModel.py 中替换模型 from sklearn.ensemble import RandomForestRegressor # 原来的模型可能是 LinearRegression这里换成随机森林 model RandomForestRegressor(n_estimators100, random_state42)这段代码展示的是模型替换的常见写法。参数说明n_estimators100表示用 100 棵树树越多通常越稳但训练越慢random_state42固定随机种子保证结果可复现。换模型后记得重新跑GetModel.py生成新的Model.pkl否则main.py加载的还是旧模型。如果你不确定该换什么模型先用附带的模型跑通再逐步尝试。4. 避坑与排查这份源码最容易翻车的五个地方4.1 抓取脚本报错或抓到空数据现象运行GetData.py后china_today.csv为空或者直接抛异常。原因通常是目标网页结构变了或者请求被拒绝。解决先手动打开天气网.html看是否有内容如果没有检查GetData.py里的 URL 和请求头补上User-Agent如果页面结构变了需要更新解析规则。这类抓取脚本的寿命取决于目标站点跑不通时不要死磕可以先用附带的 CSV 数据继续后面的步骤。4.2 训练集和测试集日期重叠现象模型评估分数高得离谱但实际预测效果很差。原因切分时用了随机切分而不是按时间顺序切分导致模型“看到”了未来数据。解决回到ProcessData.py确认切分逻辑是按日期排序后切片而不是train_test_split(shuffleTrue)。时间序列任务里验证集和测试集必须晚于训练集这是铁律。4.3Model.pkl加载失败现象main.py报错ModuleNotFoundError或AttributeError。原因训练模型时的库版本和当前环境不一致或者模型文件损坏。解决先确认scikit-learn版本是否匹配必要时重装对应版本如果还是不行直接跑GetModel.py重新生成Model.pkl。不要试图用pickle强行加载不兼容的模型浪费时间。4.4 可视化中文显示为方框现象图表里的中文标题和标签变成方框。原因matplotlib 默认字体不支持中文。解决在main.py里加两行配置指定中文字体。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # Windows 常用 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题参数说明SimHei是 Windows 自带黑体macOS 可以换成Arial Unicode MS或PingFang SC。如果换了字体还是方框说明系统里没有该字体需要换一个已安装的。4.5 路径写死导致换目录就报错现象在源码目录里能跑换到别的目录就报FileNotFoundError。原因脚本里用了相对路径且假设当前工作目录就是源码目录。解决把路径改成基于脚本位置的绝对路径。import os BASE_DIR os.path.dirname(os.path.abspath(__file__)) data_path os.path.join(BASE_DIR, date_train.csv)这段代码的逻辑是__file__是当前脚本路径abspath转绝对路径dirname取所在目录再用join拼接文件名。这样无论从哪个目录运行脚本都能找到数据文件。5. 进阶玩法把这份作业改成能写进简历的项目5.1 用时间序列交叉验证替代单次切分附带的切分方式是单次训练/验证/测试适合交作业但如果你想在简历里写“做过天气预测”最好补一个时间序列交叉验证。常见做法是用TimeSeriesSplit把数据按时间顺序切成多折每折都做一次训练和评估最后看平均分数。这样得到的评估结果比单次切分更可信也能体现你对时序任务的理解。from sklearn.model_selection import TimeSeriesSplit from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error import pandas as pd df pd.read_csv(date_train.csv) # 假设最后一列是目标值前面是特征 X df.iloc[:, :-1].select_dtypes(include[number]) y df.iloc[:, -1] tscv TimeSeriesSplit(n_splits5) scores [] for train_idx, val_idx in tscv.split(X): model RandomForestRegressor(n_estimators100, random_state42) model.fit(X.iloc[train_idx], y.iloc[train_idx]) pred model.predict(X.iloc[val_idx]) scores.append(mean_absolute_error(y.iloc[val_idx], pred)) print(各折 MAE:, scores) print(平均 MAE:, sum(scores) / len(scores))这段代码的逻辑是TimeSeriesSplit(n_splits5)把数据切成 5 折每折的训练集都在验证集之前避免未来信息泄露。参数说明n_splits控制折数数据量少时用 3 到 5 折mean_absolute_error是回归任务常用指标数值越小越好。跑完后如果各折分数差异很大说明数据分布不稳定需要在特征工程上再下功夫。5.2 把可视化从静态图升级成可交互页面资源里的可视化大概率是 matplotlib 静态图。如果你想做出差异可以用 pyecharts 生成 HTML 交互图表鼠标悬停能看到具体数值放到作业答辩里很加分。常见做法是把预测结果和真实值整理成两个列表用Line组件画折线图再叠加Scatter显示异常点。from pyecharts.charts import Line from pyecharts import options as opts dates [2024-01-01, 2024-01-02, 2024-01-03] real [5, 7, 6] pred [5.2, 6.8, 6.1] line ( Line() .add_xaxis(dates) .add_yaxis(真实温度, real, is_smoothTrue) .add_yaxis(预测温度, pred, is_smoothTrue) .set_global_opts( title_optsopts.TitleOpts(title天气预测对比), xaxis_optsopts.AxisOpts(name日期), yaxis_optsopts.AxisOpts(name温度), ) ) line.render(weather_pred.html)这段代码生成一个 HTML 文件用浏览器打开就能看到交互折线图。参数说明is_smoothTrue让折线平滑适合展示趋势render输出文件名可以自定义。pyecharts 需要额外安装pip install pyecharts即可。如果你要展示多城市对比可以循环生成多个Line对象再用Grid组合。5.3 验证模型是否真的学到了东西交作业前我习惯做一次“基线对比”用一个极简模型比如直接拿前一天的温度作为预测值和你的模型比 MAE。如果你的模型还不如基线说明特征工程或模型选择有问题。这个习惯帮我避免过好几次“分数好看但没学到东西”的翻车。具体做法是在测试集上算一个persistence基线再算你的模型两个数放一起看。从那以后我每次做完预测项目都会强制走一遍基线对比确认模型不是靠运气。希望这份拆解能帮你把这份源码真正跑起来、改起来而不是只躺在硬盘里。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑