尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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 天数据做一次滚动预测看误差是否稳定。这三步走完心里才有底。从那以后我每次拿到这种时序预测源码包都先跑一遍测试集叠图再决定要不要调参。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

Ubuntu 22.04 运行 CC-Switch AppImage 中文乱码:把 locale 与字体配置改到 TaoToken 的排查清单

Ubuntu 22.04 运行 CC-Switch AppImage 中文乱码:把 locale 与字体配置改到 TaoToken 的排查清单

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

📅 2026/10/13 0:16:36
需求分析考试归类复习:数据流图、数据字典与软件过程考点精讲

需求分析考试归类复习:数据流图、数据字典与软件过程考点精讲

简介:一份面向软件工程课程《需求分析》的知识点归类PDF,适合正在复习需求工程、软件过程或准备期末考试的学生使用。内容以问答形式梳理了业务需求、用户需求、系统需求的关系,软件过程基本过程,需求工程六个阶段,B/S…

📅 2026/10/13 0:11:36
0-1 BFS 求解网格最短路径:最小修改次数问题详解

0-1 BFS 求解网格最短路径:最小修改次数问题详解

第178场周赛这道题,我当时标了“未完成”,赛后复盘才发现它其实是一道非常标准的 0-1 BFS 最短路问题。题面给你的是一张 m x n 网格图,每个格子标着 1、2、3、4 四个方向,你要从左上角走到右下角。如果格子上的方向和你实际要走的…

📅 2026/10/13 0:11:36
MORE NEWS

更多资讯

📰

Function Call、Agent、MCP、RAG 四件套:把 endpoint 改到 TaoToken 的联调清单

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

📰

Java面试进阶:从基础到微服务的三轮问答实战解析

先说点实在的。Java面试这几年卷得厉害,原因很简单:Java这个生态太庞大了,从JVM底层到Spring全家桶,再到微服务那一整套分布式组件,一个候选人要掌握的东西横跨了好几个“时代”。我做过面试官,也辅导过不少…

📰

AnyPS5游戏串流实战:低延迟局域网音视频传输架构与调优指南

1. 从"AnyPS5"这个名字说起:一个跨平台游戏串流工具的设计初衷第一次看到"AnyPS5"这个项目名,很多人会以为这是某个破解工具或者模拟器。实际上,它解决的是一个非常具体的痛点:如何让家里的主力游戏主机画面&…

📰

MyDAC v5.10 源码级MySQL数据访问组件深度解析与定制指南

简介:本资源是Delphi与CBuilder开发者专用的MySQL数据库直连组件MyDAC v5.10源码包,面向使用Delphi 7–2007及CBuilder开发MySQL应用的中高级开发者,解决原生数据库连接性能低、依赖中间件、缺乏事务与存储过程深度支持等痛点。压缩包共1403个…

📰

GORM 实战避坑指南:从 ORM 原理到 CRUD、事务与缓存

在 Go 后端项目里摸爬滚打这几年,我敢说GORM是我用得最久、也最“又爱又恨”的一个 ORM 框架。要说清楚它到底解决了什么问题,最直接的一句话是:它让你在 Go 里操作数据库,从“手写一堆重复的 SQL 和结构体赋值”变成“直接把数据…

📰

哈工大CSAPP期末题:系统级工程能力压力测试

简介:本资源为哈尔滨工业大学《计算机系统》(CSAPP)课程期末考试真题试卷,面向计算机专业本科生、考研备考学生及系统级编程学习者,聚焦计算机体系结构、汇编与C语言协同、操作系统安全机制等核心能力训练。文件为单个…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬