新疆1980-2018降水数据可视化与ARIMA预测实战
简介这份资源面向高校计算机、数据科学相关专业的毕业设计与课程设计场景围绕新疆1980至2018年历史降水量数据提供一套完整的大数据可视化分析与机器学习预测方案适合具备Python基础、希望快速完成数据分析类课题的学生参考。压缩包共4个文件约5.16MB包含xlsx原始数据集、ipynb分析源码、html结果导出页面以及txt依赖说明覆盖从数据读取到建模预测的全流程。已有150人学习下载。内容涵盖数据预处理、折线图与条形图等探索式可视化、雨季旱季对比、监测站差异分析并基于ARIMA模型完成月度降水量预测与效果验证读者可据此掌握Pandas、Matplotlib、Seaborn的实际用法理解时间序列建模思路并直接复用代码与数据集完成自己的分析报告。1. 新疆 1980-2018 降水数据可视化一份能跑通的毕业设计资源新疆的降水数据有个特点地域跨度大、站点稀疏、年际波动明显拿它做分析很容易在数据清洗阶段就卡住。这份资源给的是一个完整闭环xj80-20.xlsx原始数据、基于大数据的新疆历史降水量数据可视化分析.ipynb主分析脚本、导出的 HTML 结果页、requirements.txt依赖清单外加一份演示视频。核心链路是 Pandas 做读取与预处理Matplotlib 和 Seaborn 出图最后用 ARIMA 做月度降水量预测。适合正在做数据分析、数据挖掘方向毕业设计或课程设计的同学也适合想拿一份真实气象数据练手的人。它解决的不是从零搭环境的问题而是拿到一份能直接复现、每个环节都有对应代码的完整案例。2. 数据读取与预处理从 Excel 到可分析的时间序列2.1 先看清 xj80-20.xlsx 的结构再动手拿到 Excel 文件别急着read_excel先确认三件事列名是什么、时间字段是哪种格式、有没有缺失值。新疆降水数据常见的坑是年份和月份分开存或者用198001这种字符串表示年月。这份资源里的数据是 1980 到 2018 年的记录预处理阶段要做的就是重命名列、拆出年份和月份、把时间字段转成 datetime 类型。import pandas as pd import numpy as np # 读取原始数据注意 sheet_name 按实际文件调整 df pd.read_excel(xj80-20.xlsx, sheet_name0) # 查看前几行和列名确认结构 print(df.head()) print(df.columns.tolist()) print(df.dtypes) # 重命名列统一成英文方便后续处理 df df.rename(columns{ 年份: year, 月份: month, 降水量: precipitation, 站点: station }) # 如果年份和月份是分开的直接组合成日期 df[date] pd.to_datetime(df[[year, month]].assign(day1)) # 检查缺失值 print(df.isnull().sum()) # 对降水量做数值转换处理可能的异常字符 df[precipitation] pd.to_numeric(df[precipitation], errorscoerce) df df.dropna(subset[precipitation])这段代码的逻辑是先探明结构再统一列名然后构造 datetime 索引最后处理缺失和类型问题。参数上要注意errorscoerce会把无法转换的值变成 NaN配合dropna直接剔除避免后续绘图报错。如果数据里站点是中文名建议保留原始列另存一份映射表后面按站点聚合时用得上。2.2 时间序列索引与重采样准备预处理完还要做一步把 date 设为索引并排序。ARIMA 对时间顺序敏感乱序数据会让模型结果完全失真。# 设置时间索引并排序 df df.sort_values(date).set_index(date) # 按月重采样确保每个月都有记录 monthly df[precipitation].resample(M).mean() # 查看时间范围 print(monthly.index.min(), monthly.index.max()) print(monthly.head(12))resample(M)表示按月聚合.mean()是取该月所有站点的平均值。如果你的分析目标是单站点就先按站点筛选再重采样。这一步做完数据才真正具备做趋势分析和 ARIMA 建模的基础。常见错误是跳过排序直接建模结果预测曲线和历史完全对不上排查半天才发现是索引乱序。3. 探索式可视化折线图、条形图与饼图怎么选3.1 历史趋势与异常年份识别折线图是看长期趋势最直接的方式。1980 到 2018 年新疆降水量的整体走势用一张折线图就能看出下降倾向同时能标出异常年份。import matplotlib.pyplot as plt import seaborn as sns # 设置中文字体避免乱码 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 年度总降水量 yearly df[precipitation].resample(Y).sum() plt.figure(figsize(14, 5)) plt.plot(yearly.index.year, yearly.values, markero, linewidth1.5) plt.title(1980-2018 新疆年度降水量变化) plt.xlabel(年份) plt.ylabel(降水量) plt.grid(alpha0.3) plt.tight_layout() plt.savefig(yearly_trend.png, dpi150) plt.show()逻辑说明resample(Y).sum()把月度数据聚合成年度总量markero让每个年份的数据点可见方便定位异常值。参数上dpi150保证导出图片清晰度tight_layout()防止标签被裁切。如果折线图上看不出明显异常可以再加一条移动平均线辅助判断。3.2 月份分布与雨季旱季划分月份分布用条形图看均值用饼图看占比。6 到 8 月是雨季10 到 11 月是旱季这个结论用图能直观呈现。# 各月平均降水量 monthly_avg df.groupby(month)[precipitation].mean() fig, axes plt.subplots(1, 2, figsize(14, 5)) # 条形图 axes[0].bar(monthly_avg.index, monthly_avg.values, colorsteelblue) axes[0].set_title(各月平均降水量) axes[0].set_xlabel(月份) axes[0].set_ylabel(降水量) # 饼图 axes[1].pie(monthly_avg.values, labelsmonthly_avg.index, autopct%1.1f%%) axes[1].set_title(各月降水量占比) plt.tight_layout() plt.savefig(monthly_dist.png, dpi150) plt.show()groupby(month)按月份聚合mean()取均值。饼图的autopct显示百分比但月份多的时候饼图会显得拥挤这时候用条形图更清晰。实际做毕业设计时建议两张图都保留答辩时一张讲趋势一张讲占比逻辑更完整。3.3 站点对比与季节性变化不同监测站的降水量差异用横向条形图展示最合适雨季和旱季的对比则适合用分组条形图。# 各站点平均降水量 station_avg df.groupby(station)[precipitation].mean().sort_values(ascendingFalse) plt.figure(figsize(12, 6)) plt.barh(station_avg.index, station_avg.values, colorcoral) plt.title(各监测站平均降水量对比) plt.xlabel(降水量) plt.tight_layout() plt.savefig(station_compare.png, dpi150) plt.show() # 雨季 vs 旱季 df[season] df[month].apply(lambda x: 雨季 if 6 x 8 else (旱季 if x in [10, 11] else 其他)) season_year df[df[season] ! 其他].groupby([year, season])[precipitation].sum().unstack() season_year.plot(kindbar, figsize(14, 5)) plt.title(雨季与旱季降水量年度对比) plt.xlabel(年份) plt.ylabel(降水量) plt.tight_layout() plt.savefig(season_compare.png, dpi150) plt.show()sort_values(ascendingFalse)让站点按降水量降序排列一眼能看出哪些站点偏高。季节划分用apply加条件判断逻辑简单但要注意边界6 到 8 月算雨季10 到 11 月算旱季其余归为其他。unstack()把 season 变成列方便画分组条形图。这一步做完基本能支撑雨季降水量减少导致总降水量下降这个结论。4. ARIMA 预测参数怎么定、模型怎么验4.1 平稳性检验与差分阶数确定ARIMA 的三个参数 p、d、q 里d 是差分阶数直接决定序列是否平稳。先用 ADF 检验判断再决定要不要差分。from statsmodels.tsa.stattools import adfuller from statsmodels.graphics.tsaplots import plot_acf, plot_pacf # 月度序列 ts df[precipitation].resample(M).mean().dropna() # ADF 检验 result adfuller(ts) print(fADF Statistic: {result[0]}) print(fp-value: {result[1]}) # 如果不平稳做一阶差分 if result[1] 0.05: ts_diff ts.diff().dropna() result_diff adfuller(ts_diff) print(f差分后 p-value: {result_diff[1]})ADF 检验的 p 值小于 0.05 说明序列平稳可以直接建模大于 0.05 就需要差分。ts.diff()做一阶差分dropna()去掉第一个 NaN。常见做法是差分后再跑一次 ADF确认平稳后再定 d 的值。如果一阶差分还不平稳就考虑二阶但气象数据一般一阶就够了。4.2 定阶与模型拟合p 和 q 通过 ACF 和 PACF 图来定也可以用auto_arima自动搜索但毕业设计里手动定阶更能体现分析过程。from statsmodels.tsa.arima.model import ARIMA # 画 ACF 和 PACF fig, axes plt.subplots(2, 1, figsize(12, 8)) plot_acf(ts_diff, axaxes[0], lags24) plot_pacf(ts_diff, axaxes[1], lags24) plt.tight_layout() plt.savefig(acf_pacf.png, dpi150) plt.show() # 拟合 ARIMA 模型p,d,q 按图调整 model ARIMA(ts, order(1, 1, 1)) model_fit model.fit() print(model_fit.summary())ACF 截尾定 qPACF 截尾定 p拖尾就多试几组。order(1,1,1)是常见起点实际跑的时候可以试 (2,1,1)、(1,1,2) 等组合看 AIC 和 BIC 哪个更小。model_fit.summary()会输出系数、标准误和信息准则这些是判断模型好坏的核心指标。4.3 预测与效果验证拟合完要留一段历史数据做验证不能全量训练再全量预测那样看不出模型真实效果。# 划分训练集和测试集 train ts[:-12] test ts[-12:] # 重新拟合 model ARIMA(train, order(1, 1, 1)) model_fit model.fit() # 预测未来 12 个月 forecast model_fit.forecast(steps12) # 对比 plt.figure(figsize(14, 5)) plt.plot(train.index, train.values, label训练数据) plt.plot(test.index, test.values, label实际值, colorgreen) plt.plot(test.index, forecast.values, label预测值, colorred, linestyle--) plt.legend() plt.title(ARIMA 预测 vs 实际) plt.tight_layout() plt.savefig(arima_forecast.png, dpi150) plt.show()ts[:-12]留最后 12 个月做测试forecast(steps12)预测同样长度。对比图里看预测曲线和实际曲线的贴合程度如果偏差太大回头调 p 和 q。这一步是毕业设计里最能体现模型验证的部分答辩时重点讲。5. 避坑与常见问题排查5.1 中文乱码导致图表全是方框现象Matplotlib 输出的图表里中文全部显示为方框。原因默认字体不支持中文。解决在绘图前设置plt.rcParams[font.sans-serif] [SimHei]同时加plt.rcParams[axes.unicode_minus] False处理负号。如果 SimHei 不可用换成Microsoft YaHei或WenQuanYi Micro Hei。5.2 ARIMA 报错 The computed initial MA coefficients are not invertible现象拟合时抛出不可逆警告或直接报错。原因MA 系数初值不合理通常是 q 设得太大或数据差分过度。解决先把 q 降到 1 或 0 试确认数据只做了一阶差分必要时加enforce_stationarityFalse和enforce_invertibilityFalse让模型自己找初值。5.3 时间索引乱序导致预测完全偏离现象预测曲线和历史曲线趋势相反或完全对不上。原因数据没有按时间排序resample或ARIMA按错误顺序处理。解决在预处理阶段强制df.sort_values(date).set_index(date)并在建模前打印ts.index.is_monotonic_increasing确认单调递增。5.4 Excel 读取时列名带空格或特殊字符现象KeyError提示找不到列名。原因Excel 表头有不可见空格或换行符。解决读取后统一df.columns df.columns.str.strip()再用df.columns.tolist()打印确认。重命名时用字典精确匹配不要用模糊替换。5.5 依赖版本不匹配导致 statsmodels 导入失败现象ImportError或AttributeError指向 statsmodels。原因requirements.txt里的版本和本地环境冲突。解决新建虚拟环境后pip install -r requirements.txt不要混用系统环境。如果还报错单独升级statsmodels和pandas到兼容版本。6. 从 notebook 到可交付结果导出 HTML 与复现检查notebook 跑通只是第一步毕业设计要交的是能给别人看的结果。这份资源里已经带了导出的 HTML 文件但你自己改完代码后需要重新导出。Jupyter 里用jupyter nbconvert --to html 基于大数据的新疆历史降水量数据可视化分析.ipynb就能生成静态页面图表和代码都会保留。注意导出前把plt.show()换成plt.savefig()或者确保 inline 后端正常否则 HTML 里图表可能是空白。复现检查我一般按这个顺序走先确认requirements.txt里的依赖全部装上再从头到尾跑一遍 notebook重点看三个地方——数据读取有没有报列名错误、ARIMA 拟合有没有警告、导出图片有没有中文乱码。这三处过了基本就能交付。有个细节容易忽略resample(M)在新版 Pandas 里会提示M将被弃用改成ME可以消掉警告但不影响运行。检查项预期结果常见异常数据读取无列名错误行数与 Excel 一致KeyError、行数偏少缺失值处理降水量列无 NaN类型转换失败年度趋势图折线完整异常年份可辨中文乱码、索引乱序ARIMA 拟合无不可逆警告AIC 合理报错、预测偏离HTML 导出图表和代码完整显示图表空白最后说个血泪经验ARIMA 的 p、d、q 不要一次调太多组先固定 d1再小范围试 p 和 q每组记录 AIC。我见过有人一口气试了二十组结果 notebook 跑了半小时最后自己都忘了哪组对应哪个参数。从那以后我每次调参都强制在代码里加一行注释记下 order 和 AIC方便回溯。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Stable Diffusion WebUI:开源AI绘图的创作主权实践指南

Stable Diffusion WebUI:开源AI绘图的创作主权实践指南

1. 这不是又一个“AI绘画工具教程”,而是一场权力结构的静默迁移 Stable Diffusion WebUI——这个由AUTOMATIC1111主导开发、基于Gradio构建的Python前端界面,表面看只是个带滑块和按钮的网页,但它的存在本身,就是对AI绘图领域权力…

2026/10/1 13:34:21 阅读更多 →
EMC实战指南:共模电流回路与网口防护电路设计

EMC实战指南:共模电流回路与网口防护电路设计

看到“6.2 EMC”这个编号,很多人的第一反应是教科书目录里的某一节,或者是某份测试报告里的条款号。但在我做了十几年硬件设计和EMC整改之后,越来越觉得这两个词放在一起,代表的绝不是一个孤立的章节,而是一整套从测试…

2026/10/1 13:33:20 阅读更多 →
PyCharm 中创建并运行 Django 项目:从环境配置到首个页面全流程

PyCharm 中创建并运行 Django 项目:从环境配置到首个页面全流程

很多新手朋友在接触 Python Web 开发时,第一个拦路虎往往不是 Django 框架本身,而是“怎么把这个项目在 PyCharm 里跑起来”。我当年第一次创建 Django 项目的时候,光是“该选哪个解释器”“虚拟环境和全局环境到底有什么区别”“为什么创建完…

2026/10/1 13:33:20 阅读更多 →

最新新闻

工业Agent别碰实时控制,大模型应做外脑而非内芯

工业Agent别碰实时控制,大模型应做外脑而非内芯

前阵子有个做工业AI的团队来找我聊合作,PPT里把大模型接上产线摄像头,模型判断工件到位,伺服电机随即启动,节奏顺畅,看起来确实是“实时决策”。我问了一句:Agent服务要真宕机了,产线怎么办&…

2026/10/1 14:10:41 阅读更多 →
OpenRig:面向本地大模型CLI的轻量级运行时胶水层

OpenRig:面向本地大模型CLI的轻量级运行时胶水层

1. 项目概述:OpenRig 是什么?它解决的不是“能不能用”,而是“怎么稳、怎么快、怎么可持续”OpenRig 这个名字在当前技术社区里,正以一种略带迷惑性的方式高频出现——它既不是官方发布的知名开源项目,也不是某个大厂背…

2026/10/1 14:10:41 阅读更多 →
Tab切换的三种实现方案:CSS/JS/Vue选型指南

Tab切换的三种实现方案:CSS/JS/Vue选型指南

1. 项目概述:为什么一个简单的tab切换值得拆解三种实现方式?在前端开发日常中,“tab栏切换”几乎是每个项目都会遇到的最小颗粒度交互需求——用户点一下“商品详情”,内容区域就切到描述页;再点“规格参数”&#xff…

2026/10/1 14:10:41 阅读更多 →
Model-Optimizer实战:从图融合到INT8量化的推理加速指南

Model-Optimizer实战:从图融合到INT8量化的推理加速指南

模型部署这关,卡过不知道多少人。训练环境里跑得飞快的模型,一上生产就变形:延迟飙高、显存吃紧、吞吐上不去。Model-Optimizer就是冲着这个问题去的——它是一个专注于推理阶段优化的工具链,针对深度学习模型做计算图重写、算子融…

2026/10/1 14:10:41 阅读更多 →
VS Code自动打开窗口怎么关?彻底搞懂恢复窗口设置与配置文件

VS Code自动打开窗口怎么关?彻底搞懂恢复窗口设置与配置文件

说实话,刚被问到“VS Code 自动打开窗口怎么关”这个问题时,我还觉得挺简单的,第一反应就是设置里关掉“恢复窗口”不就行了。结果连着帮几个朋友排查下来才发现,同一个问题背后至少藏着好几种完全不一样的现象:有人是…

2026/10/1 14:10:41 阅读更多 →
Kali Linux中文输入法配置指南:IBus-Pinyin实战调优

Kali Linux中文输入法配置指南:IBus-Pinyin实战调优

1. 为什么Kali默认不带中文输入法?这不是疏忽,而是设计选择刚装好Kali Linux图形界面的那一刻,你点开终端敲下gedit或firefox,想输入“渗透测试”四个字——光标在那儿一动不动,键盘敲出来的全是英文字母。你下意识去右…

2026/10/1 14:09:41 阅读更多 →

日新闻

我发现了一个新思路:用 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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →