129-基于Python的城市尾气排放数据可视化分析系统

城市尾气排放数据可视化分析系统 --- 技术文档

1. 项目概述

1.1 项目简介

本系统是一个基于 Python Django 框架的城市尾气排放数据可视化分析平台,面向全国 36 个主要城市的机动车尾气排放数据,提供多维度的数据展示、智能分析和趋势预测能力。系统采用 B/S 架构,前端通过 ECharts 实现丰富的交互式图表,后端通过 Django + Pandas + NumPy 进行数据处理与统计分析,数据持久层使用 MySQL。

1.2 核心功能

功能模块 说明
态势总览 KPI 卡片、智能分析结论、风险预警城市排名、低碳效率标杆、工作日排放对比、区域排放结构对比
地域分布 3D 中国地图(省份下钻至城市)、桑基流图、漏斗图、极坐标柱状图、矩形树图
排放趋势 月度/年度趋势折线图、AQI 南丁格尔玫瑰图、月-周热力矩阵、污染物相关性矩阵、区域 CO2 箱线图、污染物堆叠面积图
车辆结构 能源类型饼图、绿色治理度仪表盘、多维雷达图、GDP-CO2 散点图、新能源占比排行
预测分析 基于线性回归的 CO2 排放预测、Top 城市排放排行、年度 CO2/AQI 对比柱状图
数据管理 分页查询、多条件筛选、CRUD 操作、CSV 导出
用户管理 注册/登录/登出、个人资料编辑、密码修改、管理员用户管理(启用/禁用/删除)

1.3 数据规模

  • 覆盖城市:36 个(北京、上海、广州、深圳、天津、重庆、成都、杭州等)
  • 覆盖省份:30 个省/直辖市/自治区
  • 数据字段:22 个维度(时间、地理、车辆、排放、气象、经济)
  • 原始数据量:约 4.16 MB CSV 文件





















2. 技术栈

2.1 后端

组件 版本 用途
Python 3.8+ 运行时环境
Django 4.2.8 Web 框架(路由、视图、模板、ORM、认证)
pandas 2.2.3 数据加载、聚合、透视、相关性计算
NumPy 1.26.2 数值计算(百分位数、线性回归、归一化)
scikit-learn 1.3.2 LinearRegression 预测模型
PyMySQL 1.4.6 MySQL 数据库驱动

2.2 前端

组件 版本 用途
Bootstrap 5.x 响应式布局、表单组件、导航
Bootstrap Icons --- 图标库
ECharts 5.x 图表渲染引擎(折线、柱状、饼图、散点、热力图、桑基、漏斗、雷达、仪表盘、箱线图、地图)
ECharts-GL --- 3D 地图渲染(map3D)
china.js --- 中国地图 GeoJSON 数据

2.3 数据库

组件 说明
MySQL 8.0+,字符集 utf8mb4,排序规则 utf8mb4_unicode_ci
数据库名 design_129_emission
存储引擎 InnoDB(Django 默认)

3. 系统架构

3.1 整体架构

复制代码
┌──────────────────────────────────────────────────────────┐
│                     浏览器 (Client)                       │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌────────────┐  │
│  │ Bootstrap│  │ ECharts │  │ ECharts │  │ dashboard  │  │
│  │  CSS/JS  │  │  Core   │  │  -GL    │  │    .js     │  │
│  └─────────┘  └─────────┘  └─────────┘  └────────────┘  │
└──────────────────────┬───────────────────────────────────┘
                       │ HTTP (JSON API / HTML)
┌──────────────────────▼───────────────────────────────────┐
│                  Django 应用层                             │
│  ┌─────────────┐  ┌─────────────┐  ┌──────────────────┐  │
│  │   urls.py   │→ │  views.py   │→ │   templates/     │  │
│  │  (路由分发)  │  │ (视图逻辑)   │  │  (模板渲染)      │  │
│  └─────────────┘  └──────┬──────┘  └──────────────────┘  │
│                          │                                │
│  ┌─────────────┐  ┌──────▼──────┐  ┌──────────────────┐  │
│  │  forms.py   │  │  models.py  │  │   admin.py       │  │
│  │ (表单验证)   │  │  (数据模型)  │  │  (后台管理)      │  │
│  └─────────────┘  └──────┬──────┘  └──────────────────┘  │
└──────────────────────────┼───────────────────────────────┘
                           │ Django ORM
┌──────────────────────────▼───────────────────────────────┐
│                    MySQL 数据库                            │
│              design_129_emission.emission_records          │
└──────────────────────────────────────────────────────────┘

3.2 数据流

复制代码
CSV 文件 ──(import_emissions 命令)──→ MySQL ──(ORM Query)──→ Django View
                                                                  │
                                                    ┌─────────────┼─────────────┐
                                                    ▼             ▼             ▼
                                              pandas DataFrame  JSON API    Template
                                              (聚合/统计/分析)  (前端渲染)   (HTML页面)
                                                    │             │
                                                    └──────┬──────┘
                                                           ▼
                                                    ECharts 图表

3.3 项目目录结构

复制代码
city/
├── manage.py                          # Django 管理入口
├── requirements.txt                   # Python 依赖
├── city_emission_data.csv             # 原始数据集 (4.16 MB)
├── database_init.sql                  # 数据库初始化脚本
├── design_129_emission.sql            # 完整数据库导出
│
├── emission_system/                   # Django 项目配置
│   ├── __init__.py
│   ├── settings.py                    # 全局配置(数据库、中间件、模板、静态文件)
│   ├── urls.py                        # 根路由
│   └── wsgi.py                        # WSGI 入口
│
├── dashboard/                         # 核心应用
│   ├── __init__.py
│   ├── apps.py                        # 应用配置
│   ├── models.py                      # 数据模型 (EmissionRecord)
│   ├── views.py                       # 视图函数 (1731 行,含 15 个 API)
│   ├── urls.py                        # 应用路由 (34 条)
│   ├── forms.py                       # 表单类 (5 个)
│   ├── admin.py                       # Admin 后台配置
│   ├── management/
│   │   └── commands/
│   │       ├── import_emissions.py    # CSV 数据导入命令
│   │       └── seed_admin.py          # 管理员账号初始化
│   └── migrations/
│       └── 0001_initial.py            # 初始迁移
│
├── static/dashboard/
│   ├── css/dashboard.css              # 自定义样式 (2339 行)
│   ├── js/dashboard.js                # 前端逻辑 (1239 行)
│   ├── img/                           # 城市 SVG 插图
│   └── vendor/                        # 第三方库
│       ├── bootstrap/                 # Bootstrap 5 CSS/JS
│       ├── bootstrap-icons/           # 图标字体
│       ├── echarts/                   # ECharts 核心 + china.js
│       └── echarts-gl/                # ECharts 3D 扩展
│
├── templates/
│   ├── base.html                      # 认证页面基础模板
│   └── dashboard/
│       ├── layout.html                # 仪表盘布局(侧边栏 + 顶栏 + 内容区)
│       ├── login.html                 # 登录页
│       ├── register.html              # 注册页
│       ├── overview.html              # 态势总览
│       ├── geo.html                   # 地域分布
│       ├── emission.html              # 排放趋势
│       ├── vehicle.html               # 车辆结构
│       ├── forecast.html              # 预测分析
│       ├── data_management.html       # 数据管理
│       ├── user_management.html       # 用户管理
│       ├── profile.html               # 个人资料
│       ├── password_change.html       # 修改密码
│       ├── record_form.html           # 记录新增/编辑
│       ├── record_confirm_delete.html # 记录删除确认
│       └── partials/
│           └── filter_dock.html       # 筛选器组件
│
└── docs/
    ├── city_drilldown_technical_doc.md
    └── technical_document.md          # 本文档

4. 数据模型

4.1 EmissionRecord 模型

系统核心数据模型,存储每条城市尾气排放记录。

python 复制代码
class EmissionRecord(models.Model):
    # ── 地理维度 ──
    city = CharField(max_length=50)          # 城市名称
    province = CharField(max_length=50)      # 省份名称
    region = CharField(max_length=30)        # 区域(华东、华南等)

    # ── 时间维度 ──
    date = DateField()                       # 具体日期
    year = PositiveSmallIntegerField()       # 年份(冗余字段,加速查询)
    month = PositiveSmallIntegerField()      # 月份(冗余字段)
    weekday = PositiveSmallIntegerField()    # 星期几(1=周一,7=周日)
    is_workday = BooleanField()              # 是否工作日

    # ── 车辆维度 ──
    vehicle_stock_10k = FloatField()         # 机动车保有量(万辆)
    new_energy_ratio = FloatField()          # 新能源车占比(0-1)
    gasoline_ratio = FloatField()            # 汽油车占比(0-1)
    diesel_ratio = FloatField()              # 柴油车占比(0-1)
    avg_vehicle_age = FloatField()           # 平均车龄(年)

    # ── 排放维度 ──
    co2_emission = FloatField()              # CO2 排放量(吨/日)
    co_emission = FloatField()               # CO 排放量(吨/日)
    nox_emission = FloatField()              # NOx 排放量(吨/日)
    pm25_contribution = FloatField()         # PM2.5 贡献(微克/立方米)
    aqi_index = PositiveSmallIntegerField()  # AQI 指数

    # ── 气象维度 ──
    avg_temperature = FloatField()           # 月均气温(摄氏度)
    humidity = FloatField()                  # 相对湿度(%)
    wind_speed = FloatField()                # 平均风速(米/秒)

    # ── 经济维度 ──
    population_10k = PositiveIntegerField()  # 人口(万人)
    gdp_100m = PositiveIntegerField()        # GDP(亿元)

    # ── 系统字段 ──
    created_at = DateTimeField(auto_now_add=True)  # 创建时间

4.2 数据库索引

索引名 字段 用途
主键索引 id (BigAutoField) 记录唯一标识
单字段索引 city, province, region, date, year, month 筛选查询加速
idx_emission_place (province, city) 按省市联合查询
idx_emission_ym (year, month) 按年月联合查询
idx_emission_region (region, province) 按区域省份联合查询

4.3 数据库初始化

sql 复制代码
CREATE DATABASE IF NOT EXISTS design_129_emission
  DEFAULT CHARACTER SET utf8mb4
  DEFAULT COLLATE utf8mb4_unicode_ci;

5. API 接口文档

所有 API 均需登录认证(@login_required),返回 JSON 格式,支持筛选参数。

5.1 公共筛选参数

参数 类型 说明
province string 省份筛选
city string 城市筛选
year string 年份筛选
q string 关键词搜索(城市/省份/区域模糊匹配)

5.2 API 列表

5.2.1 GET /api/options/

功能:获取筛选器选项数据

返回

json 复制代码
{
  "ok": true,
  "data": {
    "provinces": ["上海市", "云南省", ...],
    "cities_by_province": {
      "上海市": ["上海"],
      "云南省": ["昆明"],
      ...
    },
    "years": [2019, 2020, 2021, 2022, 2023]
  }
}
5.2.2 GET /api/summary/

功能:态势总览 KPI 数据与区域排放对比

返回

json 复制代码
{
  "ok": true,
  "empty": false,
  "data": {
    "cards": [
      {
        "key": "co2",
        "label": "CO2日排放总量",
        "value": 123.45,
        "unit": "万吨",
        "trend": -2.3
      }
    ],
    "meta": {
      "records": 5000,
      "cities": 36,
      "provinces": 30,
      "regions": 7,
      "year_range": [2019, 2023]
    },
    "region_mix": [
      {
        "region": "华东",
        "co2": 50000.00,
        "aqi": 85.3,
        "nox": 3000.00,
        "city_count": 8
      }
    ]
  }
}
5.2.3 GET /api/trends/

功能:时间趋势数据(月度、年度、星期维度)

返回

json 复制代码
{
  "data": {
    "monthly": [
      { "label": "2023-01", "co2": 50000, "co": 3000, "nox": 2000, "pm25": 45.2, "aqi": 85.3, "new_energy": 15.2 }
    ],
    "yearly": [
      { "year": 2023, "co2": 600000, "nox": 24000, "aqi": 82.1, "vehicle": 350.5, "new_energy": 18.3 }
    ],
    "weekday": [
      { "weekday": 1, "is_workday": true, "co2": 450.5, "aqi": 85.3 }
    ]
  }
}
5.2.4 GET /api/geo/

功能:地理分布数据(省份和城市级 CO2 排放、AQI 等)

返回

json 复制代码
{
  "data": {
    "provinces": [
      {
        "name": "广东省",
        "geo_name": "广东",
        "region": "华南",
        "co2": 80000.00,
        "aqi": 78.5,
        "coord": [113.2669, 23.1333]
      }
    ],
    "cities": [
      {
        "name": "广州",
        "province": "广东省",
        "co2": 25000.00,
        "aqi": 75.2,
        "coord": [113.2644, 23.1291]
      }
    ]
  }
}
5.2.5 GET /api/geo-province/?province=广东省

功能:省份下钻,获取指定省份内城市级数据

参数province(必填)

返回 :与 /api/geo/ 结构类似,但仅包含指定省份的城市数据,另含 funnel、treemap、sankey 图表数据。

5.2.6 GET /api/charts/

功能:综合图表数据(车辆混合、污染物混合、AQI 南丁格尔、省份漏斗、桑基、雷达、仪表盘、散点、热力图、相关性矩阵、矩形树图、箱线图、Top 城市)

5.2.7 GET /api/geo-charts/

功能:地域分布页专用图表数据(漏斗、桑基、极坐标、矩形树图)

5.2.8 GET /api/emission-charts/

功能:排放趋势页专用图表数据(AQI 南丁格尔、热力矩阵、相关性矩阵、箱线图)

5.2.9 GET /api/vehicle-charts/

功能:车辆结构页专用图表数据(能源饼图、仪表盘、雷达、散点)

5.2.10 GET /api/forecast-detail/

功能:预测页 Top 城市排行数据

5.2.11 GET /api/insights/

功能:智能分析结论

返回

json 复制代码
{
  "data": {
    "narrative": [
      "华东区域累计 CO2 排放最高,占当前筛选范围的 32.5%。",
      "广东省广州是排放压力最高城市,CO2 累计 12.50 万吨。"
    ],
    "risk_rank": [
      { "city": "广州", "province": "广东省", "score": 85.3, "co2": 25000, "aqi": 75.2, "new_energy": 18.5 }
    ],
    "efficiency_rank": [...],
    "pressure_rank": [...],
    "region_profile": [...],
    "workday_compare": [...]
  }
}
5.2.12 GET /api/prediction/?horizon=6

功能:CO2 排放趋势预测(线性回归)

参数horizon(预测月数,3-12,默认 6)

返回

json 复制代码
{
  "data": {
    "history": [{ "label": "2023-01", "value": 50000 }],
    "forecast": [{ "label": "2024-01", "value": 52000 }],
    "method": "LinearRegression + monthly aggregate",
    "generated_at": "2024-01-15 10:30:00"
  }
}
5.2.13 GET /api/export/

功能:CSV 数据导出(带 BOM 头,支持 Excel 直接打开)

返回text/csv 文件下载


6. 核心业务逻辑

6.1 数据导入流程

bash 复制代码
# 1. 创建数据库
mysql -u root -p < database_init.sql

# 2. 执行迁移
python manage.py migrate

# 3. 导入 CSV 数据
python manage.py import_emissions --path city_emission_data.csv --truncate

# 4. 创建管理员
python manage.py seed_admin --username admin --password 123456

import_emissions 命令流程:

  1. 读取 CSV 文件(pandas)
  2. 校验必需列是否存在
  3. 中文列名映射为英文字段名
  4. 类型转换(日期、布尔值)
  5. 事务内批量插入(bulk_create,默认 batch_size=1000)
  6. 可选 --truncate 清空旧数据

6.2 数据分析流程

视图函数中的数据分析遵循统一模式:

复制代码
请求 → _filtered_queryset() → _frame() → pandas 聚合 → JSON 序列化 → 响应
  1. 筛选_filtered_queryset(request) 根据 GET 参数构建 Django QuerySet
  2. 加载_frame(request, fields) 将 QuerySet 转为 pandas DataFrame
  3. 分析:使用 pandas groupby/agg/corr 等进行多维聚合
  4. 序列化_num() / _int() 辅助函数处理 NaN/Inf 安全转换
  5. 返回_json() 封装 JsonResponse(ensure_ascii=False)

6.3 智能分析算法

6.3.1 风险评分模型
python 复制代码
risk_score = (
    minmax(co2) * 34        # CO2 权重 34%
    + minmax(nox) * 22      # NOx 权重 22%
    + minmax(aqi) * 24      # AQI 权重 24%
    + minmax(pm25) * 14     # PM2.5 权重 14%
    + (1 - minmax(new_energy)) * 6  # 新能源占比反向权重 6%
)

其中 minmax() 为 Min-Max 归一化函数,将各指标映射到 [0, 1] 区间。

6.3.2 绿色治理度评分
python 复制代码
green_score = clamp(
    100
    - avg_aqi / 3
    - avg_co2 / max_co2 * 35
    + avg_new_energy * 20,
    0, 100
)
6.3.3 CO2 预测模型

使用 scikit-learn 的 LinearRegression,以月度聚合的 CO2 总量为因变量,时间序列为自变量进行线性回归预测。若 scikit-learn 不可用,回退到 NumPy 的 polyfit 一次多项式拟合。

6.4 地图下钻机制

复制代码
全国地图 (3D map3D)
    │
    │ 点击省份
    ▼
省份下钻 (2D effectScatter)
    │
    │ 点击面包屑"全国"
    ▼
返回全国地图
  • 前端维护 drilldown 状态对象(active, province, nationalData)
  • 点击省份时调用 /api/geo-province/ 获取城市级数据
  • 地图从 3D map3D 切换为 2D effectScatter(涟漪散点)
  • 漏斗图、桑基图、矩形树图同步更新为城市级数据
  • 面包屑导航支持返回全国视图

7. 前端架构

7.1 页面结构

所有仪表盘页面继承 dashboard/layout.html,包含:

  • 侧边栏 (dimension-rail):品牌标识 + 分析维度导航 + 数据量统计
  • 顶栏 (workspace-topbar):页面标题 + 紧凑模式/回到顶部/个人中心/退出
  • 内容区 (dashboard-shell):各页面具体内容
  • Toast 容器:操作反馈通知

7.2 JavaScript 模块结构

dashboard.js 采用 IIFE 封装,主要模块:

复制代码
┌─ 状态管理 ──────────────────────────┐
│  charts{}      ECharts 实例缓存     │
│  state{}       全局状态(选项、模态) │
│  drilldown{}   下钻状态             │
└────────────────────────────────────┘

┌─ 工具函数 ──────────────────────────┐
│  queryString()     构建筛选参数      │
│  getJson()         API 请求封装      │
│  _num()/_int()     数值安全转换      │
│  escapeHtml()      XSS 防护         │
│  showToast()       通知系统          │
└────────────────────────────────────┘

┌─ 图表渲染 ──────────────────────────┐
│  renderMap()         3D/2D 地图     │
│  renderTrend()       趋势折线图      │
│  renderNightingale() 南丁格尔玫瑰图  │
│  renderHeatmap()     热力矩阵       │
│  renderCorrelation() 相关性矩阵     │
│  renderSankey()      桑基流图       │
│  renderFunnel()      漏斗图         │
│  renderRadar()       雷达图         │
│  renderGauge()       仪表盘         │
│  renderScatter()     散点图         │
│  renderBoxplot()     箱线图         │
│  renderTreemap()     矩形树图       │
│  renderPrediction()  预测折线图     │
│  ...                               │
└────────────────────────────────────┘

┌─ 页面加载器 ────────────────────────┐
│  loadOverviewPage()   态势总览      │
│  loadGeoPage()        地域分布      │
│  loadEmissionPage()   排放趋势      │
│  loadVehiclePage()    车辆结构      │
│  loadForecastPage()   预测分析      │
└────────────────────────────────────┘

┌─ 交互功能 ──────────────────────────┐
│  initChartTools()     图表工具栏    │
│  focusChart()         图表聚焦模态  │
│  downloadChart()      图表导出PNG   │
│  enterDrilldown()     省份下钻      │
│  exitDrilldown()      返回全国      │
│  applyCompactMode()   紧凑模式      │
└────────────────────────────────────┘

7.3 图表类型汇总

页面 图表 ECharts 类型 数据 API
态势总览 KPI 卡片 DOM 渲染 /api/summary/
态势总览 智能结论 DOM 渲染 /api/insights/
态势总览 区域柱状图 bar /api/summary/
态势总览 区域饼图 pie /api/summary/
地域分布 3D 中国地图 map3D /api/geo/
地域分布 省份下钻散点 effectScatter /api/geo-province/
地域分布 桑基流图 sankey /api/geo-charts/
地域分布 漏斗图 funnel /api/geo-charts/
地域分布 极坐标柱状图 bar (polar) /api/geo-charts/
地域分布 矩形树图 treemap /api/geo-charts/
排放趋势 趋势折线图 line /api/trends/
排放趋势 污染物堆叠图 line (stack) /api/trends/
排放趋势 AQI 南丁格尔 pie (roseType) /api/emission-charts/
排放趋势 月-周热力图 heatmap /api/emission-charts/
排放趋势 相关性矩阵 heatmap /api/emission-charts/
排放趋势 箱线图 boxplot /api/emission-charts/
车辆结构 能源饼图 pie /api/vehicle-charts/
车辆结构 绿色治理度 gauge /api/vehicle-charts/
车辆结构 多维雷达 radar /api/vehicle-charts/
车辆结构 GDP-CO2 散点 scatter /api/vehicle-charts/
车辆结构 新能源排行 bar (horizontal) /api/vehicle-charts/
预测分析 CO2 预测折线 line /api/prediction/
预测分析 年度对比柱状 bar + line /api/trends/
预测分析 Top 城市表格 DOM 渲染 /api/forecast-detail/

8. 用户认证与权限

8.1 认证机制

  • 基于 Django 内置认证框架(django.contrib.auth
  • Session 认证,Cookie 存储 Session ID
  • 所有仪表盘页面和 API 均需 @login_required 装饰器
  • 未登录用户自动跳转至 /login/

8.2 权限模型

角色 权限
普通用户 查看仪表盘、筛选数据、导出 CSV、编辑个人资料
管理员 (is_staff) 普通用户权限 + 用户管理 + Django Admin 后台
超级管理员 (is_superuser) 全部权限

8.3 表单类

表单 用途 字段
BootstrapAuthenticationForm 登录 username, password
BootstrapUserCreationForm 注册 username, email, password1, password2
BootstrapPasswordChangeForm 改密 old_password, new_password1, new_password2
ProfileForm 个人资料 username(只读), email, first_name, last_name
EmissionRecordForm 排放记录 CRUD 除 year/month/weekday/created_at 外全部字段

9. 部署与运维

9.1 环境要求

  • Python 3.8+
  • MySQL 8.0+
  • pip (Python 包管理)

9.2 安装步骤

bash 复制代码
# 1. 克隆项目
cd city/

# 2. 安装依赖
pip install -r requirements.txt

# 3. 创建数据库
mysql -u root -p < database_init.sql

# 4. 配置数据库连接(环境变量或修改 settings.py)
export MYSQL_DATABASE=design_129_emission
export MYSQL_USER=root
export MYSQL_PASSWORD=your_password
export MYSQL_HOST=localhost
export MYSQL_PORT=3306

# 5. 执行数据库迁移
python manage.py migrate

# 6. 导入数据
python manage.py import_emissions --path city_emission_data.csv --truncate

# 7. 创建管理员
python manage.py seed_admin --username admin --password your_password

# 8. 启动服务
python manage.py runserver 0.0.0.0:8000

9.3 环境变量

变量 默认值 说明
DJANGO_SECRET_KEY design-129-emission-local-development-key Django 密钥
DJANGO_DEBUG 1 调试模式(1=开,0=关)
MYSQL_DATABASE design_129_emission 数据库名
MYSQL_USER root 数据库用户
MYSQL_PASSWORD 123456 数据库密码
MYSQL_HOST localhost 数据库主机
MYSQL_PORT 3306 数据库端口

9.4 生产环境建议

  1. 安全配置

    • 设置 DJANGO_DEBUG=0
    • 使用强随机 DJANGO_SECRET_KEY
    • 配置 ALLOWED_HOSTS 为具体域名
    • 数据库用户使用最小权限原则
  2. 性能优化

    • 使用 Gunicorn + Nginx 部署
    • 开启 Django 缓存框架(Redis/Memcached)
    • 对 API 响应启用分页或增量加载
    • 静态文件使用 CDN 或 Nginx 直接服务
  3. 数据备份

    • 定期备份 MySQL 数据库
    • CSV 原始数据归档保存

10. 代码质量与规范

10.1 后端规范

  • 视图函数使用 @login_required@require_GET 装饰器进行访问控制
  • 数据处理使用 pandas DataFrame,避免在 Python 层面手动循环
  • 数值输出统一通过 _num() / _int() 处理 NaN/Inf 安全转换
  • JSON 响应使用 ensure_ascii=False 支持中文直接输出
  • 数据库操作使用 @transaction.atomic 保证事务一致性

10.2 前端规范

  • 图表渲染使用 safeRender() 包装,捕获异常并显示错误状态
  • XSS 防护:所有动态内容通过 escapeHtml() 转义
  • 响应式设计:CSS Grid + Flexbox 布局
  • 无障碍:使用 aria-labelaria-liverole 等属性
  • 性能:ECharts 实例缓存在 charts{} 对象中,避免重复初始化

10.3 数据安全

  • 所有 API 需要登录认证
  • CSRF 中间件保护表单提交
  • 用户密码使用 Django 内置哈希算法存储
  • 管理员操作使用 @user_passes_test 权限检查

11. 数据字典

11.1 排放指标

字段 单位 范围 说明
co2_emission 吨/日 >0 城市日均 CO2 排放量
co_emission 吨/日 >0 城市日均 CO 排放量
nox_emission 吨/日 >0 城市日均 NOx 排放量
pm25_contribution 微克/立方米 >0 尾气对 PM2.5 的贡献浓度
aqi_index 无量纲 0-500 空气质量指数

11.2 AQI 等级划分

等级 AQI 范围 颜色
0-50 绿色
51-100 黄绿
轻度污染 101-150 橙色
中度污染 151-200 红色
重度污染 201-300 紫色
严重污染 >300 褐红

11.3 车辆结构指标

字段 单位 说明
vehicle_stock_10k 万辆 机动车保有量
new_energy_ratio 0-1 新能源车占比
gasoline_ratio 0-1 汽油车占比
diesel_ratio 0-1 柴油车占比
avg_vehicle_age 平均车龄

12. 扩展与维护指南

12.1 新增城市数据

  1. views.pyCITY_COORDSPROVINCE_COORDS 字典中添加坐标
  2. 准备 CSV 数据,确保列名与 COLUMN_MAP 一致
  3. 运行 python manage.py import_emissions 导入

12.2 新增图表

  1. views.py 中添加 API 视图函数
  2. dashboard/urls.py 中注册路由
  3. 在对应模板中添加图表容器 DOM
  4. dashboard.js 中添加渲染函数和页面加载逻辑

12.3 新增分析维度

  1. EmissionRecord 模型中添加字段
  2. 执行 python manage.py makemigrations && python manage.py migrate
  3. 更新 VALUE_FIELDS 列表
  4. 更新 import_emissions.pyCOLUMN_MAP
  5. 在 API 和前端中使用新字段

12.4 预测模型升级

当前使用简单线性回归,可扩展为:

  • ARIMA / SARIMA(时间序列专用)
  • Prophet(Facebook 时间序列预测)
  • LSTM(深度学习序列预测)
  • XGBoost / LightGBM(多特征回归)

扩展位置:views.pyapi_prediction() 函数。

相关推荐
yujunl4 小时前
U9的UI插件开发Card功能区上客开的按钮不能正常显示
开发语言
一生了无挂4 小时前
深入解析JVM、JRE与JDK:Java技术体系的核心基石
java·开发语言·jvm
晚霞的不甘4 小时前
CANN昇腾 MindSpore 适配深入解析:如何在 MindSpore 框架中充分发挥昇腾硬件性能的完整指南
人工智能·python·transformer
m0_748839495 小时前
利用C 图形界面展示MATLAB算法的高效混合编程实践
开发语言·算法·matlab
晚霞的不甘5 小时前
CANN-昇腾NPU开发快速入门
人工智能·pytorch·python·深度学习
Xin_ye100865 小时前
C# 零基础到精通教程 - 第九章:面向对象编程(高级)——接口、委托与事件
开发语言·c#
2501_940041745 小时前
应用构建:前端复杂交互与数据可视化的进阶之路
前端·信息可视化
weixin_428005305 小时前
C#调用 AI学习从0开始-第1阶段(基础与工具)-第6天流式输出
开发语言·学习·c#·流式输出stream