Python天气预测项目实战:从数据抓取到模型部署全流程解析
简介这是一套面向Python初学者与数据分析爱好者的天气预测与可视化完整项目源码适合用作课程设计、毕业设计或数据挖掘练手案例。项目以Python为核心串联数据采集、清洗、建模预测到前端展示的完整链路帮助读者理解天气数据从原始CSV到预测结果的全流程处理思路。压缩包共27个文件约2.86MB包含4个Python源码文件承载数据分析与预测逻辑4个CSV文件存储原始及处理后天气数据1个Pickle模型文件保存训练结果1个HTML文件用于前端可视化展示另有12张jpg图像呈现可视化效果以及若干Markdown说明与编译缓存文件。目前已有955人学习下载具备一定参考热度。读者可从中获取可运行的预测脚本、模型持久化方案、数据预处理范例与可视化图表参考并借助目录结构快速定位数据、代码与展示模块适合对照复现与二次开发。1. 从一份 29 文件的天气预测源码包说起它到底能跑出什么如果你手头正好有一份upload.zip解压后看到main.py、GetData.py、ProcessData.py、GetModel.py四个源码文件外加date_train.csv、date_test.csv、date_valid.csv三份数据和一个Model.pkl那你拿到的不是玩具 demo而是一条从抓数、清洗、建模到出图的完整链路。它解决的核心问题是把天气网站上的原始观测数据抓下来整理成可训练的时序样本训练一个预测模型再把预测结果和真实曲线画在一起最后用天气网.html做前端展示。适合谁适合刚学完 Python 基础、想找一个能跑通「数据采集 预测 可视化」全流程的练手项目的人也适合需要快速搭一个天气预测原型的从业者。12 张 jpg 图不是装饰它们是可视化结果的实物证据说明这条链路真的出过图。2. 拆开源码包四个 .py 文件的分工与数据流2.1 GetData.py 负责抓数天气网.html 是它的产物GetData.py是整个链路的入口。它的职责很明确从天气网站拉取数据落成 CSV。项目里出现的天气网.html和china_today.csv就是这一步的产物——前者是抓下来的页面快照后者是解析后的当日数据。常见做法是用requests拿页面再用BeautifulSoup或lxml解析表格。这里要注意天气网站的结构会变所以抓取逻辑不能写死某一个 class 名最好把选择器抽成变量。# GetData.py 抓取逻辑示意 import requests from bs4 import BeautifulSoup import pandas as pd URL http://www.weather.com.cn/... # 实际地址以源码为准 HEADERS {User-Agent: Mozilla/5.0} # 不加 UA 容易被拒 def fetch_page(url): resp requests.get(url, headersHEADERS, timeout10) resp.encoding utf-8 # 天气网常见编码写错会乱码 return resp.text def parse_table(html): soup BeautifulSoup(html, lxml) rows soup.select(table tr) # 选择器按实际页面调整 data [] for tr in rows: tds [td.get_text(stripTrue) for td in tr.find_all(td)] if tds: data.append(tds) return pd.DataFrame(data) if __name__ __main__: html fetch_page(URL) df parse_table(html) df.to_csv(china_today.csv, indexFalse, encodingutf-8-sig)逻辑说明fetch_page负责网络请求timeout10是防止卡死resp.encoding必须显式设置否则中文会变乱码。parse_table把表格行转成 DataFrameutf-8-sig是为了 Excel 打开不乱码。参数上HEADERS里的 UA 不能省很多站点会直接拒绝空 UA 的请求。如果你跑GetData.py报ConnectionError先检查 URL 是否还有效再看是否需要加Referer。2.2 ProcessData.py 做清洗与特征date_train/test/valid 三份 CSV 从这里来ProcessData.py是承上启下的模块。它读入原始 CSV处理缺失值、统一时间格式、构造时序特征然后按时间顺序切分成date_train.csv、date_test.csv、date_valid.csv。这里的关键是切分不能随机打乱时序数据一旦 shuffle验证集就会「偷看」未来指标虚高。常见做法是按时间点切前 70% 训练中间 15% 验证最后 15% 测试。# ProcessData.py 清洗与切分示意 import pandas as pd import numpy as np def clean(df): df df.dropna(subset[temperature, humidity]) # 关键列缺失直接丢 df[date] pd.to_datetime(df[date], errorscoerce) df df.dropna(subset[date]).sort_values(date) # 必须按时间排序 return df def split_by_time(df, train0.7, valid0.15): n len(df) i, j int(n * train), int(n * (train valid)) return df.iloc[:i], df.iloc[i:j], df.iloc[j:] if __name__ __main__: raw pd.read_csv(china_today.csv) df clean(raw) tr, va, te split_by_time(df) tr.to_csv(date_train.csv, indexFalse) va.to_csv(date_valid.csv, indexFalse) te.to_csv(date_test.csv, indexFalse)逻辑说明dropna只针对关键列避免把整行都删掉pd.to_datetime加errorscoerce是为了把非法日期转成 NaT 再统一丢弃。split_by_time用位置索引切分保证时间顺序。参数上train0.7是经验值数据量小可以调到 0.8。如果你发现date_train.csv里日期不连续检查原始数据是否有重复行没去重。2.3 GetModel.py 训练并落盘 Model.pklmain.py 串起全流程GetModel.py负责建模。项目里已经有Model.pkl说明训练过一次并序列化了。常见做法是用scikit-learn的回归模型或statsmodels的时序模型训练完用pickle或joblib存下来。main.py则是总调度调GetData抓数、调ProcessData清洗、调GetModel训练或加载模型、最后出图。# GetModel.py 训练与保存示意 import pandas as pd, pickle from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error def train(train_csv, valid_csv): tr pd.read_csv(train_csv) va pd.read_csv(valid_csv) feats [humidity, pressure, wind] # 特征列按实际数据调整 X_tr, y_tr tr[feats], tr[temperature] X_va, y_va va[feats], va[temperature] model RandomForestRegressor(n_estimators200, random_state42) model.fit(X_tr, y_tr) pred model.predict(X_va) print(MAE:, mean_absolute_error(y_va, pred)) with open(Model.pkl, wb) as f: pickle.dump(model, f) return model if __name__ __main__: train(date_train.csv, date_valid.csv)逻辑说明RandomForestRegressor对特征缩放不敏感适合这种小规模表格数据n_estimators200是精度和速度的折中数据量小可以降到 100。random_state42保证可复现。MAE是回归任务最直观的指标先看它是否合理再谈调参。pickle.dump存模型时注意 Python 版本要一致__pycache__里的.pyc是 3.11 编译的换版本可能加载失败。3. 把项目跑起来环境、依赖与执行顺序3.1 依赖清单与安装命令这个项目依赖不多核心是pandas、numpy、scikit-learn、requests、beautifulsoup4、lxml、matplotlib。readme.txt里通常有说明但如果没有按下面这份装基本不会缺。# 建议在虚拟环境里装避免污染全局 python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install pandas numpy scikit-learn requests beautifulsoup4 lxml matplotlib逻辑说明虚拟环境是后悔药装崩了直接删目录重来。lxml是BeautifulSoup的解析器不装会退化成内置解析器速度慢且容错差。如果你用的是 Python 3.11.pyc文件能直接复用换 3.12 可能触发重新编译一般不影响运行。3.2 执行顺序先抓数再清洗再训练最后出图顺序不能乱。main.py通常已经串好但如果你想分步调试按GetData.py→ProcessData.py→GetModel.py→main.py走。每步产出的文件就是下一步的输入缺一环就断链。步骤执行文件输入输出1GetData.py天气网站china_today.csv、天气网.html2ProcessData.pychina_today.csvdate_train/test/valid.csv3GetModel.pydate_train.csv、date_valid.csvModel.pkl4main.pyModel.pkl、date_test.csv12 张 jpg 可视化图逻辑说明这张表就是数据流的实物映射。如果你只想要预测结果不想重新抓数可以跳过第 1 步直接用现成的 CSV。但要注意china_today.csv是「当日」数据放久了就过期预测意义会打折。3.3 可视化出图12 张 jpg 是怎么生成的main.py里通常用matplotlib画图把预测曲线和真实曲线叠在一起再存成 jpg。项目里 12 张图对应不同维度或不同时间段。常见坑是中文显示成方块需要设置字体。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 中文显示Windows 常用 plt.rcParams[axes.unicode_minus] False # 负号正常显示 def plot(y_true, y_pred, path): plt.figure(figsize(10, 4)) plt.plot(y_true, label真实值) plt.plot(y_pred, label预测值) plt.legend() plt.title(天气预测对比) plt.savefig(path, dpi150, bbox_inchestight) plt.close() plot([1,2,3], [1.1,1.9,3.2], wps17.jpg)逻辑说明font.sans-serif设成SimHei是 Windows 下的常规做法Linux 上要换成系统里有的中文字体否则中文全是方框。axes.unicode_minusFalse解决负号显示异常。dpi150保证图片清晰度bbox_inchestight去掉多余白边。plt.close()必须加否则循环画 12 张图会内存暴涨。4. 避坑与排查这份源码最容易翻车的五个地方4.1 抓数返回空或乱码现象china_today.csv只有表头没有数据或者中文全是乱码。原因天气网站改版导致选择器失效或者编码没设对。解决先用浏览器打开天气网.html看结构把parse_table里的选择器改成实际标签编码统一用resp.encoding resp.apparent_encoding让 requests 自己猜。4.2 时序切分用了随机 shuffle现象验证集 MAE 低得离谱但测试集一跑就崩。原因train_test_split默认 shuffle时序数据被打乱后模型「看到」了未来。解决改用按时间位置切分参考 2.2 里的split_by_time绝不加shuffleTrue。4.3 Model.pkl 加载报版本不兼容现象pickle.load抛UnpicklingError或AttributeError。原因.pkl是用 Python 3.11 存的你换了 3.12 或换了 scikit-learn 版本。解决要么切回 3.11 环境要么删掉Model.pkl重新跑GetModel.py生成一份。.pyc文件同理版本不对就删掉让 Python 重新编译。4.4 中文图表显示成方块现象12 张 jpg 里标题和标签全是方框。原因matplotlib默认字体不含中文。解决按 3.3 设置font.sans-serifLinux 上先fc-list :langzh查可用中文字体再填进去。如果还不行检查字体文件是否真的存在。4.5 路径写死导致换目录就报错现象在项目根目录能跑换个目录就FileNotFoundError。原因源码里用了相对路径如date_train.csv依赖当前工作目录。解决用os.path.dirname(__file__)拼绝对路径或者统一在项目根目录执行。常见做法是加一个BASE_DIR变量所有路径基于它拼。import os BASE_DIR os.path.dirname(os.path.abspath(__file__)) train_path os.path.join(BASE_DIR, date_train.csv)逻辑说明__file__是当前脚本路径abspath转绝对dirname取目录。这样无论从哪执行路径都对。这是血泪经验路径问题排查起来最费时间。5. 进阶用法把预测结果接到 HTML 和可视化大屏5.1 用天气网.html 做静态展示的改造思路项目里的天气网.html目前只是抓取快照但你可以把它改造成结果展示页。思路是main.py出图后把图片路径和预测数值写进一个 JSONHTML 用fetch读 JSON 再渲染。这样每次跑完模型刷新页面就能看到最新结果不用手动换图。// 在天气网.html 里加一段渲染逻辑 fetch(result.json) .then(res res.json()) .then(data { document.getElementById(temp).innerText data.pred_temp ℃; document.getElementById(chart).src data.chart_path; });逻辑说明fetch读同目录下的result.json把预测温度和图表路径填进页面。result.json由main.py用json.dump生成。这样 HTML 就从静态快照变成了动态展示页。注意浏览器直接打开本地 HTML 时fetch可能被跨域策略拦起一个python -m http.server就能解决。5.2 接 ECharts 做可视化大屏的可行路径如果你想把 12 张静态 jpg 升级成可交互的图表ECharts 是最省事的选择。做法是main.py除了存 jpg再把预测序列导出成 JSON 数组HTML 里用 ECharts 的line组件渲染。这样鼠标悬停能看具体数值比 jpg 直观得多。常见做法是把date_test.csv和预测结果合并成一个{date: [], true: [], pred: []}的结构前端直接消费。方案优点代价静态 jpg零依赖跑完就有不可交互改图要重跑HTML JSON轻量刷新即更新需要起本地服务ECharts 大屏可交互适合演示前端工作量增加逻辑说明这张表帮你按场景选。自己看结果jpg 够了要给同事演示HTML JSON 最快要做成可视化大屏再上 ECharts。别一上来就追求大屏先把预测跑准。5.3 验证模型是否真的可用三个必看指标跑通不等于可用。我一般会强制走一遍这三个检查第一看date_test.csv上的 MAE 是否和验证集接近差距大说明过拟合第二把预测曲线和真实曲线叠图看趋势是否跟得上滞后太多说明特征不够第三拿最近 7 天数据做一次滚动预测看误差是否稳定。这三步走完心里才有底。从那以后我每次拿到这种时序预测源码包都先跑一遍测试集叠图再决定要不要调参。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Spring Boot 4.0升级实战:Java 17+Jakarta EE迁移与自动配置避坑指南

Spring Boot 4.0升级实战:Java 17+Jakarta EE迁移与自动配置避坑指南

Spring Boot 4.0 正式发布的消息刚出来的时候,我朋友圈一片哀嚎。倒不是大家不期待新版本,而是这个版本的“硬”变化实在太多:基线直接压在 Java 17 上,整个 Jakarta EE 命名空间换血,自动配置机制也做了大范围调整。对…

2026/10/13 0:14:44 阅读更多 →
Python深度强化学习云工作流调度:从MDP建模到PPO训练实战

Python深度强化学习云工作流调度:从MDP建模到PPO训练实战

简介:本资源为基于Python深度强化学习的云工作流调度系统毕业设计项目,面向计算机、人工智能、软件工程等专业的在校学生与教师,可用于毕业设计、课程设计或项目立项演示。项目以有向无环图工作流为对象,采用马尔可夫决策过程建模…

2026/10/13 0:14:44 阅读更多 →
RHEL 9.X离线安装包缓存与本地仓库搭建实战指南

RHEL 9.X离线安装包缓存与本地仓库搭建实战指南

刚把一个 RHEL 9.4 的离线机房环境从零配到能批量装 Oracle 19c,期间最让我头疼的就是“安装包怎么缓存下来”这件事。网上搜“RHEL 9.X缓存安装包”的人,多半是遇到了同样的场景:生产网段隔离、内网环境不允许随便连外网源、要批量初始化几十…

2026/10/13 0:13:44 阅读更多 →

最新新闻

Qt连接MySQL报错驱动未加载?一文讲透QMYSQL驱动编译部署

Qt连接MySQL报错驱动未加载?一文讲透QMYSQL驱动编译部署

很多人第一次遇到 Qt 连接 MySQL 的“驱动未加载”报错时,第一反应都是去翻代码:是不是连接参数写错了?是不是主机名不对?等到把QSqlDatabase相关的代码检查了三遍,才慢慢意识到问题可能根本不在业务代码里&#xff0c…

2026/10/13 7:53:16 阅读更多 →
AI证件照制作API对接实战:从选型到合规校验的完整指南

AI证件照制作API对接实战:从选型到合规校验的完整指南

1. 为什么我会盯上"证件照API生成"这条路 先交代一下背景。前阵子家里人急着办证件,需要一张白底小二寸照片,跑照相馆来回折腾不说,拍出来效果还不太满意。我那时候正好在做一个需要用户上传头像、自动生成合规证件照的小工具&…

2026/10/13 7:53:16 阅读更多 →
Karma渲染器Exit Code 139崩溃排查:从SIGSEGV到云渲染

Karma渲染器Exit Code 139崩溃排查:从SIGSEGV到云渲染

Houdini 的 Karma 渲染器一旦出现 Exit Code 139,做 CG 的人都懂那种头皮发麻的感觉。它不是那种会弹窗给你提示的渲染失败,而是场景加载完毕、Bucket 刚开始走动,或者渲染到第 3 帧,整个进程一声不吭就没了;Linux 终端…

2026/10/13 7:53:16 阅读更多 →
酒店推荐系统毕设全解析:Hadoop离线链路与协同过滤工程落地

酒店推荐系统毕设全解析:Hadoop离线链路与协同过滤工程落地

每年毕业季,“大数据 推荐系统 可视化”这套组合拳都是计算机毕设里的顶流选题。特别是挂着酒店、民宿这类具体业务场景的题目,看起来既有数据量又有业务逻辑,还顺便把爬虫、前端、算法、大数据框架全串起来了。但说句实在话,我…

2026/10/13 7:53:16 阅读更多 →
从订单改造到event Action<string>:C#委托与事件实战指南

从订单改造到event Action<string>:C#委托与事件实战指南

从一次改造说起:为什么回调会要了老命很多人在初学C#时,对委托、event、Action这几个概念总是处于“看着认识,一用就混”的状态。我最早也是。当时团队里有一个老项目,订单状态一旦变化,需要同时通知短信服务、操作日志…

2026/10/13 7:53:16 阅读更多 →
UUID版本选择指南:从v4随机到v7有序,数据库主键性能与选型深度解析

UUID版本选择指南:从v4随机到v7有序,数据库主键性能与选型深度解析

UUID 这个词很多人天天用,但真正理解它背后设计逻辑的开发者并不多。早几年我参与过一个模拟项目,主键图省事全部采用 UUID,上线三个月后数据库 INSERT 开始出现大量慢查询,DBA 排查后丢过来一句话:“你是 v4 吧&#…

2026/10/13 7:52:16 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →