ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python天气预测与可视化完整源码:从数据清洗到ARIMA模型实战

Python天气预测与可视化完整源码:从数据清洗到ARIMA模型实战 简介这份资源是一套基于Python的天气预测与可视化完整项目源码面向具备一定Python基础、希望练习数据分析与机器学习实战的学习者可用于课程设计、毕业项目或自学练手。压缩包共27个文件、约2.86MB包含4个Python源码文件承载数据抓取、处理与建模预测逻辑4个CSV文件存放原始及清洗后的天气数据1个Pickle模型文件保存训练结果1个HTML文件用于前端展示另有12张jpg可视化结果图、3个pyc编译文件及说明文档结构完整、开箱即用。目前已有955人学习下载说明其参考价值得到一定认可。读者可借此理清从数据采集、特征处理到模型预测、图表呈现的完整链路对照源码理解各模块分工并直接复用其中的可视化图表与预测流程快速搭建自己的天气分析小项目。1. 从一份天气预测源码说起Python 到底能预测到什么程度很多人第一次搜「基于Python的天气预测与可视化完整源码」心里想的其实是能不能拿到一份代码跑起来就能告诉我明天要不要带伞。这个预期本身没错但需要先对齐一个边界——用 Python 做天气预测主流做法不是从零训练一个「气象大模型」而是围绕公开气象数据做两件事一是用时间序列模型或统计方法做短期趋势外推二是把历史与预测结果用可视化图表讲清楚。真正能落地的场景包括校园气象站数据分析、农业小气候趋势参考、物流路线温度预警、以及数据分析课程设计。适合的人群是已经会 Python 基础语法、想找一个完整项目把 pandas、matplotlib、scikit-learn 串起来的人。如果你还在查 python 安装教程建议先把环境跑通再回来否则后面每一步都会卡在依赖上。这一章先把「天气预测」这件事的技术边界讲清楚后面几章再动手复现。2. 天气预测源码的骨架数据从哪来、模型怎么选、图表怎么画2.1 先定数据源历史气象数据比实时接口更适合练手一份能复现的天气预测源码第一步不是写模型而是确定数据从哪来。常见做法有三类一是使用公开的历史气象数据集按城市和日期组织成 CSV二是调用公开气象 API 获取预报数据三是用本地气象站导出的观测记录。对「完整源码」这个目标来说我一般会优先选第一类因为历史数据可以离线反复跑不依赖网络和密钥调试成本最低。数据字段通常包括日期、最高温、最低温、天气现象、风力、湿度、气压。拿到数据后先做三件事检查缺失值、统一日期格式、把温度字段转成数值类型。下面这段代码是数据加载与清洗的最小示例import pandas as pd # 读取历史天气 CSV假设字段为 date, temp_max, temp_min, weather, humidity df pd.read_csv(weather_history.csv, encodingutf-8) # 日期列转标准格式无法解析的置为 NaT df[date] pd.to_datetime(df[date], errorscoerce) # 温度列强制转数值非数字变成 NaN for col in [temp_max, temp_min, humidity]: df[col] pd.to_numeric(df[col], errorscoerce) # 按日期排序并去掉日期缺失的行 df df.dropna(subset[date]).sort_values(date).reset_index(dropTrue) # 用前向填充补温度缺失湿度用均值补 df[temp_max] df[temp_max].fillna(methodffill) df[temp_min] df[temp_min].fillna(methodffill) df[humidity] df[humidity].fillna(df[humidity].mean()) print(df.head()) print(df.shape)逻辑说明errorscoerce是关键参数它把无法解析的值变成 NaN 而不是直接报错方便后续统一处理。ffill前向填充适合温度这种连续变化的字段湿度用均值填充只是兜底真实项目里最好按季节分组填充。参数方面encoding要根据 CSV 实际编码调整中文数据常见utf-8或gbk读出来乱码就换。2.2 模型选型短期温度预测用 ARIMA 还是 LSTM数据清洗完之后模型选型是第二个分叉点。标题里说的是「天气预测」没有限定模型所以这里按常见可靠方案来。短期单变量温度预测ARIMA 系列足够用训练快、可解释、对数据量要求低如果想同时用湿度、气压等多变量LSTM 或简单的线性回归也能跑。我的建议是先跑通 ARIMA再考虑加模型不要一上来就上深度学习。ARIMA 的三个参数是(p, d, q)p 是自回归项数d 是差分次数q 是移动平均项数。温度序列通常做一阶差分就平稳所以 d 一般取 1。p 和 q 可以用 ACF、PACF 图辅助判断也可以直接网格搜索。下面是最小可跑示例import pandas as pd from statsmodels.tsa.arima.model import ARIMA # 假设 df 已经清洗好取最高温作为预测目标 series df.set_index(date)[temp_max].asfreq(D) # 按 8:2 划分训练集和测试集 split int(len(series) * 0.8) train, test series[:split], series[split:] # 拟合 ARIMA(2,1,2)参数可后续调优 model ARIMA(train, order(2, 1, 2)) result model.fit() # 预测测试集长度 forecast result.forecast(stepslen(test)) print(forecast.head())逻辑说明asfreq(D)把时间索引统一成日频避免缺失日期导致模型报错。order(2,1,2)是经验起点不是最优值。如果预测曲线明显滞后优先调大 p如果残差波动大调 q。参数说明steps必须等于测试集长度否则无法对齐评估。评估指标用 MAE 和 RMSEMAE 看平均误差RMSE 对大误差更敏感。2.3 可视化把预测结果画成能看懂的图可视化是这份源码里最容易被低估的部分。很多人模型跑完只打印一个数字但「可视化」才是让结果有说服力的环节。常见图表有三类历史温度折线图、预测对比图、月度温度分布箱线图。用 matplotlib 就能完成不需要额外前端框架。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 中文显示 plt.rcParams[axes.unicode_minus] False plt.figure(figsize(12, 5)) plt.plot(train.index, train.values, label训练集) plt.plot(test.index, test.values, label真实值) plt.plot(test.index, forecast.values, label预测值, linestyle--) plt.title(最高温预测对比) plt.xlabel(日期) plt.ylabel(温度) plt.legend() plt.tight_layout() plt.savefig(forecast_compare.png, dpi150) plt.show()逻辑说明SimHei是 Windows 常见中文字体Linux 或 macOS 需要换成系统已有字体否则中文会显示成方块。linestyle--让预测线区别于真实线这是对比图的基本规范。dpi150保证保存图片清晰度用于报告或大屏时建议 200 以上。如果要做省份温度可视化或可视化大屏可以把多城市结果汇总成热力图但那是另一个层级的工程先把单城市跑通。3. 把源码跑起来环境配置、目录结构与执行顺序3.1 环境配置python 安装之后还要装什么很多人卡在第一步不是代码问题而是环境问题。假设你已经完成 python 安装接下来需要确认版本和包管理工具。建议 Python 3.9 以上pip 能正常使用。核心依赖只有四个pandas、numpy、statsmodels、matplotlib。如果要用 LSTM再加 scikit-learn 和 tensorflow 或 pytorch。# 创建虚拟环境避免污染全局 python -m venv weather_env # 激活环境Windows weather_env\Scripts\activate # 激活环境macOS / Linux source weather_env/bin/activate # 安装核心依赖 pip install pandas numpy statsmodels matplotlib逻辑说明虚拟环境是后悔药项目跑崩了直接删掉重建不影响其他项目。statsmodels提供 ARIMAmatplotlib负责绘图。如果 pip 安装慢可以换国内镜像源这是常见做法。参数方面没有需要特别调的版本冲突时优先保证 pandas 和 numpy 兼容。3.2 目录结构一份能维护的源码该怎么放「完整源码」不等于所有代码堆在一个文件里。我一般会按职责拆成四个部分数据、模型、可视化、入口。这样别人拿到之后知道从哪看起自己改的时候也不容易乱。目录/文件作用说明data/weather_history.csv原始历史数据编码统一 utf-8src/load_data.py数据加载与清洗输出干净 DataFramesrc/train_model.pyARIMA 训练与预测返回预测序列src/plot_result.py可视化绘图保存图片main.py串联执行入口按顺序调用这种结构的好处是每一步可以单独测试。比如数据清洗有问题只跑load_data.py就能定位不用每次都走完整流程。如果标题指向的是课程设计案例源码这种分层也更容易写进报告。3.3 执行顺序与最小验证把代码拆好之后执行顺序是先跑数据加载确认 DataFrame 形状和字段再跑模型训练确认没有报错且预测长度正确最后跑可视化确认图片生成。下面是一个入口示例from src.load_data import load_weather_data from src.train_model import train_and_forecast from src.plot_result import plot_forecast df load_weather_data(data/weather_history.csv) train, test, forecast train_and_forecast(df, order(2, 1, 2)) plot_forecast(train, test, forecast, save_pathoutput/forecast.png) print(流程执行完成)逻辑说明入口文件只做串联不写具体逻辑这样每个模块可以独立替换。参数order从入口传入方便调参时不用改模型文件。save_path指定输出目录跑之前要确保目录存在否则 matplotlib 保存会报错。最小验证标准是控制台打印「流程执行完成」且 output 目录下有图片文件。4. 避坑与排查天气预测源码最容易翻车的 5 个地方4.1 日期解析失败导致模型直接报错现象运行 ARIMA 时提示索引不是时间类型或者asfreq报错。原因CSV 里日期格式不统一比如有的写2023/1/1有的写2023-01-01pd.to_datetime解析后部分变成 NaT排序后索引断裂。解决先用errorscoerce统一转换再dropna去掉无效日期最后用asfreq(D)补齐日频。如果数据本身不是逐日记录不要强行日频改成周频或月频。4.2 中文显示成方块现象图表标题和坐标轴中文全部变成方框。原因matplotlib 默认字体不含中文。解决设置plt.rcParams[font.sans-serif]为系统已有中文字体Windows 用SimHeimacOS 用Arial Unicode MSLinux 用WenQuanYi Micro Hei。设置完还要加axes.unicode_minus False否则负号也会异常。4.3 预测结果明显滞后于真实值现象预测曲线形状和真实曲线相似但整体向右偏移。原因ARIMA 对非平稳序列处理不足或者 p 值太小模型主要依赖上一时刻值。解决先做差分确认平稳性再适当增大 p 和 q或者改用 SARIMA 加入季节项。如果数据有明显周周期季节项参数要设成 7。4.4 缺失值填充方式选错导致预测失真现象模型评估指标看起来还行但预测值明显偏离常识比如夏天预测出个位数温度。原因缺失值用全局均值填充把季节特征抹平了。解决温度类字段用前向填充或按月份分组均值填充不要用全局均值。湿度可以用滑动窗口均值。填充后画一张填充前后对比图肉眼确认没有异常跳变。4.5 依赖版本冲突导致 statsmodels 导入失败现象import statsmodels报错提示 numpy 版本不兼容。原因pip 自动安装了最新版 numpy和 statsmodels 要求的版本范围冲突。解决先看报错信息里提示的版本要求然后固定安装兼容版本比如pip install numpy1.24.3。更稳妥的做法是在虚拟环境里先装 statsmodels让它自动拉取兼容的 numpy再装其他包。5. 进阶技巧把单城市预测扩展成多城市对比与自动化验证单城市跑通之后下一步通常是扩展成多城市对比或者加入自动化验证。这里给一个具体技巧用循环批量跑多个城市把结果汇总成一张对比表再用热力图展示。这样既保留了源码的可复现性又能直接用于省份温度可视化这类场景。import pandas as pd import matplotlib.pyplot as plt import seaborn as sns cities [beijing, shanghai, guangzhou] results {} for city in cities: df load_weather_data(fdata/{city}_history.csv) train, test, forecast train_and_forecast(df, order(2, 1, 2)) mae (test.values - forecast.values).__abs__().mean() results[city] {mae: round(mae, 2), forecast_mean: round(forecast.mean(), 2)} summary pd.DataFrame(results).T print(summary) # 热力图展示各城市预测均值 plt.figure(figsize(8, 4)) sns.heatmap(summary[[forecast_mean]].astype(float), annotTrue, cmapcoolwarm) plt.title(多城市预测均值对比) plt.tight_layout() plt.savefig(output/city_compare.png, dpi150)逻辑说明循环里每个城市独立加载、独立训练避免数据串扰。mae用来横向比较模型在不同城市的表现如果某个城市 MAE 明显偏高优先检查该城市数据质量。seaborn的heatmap适合展示二维对比annotTrue把数值标在格子里。参数方面cmap选coolwarm是因为温度有冷暖语义比默认配色更直观。自动化验证可以再加一步把每次运行的 MAE 和参数写入 CSV 日志跑多次之后看哪组参数最稳。这个习惯来自我自己的血泪经验——手动调参很容易忘记上次改了什么有了日志才能回溯。验证方法上除了 MAE还可以看预测值和真实值的相关系数相关系数低于 0.6 就说明模型基本没学到趋势需要回头检查数据或换模型。最后一个具体技巧如果要做可视化大屏不要把 matplotlib 图片直接嵌进去而是把预测结果导出成 JSON交给前端图表库渲染。这样交互性更好也方便实时刷新。导出时保留日期、真实值、预测值三个字段即可结构越简单越不容易出错。我自己的习惯是每跑完一个城市就把中间结果存一份 parquet下次调参直接从 parquet 读比重新清洗 CSV 快很多。这个习惯帮我省过不少时间也希望帮到你。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进