面向公众与环境管理者的城市空气质量监测分析系统:真实采集 12 个城市一年逐小时六项污染物与气象数据,按 HJ 633—2012 计算 AQI 与首要污染物,提供监测大屏、城市详情、区域对比、污染过程复盘、数据质量报告与预报对比实验,并支持原始数据下载。重点是把 AQI 数字变成可解释的结论。
视频也可在 B 站视频页 观看
| 编程语言 | Python 3.8 及以上 |
|---|---|
| 后端框架 | Django 4.2 |
| 数据采集 | requests 真实 HTTP 采集(Open-Meteo 空气质量 + ERA5 归档气象,带重试) |
| 数据分析 | pandas 2.0 / NumPy 1.23 / scikit-learn 1.3 |
| 数据库 | MySQL 8.0(交付默认 SQLite,免安装) |
| 可视化 | ECharts 5(已内置本地文件,离线可用) |
| 数据规模 | 12 城 × 8760 小时 = 105120 条,6 项污染物 + 3 项气象,0 缺失 |
| 操作系统 | Windows / macOS / Linux |
| 启动方式 | 双击一键脚本,或 python manage.py runserver 8083 |
下面是交付包里的真实目录,共 97 个文件。只展示文件名,不含文件内容; 点击文件夹可逐层展开,看到每个模块是怎么拆分的。
点击任意一张可放大,支持左右切换(也可用键盘 ← → 键)











交付的任务书、开题报告与论文均为 Word 文档,下面是真实页面预览;点击可放大并左右切换:



是。通过公开接口真实采集 12 个城市一年逐小时的 6 项污染物(Open-Meteo,CAMS 观测同化产品)与 3 项气象(ERA5 再分析),共 105120 条,原始 CSV 随包并可在页面下载。需要注意:这是观测同化后的模型数据,不是地面监测站的实测值,页面与论文都如实标注。
严格按 HJ 633—2012:分指数按断点分段线性插值;PM2.5/PM10/SO₂/NO₂/CO 取 24 小时平均(有效小时 ≥ 20),O₃ 取日最大 8 小时滑动平均;AQI 为各分指数最大值,AQI > 50 时最大项即首要污染物;六级分类并附健康提示。
本数据源完整性为 100%(0 缺失)。为了定量说明填补方案是否可靠,做了受控实验:把北京 PM2.5 序列按 1%/3%/5%/10% 随机挖空再填补,结果线性插值 MAE 仅 3.5–5.3 最优,前向填充 8.4–11.6,当日中位数 30–33,均值填充 47–51。
IQR 检出的离群点经归因多为真实极端事件:北京 2025-12-22 PM2.5 430.3 μg/m³ 而风速仅 0.6–1.8 m/s(静稳累积型);兰州 2026-03-12 PM10 716.1 μg/m³ 且风速 10.66 m/s(沙尘型)。所以异常检测在环境数据里更像『极端事件定位』。
按日均 AQI 排序:北京 117.7 最差(华北,PM2.5 主导),哈尔滨 50.9 最优(东北,颗粒物低、以 O₃ 为主)。区域均值为华北 107.4 > 西南 105.9 > 西北 101.2 > 华中 98.6 > 华东 87.1 > 华南 81.0 > 东北 50.9。
用过去 3 天预测次日日均 AQI,按时间顺序切分避免信息泄漏:持续性基线 MAE 17.12、线性回归 18.83、梯度提升 17.07。诚实结论是持续性基线已很强,复杂模型只改善约 0.3%,要提升需补充边界层高度、风场与排放信息。
能。保持 data/raw/<城市>.csv 的列名不变替换采集逻辑即可(例如接入官方站点数据做交叉验证);加城市在 crawler/cities.py 增项后重跑采集、分析与导入,大屏与对比页会自动扩展。
能。页面『原始数据』列出 12 个逐小时 CSV 并提供下载,同时给出字段、单位与数据性质说明。