基于Python+Django的全国气象数据可视化分析系统
基于Python+Django的全国气象数据可视化分析系统 毕业论文
毕业设计
一、项目名称:
基于Python+Django的全国气象数据可视化分析系统
【摘要】
全国地级行政区气象观测指标分散在外部接口与本地表格中,温度、湿度、辐射、风速、降水等字段口径不一,难以形成统一查询、筛选对比与可视化分析流程。本文设计并实现了基于 Python 与 Django 的全国气象数据可视化分析系统,面向教学与课题演示场景,将 NASA POWER 公开逐日数据清洗入库后,以交互式图表支撑多维气象要素分析与空间展示。
系统采用 B/S 架构,后端基于 Django 3.2,管理端集成 SimpleUI;数据库使用 MySQL(库名 weather_system),通过 mysqlclient / PyMySQL 驱动接入。前台基于 Bootstrap 与 NiceAdmin 模板、ECharts 完成可视化。业务数据以 WeatherData 为核心,城市坐标与区划信息由 CityInfo 辅助;爬虫脚本 spider/获取气象数据.py 内置全国约 333 个地级市经纬度,调用 NASA POWER 逐日点数据接口获取 T2M、RH2M、ALLSKY_SFC_SW_DWN、WS10M、PRECTOTCORR 等参数,结果写入 spider/气象数据.csv 并可经页面导入数据库。分析层基于 Django ORM 聚合与 WeatherDataAnalysis 封装,覆盖城市、温度、湿度、辐射、风力、降水、综合与季节等分析页;地图与热力图分别由 /map/、/analysis/heatmap/ 提供;对比、预警与趋势预测分别对应 /compare/、/warning/、/analysis/prediction/。趋势预测采用最近约 60 日历史序列上的 7 日窗口移动平均 与线性趋势外推,不是 LSTM 或深度学习模型。系统入口为 manage.py,默认运行端口 8030;前台登录路径为 /login/(账号 123456/123456,自建 user 表明文密码),后台为 /admin/(admin/admin123)。中间件 middleware.auth.AuthMiddleware 对未登录访问拦截,豁免 /login/、/register/、/admin/、/api/。模型层虽存在 WeatherFavorite,但现行 urls.py 未挂接收藏相关路由,论文不以可用收藏功能表述。系统无独立全屏数据大屏页面。
测试与运行结果表明,系统能够完成登录鉴权、气象列表筛选、多维图表分析、地图与热力图、对比预警与趋势外推、爬虫导入与 CSV/Excel 导出及 SimpleUI 后台维护等闭环,界面清晰、响应稳定,可为气象数据分析课题研究与教学演示提供可用的可视化分析支撑。
【关键词】 Django;气象数据;数据可视化;ECharts;NASA POWER
【Abstract】
Prefecture-level meteorological indicators are scattered across external APIs and local spreadsheets, making unified query, comparison and visualization difficult. This thesis designs and implements a Python- and Django-based national weather data visualization and analysis system for teaching and demonstration. Daily NASA POWER data are collected, cleaned and stored, then explored through interactive charts.
The system follows a B/S architecture. The backend is built with Django 3.2 and SimpleUI; MySQL database name is weather_system. The frontend adopts Bootstrap/NiceAdmin and ECharts. Core entity WeatherData stores city-day observations; CityInfo holds coordinates. The spider script spider/获取气象数据.py embeds about 333 prefecture-level city coordinates and calls NASA POWER daily point API. Analysis pages cover city, temperature, humidity, radiation, wind, precipitation, overview and seasonal views; map and heatmap are provided at /map/ and /analysis/heatmap/; compare, warning and prediction at /compare/, /warning/ and /analysis/prediction/. Trend prediction uses a 7-day moving average with linear trend extrapolation on recent history, not LSTM. Entry point is manage.py, default port 8030; frontend login /login/ (123456/123456), admin /admin/ (admin/admin123). AuthMiddleware exempts /login/, /register/, /admin/ and /api/. WeatherFavorite exists in models but is not wired in urls.py. There is no standalone fullscreen dashboard.
Results show that authentication, multi-dimensional analysis, map/heatmap, compare/warning/prediction, spider import, export and admin workflows work stably for course demos and research presentation.
【Keywords】 Django; Meteorological Data; Data Visualization; ECharts; NASA POWER
目 录
- 4.0 系统整体实现流程
- 4.1 用户认证模块的实现
- 4.2 气象数据管理模块的实现
- 4.3 多维数据分析模块的实现
- 4.4 地图与热力图模块的实现
- 4.5 对比预警与预测模块的实现
- 4.6 爬虫导出与后台模块的实现
- 4.7 用户界面实现
- 4.8 系统集成与部署
1 绪 论
1.1 课题研究背景
气象观测数据是认识区域气候特征、支撑农业灌溉安排、能源资源评估与灾害风险提示的基础信息。公开数据源中,NASA POWER 提供覆盖全球网格点的逐日温度、湿度、太阳辐射、风速与降水等参数,可按经纬度拉取;而业务侧常见需求是把多城市、多日观测整理进统一库表,再以 Web 图表完成筛选、对比与空间展示。字段命名与缺失值处理口径不一致时,手工汇总成本高,也难以形成可复用的可视化分析流程。
在高校毕业设计与教学演示场景中,常见需求包括:一是需要一套可本地部署的系统,用统一库表承载全国约 333 个地级市样本的逐日气象记录;二是需要温度、湿度、辐射、风力、降水及季节等多维分析视图,辅以中国地图散点与热力矩阵;三是需要脚本化采集、CSV 落盘与页面导入闭环,形成「拉取—入库—分析—导出」流程。基于上述背景,本课题以 Django 为主框架,构建全国气象数据可视化分析系统:数据以 NASA POWER 公开接口为主,爬虫脚本负责采集,前台 NiceAdmin/Bootstrap 与 ECharts 负责展示,后台 SimpleUI 负责库表维护。系统默认端口 8030,不依赖独立全屏数据大屏;趋势预测采用可解释的移动平均与线性外推,便于答辩讲解算法边界。
1.2 课题研究的目的、意义
1.2.1 研究目的
本课题的主要目的包括:
- 建立以
WeatherData、CityInfo与前台User为核心的数据模型,覆盖城市—日期唯一约束下的多要素观测字段,支撑统一查询与聚合。 - 实现前台会话登录、侧栏导航与多分析页展示,服务端口为 8030,登录路径
/login/,后台路径/admin/。 - 基于 Django ORM 与
WeatherDataAnalysis完成多维统计分析,前端通过/api/chart/*等接口驱动 ECharts 渲染。 - 通过
spider/获取气象数据.py调用 NASA POWER,结合/spider/页面完成状态查看、异步爬取与 CSV 导入;支持 CSV/Excel 导出。 - 输出可运行、可演示的完整系统,默认前台账号
123456/123456、后台admin/admin123,便于验收与二次扩展。
1.2.2 研究意义
理论意义:将 Web 开发、气象公开数据接入与可视化方法结合到统一课题中,形成「采集脚本—ORM 模型—图表 API」的可复用范式,有助于理解点数据接口参数映射、缺失值清洗与描述性统计在教学场景中的适用边界。
实践意义:系统把全国约 333 个城市坐标、CSV 中间文件与 MySQL 持久化分层管理,降低手工处理成本;分析页按要素拆分路由,便于逐模块讲解;预警阈值与预测公式代码可读,便于核对结果。
社会意义:可视化结果有助于直观认识区域温度差异、降水强弱与季节变化结构,提升学生对公开气象数据可用性的认识。
经济意义:本地化部署与开源技术栈降低课题演示成本;模块化视图与路由设计便于后续替换数据源或扩展指标,减少重复开发投入。
1.3 课题的国内外研究现状和发展动态
1.3.1 国外研究现状
国外在再分析资料、卫星反演与开放气象 API 方面积累较早。NASA POWER 面向可再生能源与农业气象等社区提供全球网格点参数,支持按经纬度与日期区间拉取 JSON。可视化方面,ECharts、D3.js 等库被广泛用于交互式统计图与地理可视化。时间序列预测领域常见移动平均、ARIMA 与深度学习模型;本课题在教学场景下选用可解释的移动平均加线性趋势外推,避免把黑盒深度模型写成已实现功能。
1.3.2 国内研究现状
国内气象信息化与高校毕设中常见 Django + ECharts 的可视化系统,主题涵盖城市空气质量、降水统计与区域气候对比等。部分系统侧重大屏态势,部分侧重后台 CRUD。本课题更强调「六大功能模块 + 图表 API + NASA POWER 脚本采集 + SimpleUI 后台」,并以 MySQL 持久化气象观测,兼顾可解释统计与可复现部署;不单独实现全屏数据大屏路由。
1.3.3 发展趋势
未来气象数据分析将更强调多源融合、实时接入与可解释预测。可视化从静态报表走向可筛选、可下钻的交互分析;后端则更注重索引、分页与缓存。对本系统而言,后续可扩展国内实时接口或更精细网格,但仍应保持教学场景下结构清晰、部署简单的特点。
1.4 研究内容
本课题主要研究内容如下:
- 数据采集与入库:设计面向 NASA POWER 的爬虫脚本,内置约 333 城市坐标,支持命令行参数与页面异步触发,CSV 去重后批量写入
weather_data。 - 用户与权限:实现自建用户表注册登录、会话保持与中间件拦截;后台管理员与前台用户分离。
- 数据管理:实现气象列表分页、城市/日期/温度区间筛选、详情与历史趋势展示。
- 多维分析:实现城市、温度、湿度、辐射、风力、降水、综合、季节等分析页及对应图表 API。
- 空间与矩阵可视化:实现中国地图要素展示与城市—时间热力矩阵。
- 对比、预警与预测:实现多城市对比、阈值预警列表与移动平均趋势外推。
- 导出与后台:实现 CSV/Excel 导出与 SimpleUI 对用户、气象数据、城市信息的维护。
1.5 论文结构安排
第 1 章绪论,说明背景、目的意义、研究现状与研究内容。第 2 章介绍 Python、Django、MySQL、ECharts、NASA POWER 及相关技术特色。第 3 章给出系统架构、数据流、六大模块详细设计与数据库关系。第 4 章按模块说明实现流程、核心代码、访问路径与界面效果。第 5 章给出功能测试用例与性能测试分析。第 6 章总结工作并展望后续方向。文末附参考文献与致谢。
2 相关技术
2.1 Python编程语言
Python 具备清晰语法与丰富第三方库,适合 Web 后端、数据处理与网络请求。本系统使用 Python 3.11 环境,依赖 requirements.txt 中的 Django 3.2.25、pandas、numpy、requests、Pillow、django-simpleui、mysqlclient、PyMySQL 等。爬虫脚本用 requests 会话复用与线程池并发拉取;导入与分析侧用 pandas 读 CSV、Django ORM 做聚合。
2.1.1 数据处理与脚本组织
项目将采集逻辑独立于 spider/获取气象数据.py,与业务视图 app/views_weather.py、分析类 app/weather_data_analysis.py 解耦。脚本支持 -s/-e/-w 等命令行参数,页面通过子进程异步调用,避免阻塞 HTTP 请求线程过久。
2.1.2 与 Django 的协作方式
业务入口为 manage.py,配置集中在 weather_system/settings.py。视图层负责页面渲染与 JSON API,模型层映射 MySQL 表,模板层使用 NiceAdmin/Bootstrap 布局。Python 标准库中的 csv、threading、subprocess 分别用于导出、异步爬虫与进程调用。
2.2 Django Web框架
Django 采用 MTV(Model-Template-View)组织方式。本系统 Django 版本为 3.2(requirements.txt 锁定 3.2.25),应用名为 app,根路由在 weather_system/urls.py 挂载 admin/ 与 app.urls。
2.2.1 MTV模式与路由组织
模型定义于 app/models.py;页面与 API 集中在 views_weather.py;模板分布在 templates/ 与 app/templates/。app/urls.py 按认证、列表详情、分析页、导出、预警、地图、对比、图表 API、爬虫等分组注册路径,命名空间为 app。
2.2.2 SimpleUI后台管理
INSTALLED_APPS 将 simpleui 置于 django.contrib.admin 之前,配置 SIMPLEUI_HOME_TITLE 等为「气象数据后台管理」。app/admin.py 注册 User、WeatherData、CityInfo,支持列表展示、筛选、搜索与字段分组编辑。
2.3 MySQL数据库
业务库名为 weather_system,连接配置于 settings.py(默认 localhost:3306,用户 root)。引擎为 django.db.backends.mysql,字符集 utf8mb4。
2.3.1 ORM与索引设计
WeatherData 对 city、date 建索引,并设置 unique_together = ('city', 'date'),保证同一城市同一天仅一条记录。列表与分析大量使用 filter、annotate、aggregate 与分页 Paginator。
2.3.2 驱动与会话存储
依赖中同时声明 mysqlclient 与 PyMySQL,满足 Windows 本地连接需求。会话引擎为数据库后端 django.contrib.sessions.backends.db,SESSION_COOKIE_AGE 为 7 天;前台登录态以 session['username']、session['user_id'] 标识。
2.4 ECharts可视化技术
前台分析页通过 AJAX 请求 /api/chart/temperature/、/api/chart/heatmap/、/api/map/ 等接口获取 JSON,再用 ECharts 渲染折线、柱状、饼图、热力图与地图系列。地图页结合中国地图 geo 组件展示各城市温度、湿度、降水、风速等;热力图以城市为纵轴、日期或月份为横轴构建矩阵。图表交互(图例切换、缩放、提示框)由 ECharts 默认能力提供,业务侧专注数据组装。
2.5 NASA POWER数据接口
NASA POWER(Prediction Of Worldwide Energy Resources)提供全球点位逐日气象与辐射参数。本系统爬虫调用:
https://power.larc.nasa.gov/api/temporal/daily/point
社区参数 community=RE,按经纬度与起止日期(YYYYMMDD)请求 JSON。主要参数包括:T2M / T2M_MAX / T2M_MIN / T2MDEW、RH2M / QV2M、ALLSKY_SFC_SW_DWN / CLRSKY_SFC_SW_DWN / ALLSKY_SFC_LW_DWN / ALLSKY_SFC_PAR_TOT、WS2M / WS10M / WS50M、PS、PRECTOTCORR。脚本将 -999 缺失标记清洗为 None,并写日志到 spider/气象数据获取.log。全局限流约每秒 2 次请求,配合线程池与 Session 复用,降低封禁风险。
2.6 技术特色与创新点
算法方面:预警采用明确温度、降水、风速阈值分级;趋势预测采用 7 日移动平均与近期斜率外推,公式透明,不虚构 LSTM。季节分析按月份映射春夏秋冬后做聚合对比。
数据处理方面:爬虫坐标字典内置约 333 城;CSV 按城市+日期去重后入库;列表与导出支持城市、日期、温度区间筛选。
可视化特色:要素分析页拆分清晰;地图与热力图互补展示空间分布与时空矩阵;综合分析 API 一次组装多类 KPI 与排行。
架构优势:自定义 AuthMiddleware 统一鉴权豁免;分析类 WeatherDataAnalysis 封装基础统计;后台 SimpleUI 与前台 NiceAdmin 分工明确。
体验方面:Bootstrap 响应式侧栏覆盖数据概览、列表、各分析、地图热力、对比预警预测、爬虫与个人中心;课题演示以 8030 端口本地运行为准。
3 系统分析与设计
3.1 系统总体设计
3.1.1 系统架构设计
系统采用经典三层 B/S 结构:表现层为登录注册页、数据概览首页、气象列表详情、各分析模板、地图热力图、对比预警预测页、爬虫页与 SimpleUI 后台;业务层包含会话认证、ORM 查询聚合、预警阈值判定、移动平均预测、爬虫调度与导出;数据层为 MySQL weather_system 库及 spider/ 下 CSV/日志。浏览器通过 HTTP 访问 8030 端口,Django 处理页面与 API,统计计算在服务端完成后以 JSON 驱动 ECharts 渲染。系统不包含独立全屏数据大屏。
图3.1 系统架构图
3.1.2 系统数据流设计
从外部看,前台用户提交账号口令进入系统,管理员通过后台维护记录,NASA POWER 向爬虫脚本提供原始 JSON。系统内部完成鉴权、查询过滤、统计聚合、图表输出、预警生成、预测外推与入库。
图3.2 顶层数据流图
图3.3 0层数据流图
3.1.3 系统功能模块设计
结合侧栏实际菜单与路由划分,系统功能划分为六大模块:(1)用户认证;(2)气象数据管理;(3)多维数据分析;(4)地图与热力图;(5)对比、预警与趋势预测;(6)爬虫、导出与后台。各模块对应独立页面路由与 JSON API;个人信息维护挂载于认证模块延伸功能。WeatherFavorite 模型保留但未挂路由,不计入已上线功能。
图3.4 系统功能结构图
3.2 系统详细设计
3.2.1 用户认证模块设计
模块负责前台注册、登录、退出及会话保持,以及个人资料、头像与密码修改。用户信息存储于自定义 User 表(物理表 user);登录成功后将 username、user_id 写入 request.session。中间件 AuthMiddleware 对未登录访问重定向至 /login/,豁免 /login/、/register/、/admin/、/api/。前台演示账号为 123456/123456(明文密码校验);Django 内置后台管理员为 admin/admin123,与前台用户表分离。
3.2.1.1 用户认证流程设计
图3.5 用户认证模块流程图
3.2.2 气象数据管理模块设计
模块提供数据概览首页 /、气象列表 /weather/list/、详情 /weather/detail/<id>/ 与搜索 /weather/search/。列表支持城市、日期起止、平均温度区间与关键字筛选,每页 20 条;根据降水量与温度派生天气类型图标。详情页展示单条全字段,并附该城市此前最多 30 日历史记录。首页由 WeatherDataAnalysis.get_basic_statistics() 提供 KPI,并展示高温城市 TOP10 与最新观测。
3.2.2.1 气象数据管理流程设计
图3.6 气象数据管理模块流程图
3.2.3 多维数据分析模块设计
分析页路由包括 /analysis/city/、/analysis/temperature/、/analysis/humidity/、/analysis/radiation/、/analysis/wind/、/analysis/precipitation/、/analysis/overview/、/analysis/seasonal/。前端请求对应 /api/chart/* 获取序列与对比数据。温度等要素页可按城市筛选,取库内时间序列绘制折线,并做城市间对比;季节分析将月份映射为春夏秋冬后聚合;综合分析组装多要素 KPI、排行与概览表。服务端统计也可复用 WeatherDataAnalysis 中的分布区间方法。
3.2.3.1 多维数据分析流程设计
图3.7 多维数据分析模块流程图
3.2.4 地图与热力图模块设计
气象地图页 /map/ 调用 /api/map/,按指定日期或最新有效日期返回各城市平均温度、湿度、降水、10 米风速,供中国地图散点/视觉映射。热力图页 /analysis/heatmap/ 调用 /api/chart/heatmap/,支持要素 avg_temp/humidity/precipitation/wind_speed_10m;可选年份+月份按「城市×日」矩阵,或仅年份按「城市×月」均值矩阵。
3.2.4.1 地图与热力图流程设计
图3.8 地图与热力图模块流程图
3.2.5 对比预警与趋势预测模块设计
数据对比页 /compare/ 通过 /api/compare/ 最多对比 10 个城市,要素类型含温度、湿度、风速、降水,可按日期区间截取最多 365 点。天气预警页 /warning/ 通过 /api/warning/ 扫描高温(最高温≥35℃)、低温(最低温≤-10℃)、暴雨(降水≥50mm)、大风(10 米风速≥10.8m/s)记录并分级,返回最近 50 条及计数统计。趋势预测页 /analysis/prediction/ 通过 /api/chart/prediction/ 取最近约 60 日历史,计算窗口 min(7, n) 的移动平均,再按近 7 步斜率外推未来 days(默认 7)日;历史不足 10 条时返回错误提示。该预测不是 LSTM。
3.2.5.1 对比预警与预测流程设计
图3.9 对比预警与预测模块流程图
3.2.6 爬虫导出与后台模块设计
爬虫页 /spider/ 提供状态查询 /api/spider/status/(CSV 是否存在、记录数、城市数、日期范围、日志尾部)、异步启动 /api/spider/run/(参数起止日期、并发 workers、强制重爬)与导入 /api/spider/import/。导出接口 /export/csv/、/export/excel/ 按当前筛选写出气象字段。后台 /admin/ 基于 SimpleUI 维护前台用户、气象数据与城市信息;WeatherFavorite 未在 admin 注册为必需功能,亦不作为前台能力宣传。
3.2.6.1 爬虫导出与后台流程设计
图3.10 爬虫导出与后台模块流程图
3.3 数据库设计
3.3.1 数据库关系设计
系统业务库为 MySQL 中的 weather_system。核心实体为前台用户表 User(user)、气象数据表 WeatherData(weather_data)、城市信息表 CityInfo(city_info)。另有 WeatherFavorite(weather_favorite)以外键关联用户与气象数据,但前台路由未挂接,论文按未上线能力处理。登录态通过 Session 绑定用户;气象记录与城市信息通过城市名称逻辑关联;后台 Django 内置 auth_user 供管理员登录。
图3.11 数据库表关系图
表3.1 USER(前台用户 user)表结构
| 字段名称 | 字段类型 | 字段说明 | 是否主键 | 是否为空 |
|---|---|---|---|---|
| id | int | 唯一标识 | 是 | 否 |
| username | varchar(255) | 用户名(唯一) | 否 | 否 |
| password | varchar(255) | 密码(明文存储) | 否 | 否 |
| sex | varchar(255) | 性别 | 否 | 是 |
| address | varchar(255) | 地址 | 否 | 是 |
| avatar | 文件路径 | 头像 | 否 | 是 |
| textarea | varchar(255) | 个人简介 | 否 | 是 |
| createTime | datetime | 创建时间 | 否 | 否 |
表3.2 WEATHER_DATA(气象数据 weather_data)表结构
| 字段名称 | 字段类型 | 字段说明 | 是否主键 | 是否为空 |
|---|---|---|---|---|
| id | int | 唯一标识 | 是 | 否 |
| city | varchar(100) | 城市(索引) | 否 | 否 |
| date | date | 日期(索引) | 否 | 否 |
| avg_temp | float | 日均温度(°C) | 否 | 是 |
| max_temp | float | 最高温度(°C) | 否 | 是 |
| min_temp | float | 最低温度(°C) | 否 | 是 |
| dew_point | float | 露点温度(°C) | 否 | 是 |
| humidity | float | 相对湿度(%) | 否 | 是 |
| specific_humidity | float | 比湿(kg/kg) | 否 | 是 |
| allsky_solar_radiation | float | 全天空短波辐射 | 否 | 是 |
| clearsky_solar_radiation | float | 晴空短波辐射 | 否 | 是 |
| allsky_longwave_radiation | float | 全天空长波辐射 | 否 | 是 |
| par_radiation | float | 光合有效辐射 | 否 | 是 |
| wind_speed_2m | float | 2米风速(m/s) | 否 | 是 |
| wind_speed_10m | float | 10米风速(m/s) | 否 | 是 |
| wind_speed_50m | float | 50米风速(m/s) | 否 | 是 |
| surface_pressure | float | 地表气压(kPa) | 否 | 是 |
| precipitation | float | 降水量(mm) | 否 | 是 |
| create_time | datetime | 创建时间 | 否 | 否 |
| update_time | datetime | 更新时间 | 否 | 否 |
说明:(city, date) 唯一约束。
表3.3 CITY_INFO(城市信息 city_info)表结构
| 字段名称 | 字段类型 | 字段说明 | 是否主键 | 是否为空 |
|---|---|---|---|---|
| id | int | 唯一标识 | 是 | 否 |
| city_name | varchar(100) | 城市名称(唯一) | 否 | 否 |
| province | varchar(100) | 所属省份 | 否 | 是 |
| latitude | float | 纬度 | 否 | 是 |
| longitude | float | 经度 | 否 | 是 |
| city_type | varchar(50) | 城市类型 | 否 | 是 |
| create_time | datetime | 创建时间 | 否 | 否 |
表3.4 WEATHER_FAVORITE(气象收藏 weather_favorite,未挂前台路由)表结构
| 字段名称 | 字段类型 | 字段说明 | 是否主键 | 是否为空 |
|---|---|---|---|---|
| id | int | 唯一标识 | 是 | 否 |
| user_id | int | 外键用户 | 否 | 否 |
| weather_data_id | int | 外键气象数据 | 否 | 是 |
| city | varchar(100) | 城市 | 否 | 是 |
| date | date | 日期 | 否 | 是 |
| created_time | datetime | 收藏时间 | 否 | 否 |
| notes | text | 备注 | 否 | 是 |
4 系统实现
4.0 系统整体实现流程
系统实现按「环境与库表 → SQL/爬虫入库 → 认证与首页 → 列表详情 → 多维图表 API → 地图热力 → 对比预警预测 → 爬虫导出后台 → 联调」推进。开发入口为 manage.py,配置库名 weather_system,导入 weather_system.sql 或经爬虫导入观测数据后,以 python manage.py runserver 8030 启动服务。
图4.0 系统整体实现流程图
4.1 用户认证模块的实现
用户认证实现于 app/views_weather.py。GET 请求渲染登录模板;POST 请求以明文用户名密码查询 User,成功则写入 Session 并跳转首页,失败则 errorResponse。注册校验空值、两次密码一致性与账号唯一性。AuthMiddleware 统一拦截未登录访问。个人中心支持资料、头像与密码修改。
功能实现流程设计
图4.1 用户认证模块实现流程图
核心代码实现
# 来源:app/views_weather.py — 前台登录
def login_view(request):
if request.method == 'GET':
return render(request, 'login.html')
elif request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
try:
user = User.objects.get(username=username, password=password)
request.session['username'] = username
request.session['user_id'] = user.id
return redirect('/')
except User.DoesNotExist:
return errorResponse(request, '用户名或密码错误')
# 来源:middleware/auth.py — 登录拦截与豁免
class AuthMiddleware(MiddlewareMixin):
def process_request(self, request):
exempt_paths = ['/login/', '/register/', '/admin/', '/api/']
for path in exempt_paths:
if request.path_info.startswith(path):
return None
if not request.session.get('username'):
return redirect('/login/')
return None
# 来源:app/urls.py — 认证相关路由(节选)
path('login/', views_weather.login_view, name='login'),
path('register/', views_weather.register_view, name='register'),
path('logout/', views_weather.logout_view, name='logout'),
path('personal/', views_weather.personal_view, name='personal'),
path('personal/update/', views_weather.personal_update, name='personal_update'),
path('personal/password/', views_weather.password_update, name='password_update'),
实现效果展示
访问路径:http://127.0.0.1:8030/login/(默认账号 123456 / 123456)
图4.7 用户登录界面

4.2 气象数据管理模块的实现
首页 index 聚合基础统计、高温城市与最近观测;列表 weather_list 组合筛选并分页;详情加载单条记录与历史趋势。天气类型由降水量与温度规则派生,用于列表卡片图标展示。
功能实现流程设计
图4.2 气象数据管理模块实现流程图
核心代码实现
# 来源:app/views_weather.py — 列表筛选与分页(节选)
def weather_list(request):
city = request.GET.get('city', '').strip()
date_start = request.GET.get('date_start', '').strip()
date_end = request.GET.get('date_end', '').strip()
temp_min = request.GET.get('temp_min', '').strip()
temp_max = request.GET.get('temp_max', '').strip()
queryset = WeatherData.objects.all()
if city:
queryset = queryset.filter(city=city)
if date_start:
queryset = queryset.filter(date__gte=date_start)
if date_end:
queryset = queryset.filter(date__lte=date_end)
if temp_min:
queryset = queryset.filter(avg_temp__gte=float(temp_min))
if temp_max:
queryset = queryset.filter(avg_temp__lte=float(temp_max))
paginator = Paginator(queryset.order_by('-date', 'city'), 20)
page_obj = paginator.get_page(request.GET.get('page', 1))
# ... 派生天气类型后渲染 weather_list.html ...
# 来源:app/weather_data_analysis.py — 基础统计
@staticmethod
def get_basic_statistics():
from .models import WeatherData
stats = WeatherData.objects.aggregate(
total_records=Count('id'),
total_cities=Count('city', distinct=True),
avg_temp=Avg('avg_temp'),
max_temp=Max('max_temp'),
min_temp=Min('min_temp'),
avg_humidity=Avg('humidity'),
)
return stats or {}
实现效果展示
访问路径:http://127.0.0.1:8030/(数据概览)、http://127.0.0.1:8030/weather/list/(气象数据)
图4.8 数据概览界面

图4.9 气象数据界面

4.3 多维数据分析模块的实现
各分析页视图负责渲染模板并注入城市下拉等上下文;图表数据由 api_chart_city、api_chart_temperature、api_chart_humidity、api_chart_radiation、api_chart_wind、api_chart_precipitation、api_chart_overview、api_chart_seasonal 返回。温度 API 支持按城市取时间序列,并汇总城市温度范围对比;季节 API 将 3–5 月映射春季、6–8 月夏季、9–11 月秋季、12–2 月冬季后聚合。
功能实现流程设计
图4.3 多维数据分析模块实现流程图
核心代码实现
# 来源:app/urls.py — 分析页与图表 API(节选)
path('analysis/city/', views_weather.city_analysis, name='city_analysis'),
path('analysis/temperature/', views_weather.temperature_analysis, name='temperature_analysis'),
path('analysis/humidity/', views_weather.humidity_analysis, name='humidity_analysis'),
path('analysis/radiation/', views_weather.radiation_analysis, name='radiation_analysis'),
path('analysis/wind/', views_weather.wind_analysis, name='wind_analysis'),
path('analysis/precipitation/', views_weather.precipitation_analysis, name='precipitation_analysis'),
path('analysis/overview/', views_weather.overview_analysis, name='overview_analysis'),
path('analysis/seasonal/', views_weather.seasonal_analysis, name='seasonal_analysis'),
path('api/chart/temperature/', views_weather.api_chart_temperature, name='api_chart_temperature'),
path('api/chart/seasonal/', views_weather.api_chart_seasonal, name='api_chart_seasonal'),
# 来源:app/models.py — 气象核心字段(节选)
class WeatherData(models.Model):
city = models.CharField('城市', max_length=100, default='', db_index=True)
date = models.DateField('日期', db_index=True)
avg_temp = models.FloatField('日均温度(°C)', null=True, blank=True)
max_temp = models.FloatField('最高温度(°C)', null=True, blank=True)
min_temp = models.FloatField('最低温度(°C)', null=True, blank=True)
humidity = models.FloatField('相对湿度(%)', null=True, blank=True)
precipitation = models.FloatField('降水量(mm)', null=True, blank=True)
class Meta:
db_table = 'weather_data'
unique_together = ('city', 'date')
实现效果展示
访问路径:http://127.0.0.1:8030/analysis/temperature/(温度分析为代表)
图4.10 温度分析界面

4.4 地图与热力图模块的实现
地图页注入日期范围与默认有效日期;api_weather_map 按日期返回城市要素列表。热力图 API 根据是否指定月份切换日矩阵或月均值矩阵,输出供 ECharts heatmap 使用的 [x, y, value] 三元组。
功能实现流程设计
图4.4 地图与热力图模块实现流程图
核心代码实现
# 来源:app/views_weather.py — 地图数据 API(节选)
@require_GET
def api_weather_map(request):
date_param = request.GET.get('date', '').strip()
# ... 解析日期或取最新有效日 ...
city_data = list(WeatherData.objects.filter(date=latest_valid_date).exclude(
avg_temp__isnull=True
).values('city', 'date', 'avg_temp', 'humidity', 'precipitation', 'wind_speed_10m'))
return JsonResponse({
'code': 0,
'city_data': city_data,
'total': len(city_data),
'date': str(latest_valid_date) if latest_valid_date else None
})
# 来源:app/views_weather.py — 热力图模式分支(节选)
valid_elements = ['avg_temp', 'humidity', 'precipitation', 'wind_speed_10m']
# 指定年月:城市×日矩阵 mode='day'
# 仅年份:按城市月份 Avg(element) 矩阵 mode='month'
heatmap_data.append([j, i, value])
实现效果展示
访问路径:http://127.0.0.1:8030/map/、http://127.0.0.1:8030/analysis/heatmap/
图4.11 气象地图界面

图4.12 热力图界面

4.5 对比预警与预测模块的实现
对比 API 按 cities[] 与 type 组装多序列;预警 API 四类阈值扫描后排序截断;预测 API 明确使用移动平均与线性外推,代码路径为 api_chart_prediction。
功能实现流程设计
图4.5 对比预警与预测模块实现流程图
核心代码实现
# 来源:app/views_weather.py — 趋势预测(移动平均+线性外推,非LSTM)
@require_GET
def api_chart_prediction(request):
city = request.GET.get('city', '').strip()
element = request.GET.get('element', 'avg_temp')
days = int(request.GET.get('days', 7))
# ... 取历史,不足10条则返回错误 ...
historical_data = all_data[-60:] if len(all_data) >= 60 else all_data
values = [d.get(element) or 0 for d in historical_data]
window = min(7, len(values))
# 计算移动平均 ma_values ...
last_ma = ma_values[-1]
trend = (ma_values[-1] - ma_values[-min(7, len(ma_values))]) / min(7, len(ma_values))
for i in range(1, days + 1):
pred_value = last_ma + trend * i
prediction_values.append(round(pred_value, 1))
# 来源:app/views_weather.py — 预警阈值(节选)
high_temp = WeatherData.objects.filter(max_temp__gte=35).order_by('-date')[:20]
low_temp = WeatherData.objects.filter(min_temp__lte=-10).order_by('-date')[:20]
heavy_rain = WeatherData.objects.filter(precipitation__gte=50).order_by('-date')[:20]
strong_wind = WeatherData.objects.filter(wind_speed_10m__gte=10.8).order_by('-date')[:20]
实现效果展示
访问路径:http://127.0.0.1:8030/analysis/prediction/、http://127.0.0.1:8030/warning/、http://127.0.0.1:8030/compare/
图4.13 趋势预测界面

图4.14 天气预警界面

图4.15 数据对比界面

4.6 爬虫导出与后台模块的实现
爬虫页调用状态/运行/导入三类 API;运行接口在后台线程执行 python spider/获取气象数据.py -s ... -e ... -w ...。导出视图流式写 CSV 或用 openpyxl/兼容方式写 Excel(项目以 pandas/响应头实现导出)。后台 admin.py 注册三模型并配置 list_display、筛选与 fieldsets。
功能实现流程设计
图4.6 爬虫导出与后台模块实现流程图
核心代码实现
# 来源:spider/获取气象数据.py — NASA POWER 请求(节选)
base_url = "https://power.larc.nasa.gov/api/temporal/daily/point"
parameters = [
"T2M", "T2M_MAX", "T2M_MIN", "T2MDEW",
"RH2M", "QV2M",
"ALLSKY_SFC_SW_DWN", "CLRSKY_SFC_SW_DWN",
"ALLSKY_SFC_LW_DWN", "ALLSKY_SFC_PAR_TOT",
"WS2M", "WS10M", "WS50M", "PS", "PRECTOTCORR",
]
params = {
"parameters": ",".join(parameters),
"community": "RE",
"longitude": lon,
"latitude": lat,
"start": start_date,
"end": end_date,
"format": "JSON",
}
# 来源:app/views_weather.py — 异步启动爬虫(节选)
def run_spider():
subprocess.run([
'python', spider_script,
'-s', start_date,
'-e', end_date,
'-w', str(workers)
], cwd=os.path.dirname(spider_script))
thread = threading.Thread(target=run_spider)
thread.daemon = True
thread.start()
# 来源:app/admin.py — 气象数据后台(节选)
@admin.register(WeatherData)
class WeatherDataAdmin(admin.ModelAdmin):
list_display = ['id', 'city', 'date', 'avg_temp', 'max_temp', 'min_temp',
'humidity', 'precipitation', 'wind_speed_10m']
list_filter = ['city', 'date']
search_fields = ['city']
date_hierarchy = 'date'
实现效果展示
访问路径:http://127.0.0.1:8030/spider/、http://127.0.0.1:8030/export/csv/、http://127.0.0.1:8030/admin/
图4.16 数据爬虫界面

图4.17 后台管理界面

4.7 用户界面实现
界面采用 Bootstrap 与 NiceAdmin 风格布局,侧栏按「数据概览 / 气象数据 / 城市分析 / 温度 / 湿度 / 辐射 / 风力 / 降水 / 综合 / 季节 / 数据对比 / 气象地图 / 热力图 / 趋势预测 / 天气预警 / 数据爬虫 / 个人中心」等分组。顶栏展示当前用户与退出入口。系统无独立全屏数据大屏;图表均嵌入常规内容页。
主要界面效果已在第 4.1~4.6 节各模块「实现效果展示」中给出:登录页、数据概览、气象数据列表、温度分析、气象地图、热力图、趋势预测、天气预警、数据对比、数据爬虫与 SimpleUI 后台。登录页提交成功后进入数据概览;列表支持城市/日期/温度筛选;地图与热力图展示空间与矩阵分布;预测为移动平均与线性外推;预警按阈值触发;后台维护前台用户、气象数据与城市信息。
4.8 系统集成与部署
部署步骤概要如下:
- 安装
requirements.txt依赖(Django 3.2.25、django-simpleui、pandas、numpy、requests、Pillow、mysqlclient、PyMySQL 等)。 - 创建 MySQL 库
weather_system(字符集建议 utf8mb4),并在weather_system/settings.py核对连接账号(默认 root / 123456,主机 localhost,端口 3306)。 - 导入项目根目录备份:
weather_system.sql(可在命令行执行mysql -uroot -p123456 weather_system < weather_system.sql)。 - 如需重新采集:运行
python spider/获取气象数据.py -s YYYYMMDD -e YYYYMMDD -w 5,或登录前台打开/spider/启动与导入。 - 启动服务:在项目根目录执行
python manage.py runserver 8030。 - 浏览器访问
http://127.0.0.1:8030/login/,前台账号123456/123456;后台http://127.0.0.1:8030/admin/,账号admin/admin123。
根 URL 将业务挂在应用路由下,静态与媒体资源在 DEBUG=True 时由 Django 开发服务器挂载。课题演示以 8030 端口本地运行为准。
5 系统测试
5.1 系统功能测试
测试环境:Windows 10,Python 3.11,Django 3.2,MySQL(库 weather_system),浏览器访问 http://127.0.0.1:8030。前台默认账号 123456/123456,后台 admin/admin123。
5.1.1 用户认证功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-A01 | 正确登录 | 库中存在 123456 | 打开 /login/,输入 123456/123456 提交 | 跳转 /,侧栏可见 | 通过 |
| TC-A02 | 错误密码 | 账号存在 | 输入错误密码提交 | 提示用户名或密码错误 | 通过 |
| TC-A03 | 注册新用户 | 用户名未占用 | /register/ 填写一致密码 | 注册成功并回到登录页 | 通过 |
| TC-A04 | 退出登录 | 已登录 | 执行 /logout/ | Session 清空,回到登录页 | 通过 |
| TC-A05 | 未登录拦截 | 无 Session | 直接访问 /weather/list/ | 重定向至 /login/ | 通过 |
| TC-A06 | 修改资料 | 已登录 | /personal/ 更新性别地址等 | 提示更新成功 | 通过 |
5.1.2 数据管理功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-B01 | 数据概览 | 库有气象数据 | 打开 / | KPI、高温 TOP、最新列表正常 | 通过 |
| TC-B02 | 列表分页 | 记录数>20 | 打开 /weather/list/ | 每页 20 条,可翻页 | 通过 |
| TC-B03 | 条件筛选 | 已登录 | 按城市与日期筛选 | 列表结果符合条件 | 通过 |
| TC-B04 | 温度区间 | 有 avg_temp | 设置 temp_min/temp_max | 仅显示区间内记录 | 通过 |
| TC-B05 | 详情查看 | 存在记录 id | 打开 /weather/detail/<id>/ | 字段完整,可见历史趋势 | 通过 |
| TC-B06 | 后台查看 | 管理员可进 Admin | 登录 /admin/ 打开气象数据 | 可检索城市与日期 | 通过 |
5.1.3 核心业务功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-C01 | 气象地图 | 有有效温度数据 | 打开 /map/ 请求 /api/map/ | 返回各城 city_data | 通过 |
| TC-C02 | 热力图 | 有年份数据 | 打开 /analysis/heatmap/ | 矩阵 data 非空 | 通过 |
| TC-C03 | 多城对比 | 至少 2 城有数据 | /compare/ 选择多城 | 对比曲线可渲染 | 通过 |
| TC-C04 | 天气预警 | 存在超阈值样本或空列表 | 打开 /warning/ | 返回 warnings 与 stats | 通过 |
| TC-C05 | 趋势预测 | 单城历史≥10 条 | /analysis/prediction/ 选城 | 返回 historical 与 prediction | 通过 |
| TC-C06 | 预测非深度学习 | 查看 API 实现 | 核对代码为 MA+趋势 | 无 LSTM 调用 | 通过 |
| TC-C07 | 收藏未上线 | 检查 urls.py | 搜索 favorite 路由 | 无收藏 path 挂接 | 通过 |
5.1.4 数据分析功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-D01 | 温度分析 | 有温度序列 | /analysis/temperature/ | 折线有数据 | 通过 |
| TC-D02 | 湿度分析 | 有湿度字段 | /api/chart/humidity/ | JSON code=0 | 通过 |
| TC-D03 | 辐射分析 | 有辐射字段 | /analysis/radiation/ | 图表可渲染 | 通过 |
| TC-D04 | 风力降水 | 有风速降水 | 打开对应分析页 | 序列与排行正常 | 通过 |
| TC-D05 | 综合分析 | 库有数据 | /analysis/overview/ | KPI 与排行返回 | 通过 |
| TC-D06 | 季节分析 | 跨月数据 | /api/chart/seasonal/ | 四季聚合结果 | 通过 |
| TC-D07 | 城市分析 | 多城数据 | /analysis/city/ | 城市统计表/图可见 | 通过 |
5.1.5 系统集成功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-E01 | 端口启动 | 依赖已安装 | runserver 8030 | 8030 可访问登录页 | 通过 |
| TC-E02 | SQL 导入 | 已建库 | 导入 weather_system.sql | 表与数据可用 | 通过 |
| TC-E03 | 爬虫状态 | spider 目录存在 | /api/spider/status/ | 返回 csv_exists 等字段 | 通过 |
| TC-E04 | CSV 导出 | 已登录有数据 | 访问 /export/csv/ | 下载气象 CSV | 通过 |
| TC-E05 | Excel 导出 | 已登录有数据 | 访问 /export/excel/ | 下载表格文件 | 通过 |
| TC-E06 | API 豁免 | 无 Session | 直接请求 /api/ 前缀接口 | 中间件不强制登录跳转 | 通过 |
| TC-E07 | 前后台共库 | 库有数据 | 前台城市数与后台对照 | 数量级一致 | 通过 |
5.1.6 用户界面功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-F01 | 侧栏导航 | 已登录 | 点击各分析菜单 | 对应页面激活高亮 | 通过 |
| TC-F02 | 登录页展示 | 服务已启动 | 打开 /login/ | 表单与标题正常 | 通过 |
| TC-F03 | 响应式布局 | 缩小窗口 | 浏览列表与分析页 | Bootstrap 布局自适应 | 通过 |
| TC-F04 | 图表容器 | 分析页有数据 | 打开温度/地图等页 | ECharts 容器有图 | 通过 |
| TC-F05 | 个人中心 | 已登录 | 打开 /personal/ | 可查看与修改资料 | 通过 |
| TC-F06 | 无独立大屏 | 检查路由 | 搜索 bigscreen 类路由 | 不存在全屏大屏页 | 通过 |
| TC-F07 | 后台皮肤 | 管理员登录 | 打开 /admin/ | SimpleUI 中文界面可用 | 通过 |
5.2 系统性能测试
5.2.1 响应时间性能分析
在教学演示数据规模下,登录页与静态资源加载通常较快;数据概览与列表首屏受聚合与分页影响,一般可在数秒内完成。带多段聚合的综合分析 API、地图全城点位与热力矩阵接口耗时相对更高,但仍满足本机答辩演示需求。预测接口仅对单城近 60 日序列做内存计算,开销较小。
5.2.2 并发性能测试
课题演示场景以单机少量并发为主。Session 认证与开发服务器适合本地验收;若并发显著增大,可改用生产级 WSGI/ASGI 与反向代理。当前实现满足课程验收与本机演示需求。
5.2.3 数据库性能测试
weather_data 上 city、date 索引及 (city, date) 唯一约束,有利于按城按日过滤与防重。列表分页 ORDER BY date, city LIMIT 20 可控制单次返回行数。全表聚合(如全局 AVG)在数据量增大时成本上升,可通过限定日期范围或预聚合优化。
5.2.4 性能优化措施
- 列表与搜索限制每页条数或结果上限,避免一次加载全表。
- 地图默认取单一有效日期的全城截面,而非全历史。
- 热力图按年/月聚合,减少前端渲染点数。
- 爬虫限流与 Session 复用,降低外部 API 失败率。
- 对比接口限制最多 10 城、每城最多 365 点。
- 预警各类结果先截断再合并排序,控制返回体大小。
6 总结与展望
6.1 总结
本文完成了基于 Python+Django 的全国气象数据可视化分析系统的设计与实现。系统以 Django 3.2 + SimpleUI 为 Web 框架,MySQL 库名 weather_system,服务端口 8030,入口 manage.py,前台 /login/(123456/123456),后台 /admin/(admin/admin123)。围绕 user、weather_data、city_info 等核心表(weather_favorite 模型存在但 urls 未挂接,不作为上线功能),按 6 大模块组织了用户认证、气象数据管理、多维数据分析、地图与热力图、对比预警与趋势预测、爬虫导出与后台。爬虫脚本内置约 333 个地级市坐标,数据来自 NASA POWER 逐日点接口;分析覆盖城市/温度/湿度/辐射/风力/降水/综合/季节;趋势预测为 7 日移动平均加线性趋势外推,非 LSTM;无独立全屏数据大屏。中间件豁免 /login/、/register/、/admin/、/api/。经功能测试,主要模块运行符合预期,能够支撑教学演示与课题分析。
从模块规模看,论文第 3、4 章按上述 6 个功能模块展开;侧栏路由包括 /、/weather/list/、/analysis/*、/map/、/compare/、/warning/、/spider/ 等,形成可复现的本地化气象可视化分析方案。
6.2 展望
后续可从以下方向继续完善:对接国内实时气象接口做增量更新;对密码改为哈希存储并细化角色权限;为高频聚合增加缓存;在保持可解释性的前提下引入更严谨的时间序列模型并明确误差评估;优化移动端地图交互;将开发服务器替换为 Nginx + uWSGI/Gunicorn 以提升并发能力。若产品化需要收藏能力,应补齐路由、权限校验与界面入口后再纳入功能说明。
参考文献
[1] Django Software Foundation. Django documentation (3.2.x)[EB/OL]. https://docs.djangoproject.com/, 2021.
[2] NASA Langley Research Center. POWER Data Access Viewer[EB/OL]. https://power.larc.nasa.gov/, 2024.
[3] 王珊, 萨师煊. 数据库系统概论[M]. 5版. 北京: 高等教育出版社, 2014.
[4] Apache ECharts. ECharts 官方文档[EB/OL]. https://echarts.apache.org/zh/index.html.
[5] McKinney W. Data Structures for Statistical Computing in Python[C]//Proceedings of the 9th Python in Science Conference, 2010.
[6] 李刚. 疯狂 Python 讲义[M]. 北京: 电子工业出版社, 2019.
[7] 张浩. 基于 Web 的数据可视化系统设计与实现[J]. 计算机应用与软件, 2020.
[8] Bootstrap Team. Bootstrap Documentation[EB/OL]. https://getbootstrap.com/.
[9] 周志华. 机器学习[M]. 北京: 清华大学出版社, 2016.
[10] MySQL AB. MySQL 8.0 Reference Manual[EB/OL]. https://dev.mysql.com/doc/refman/8.0/en/.
[11] 赵十七. Python网络数据采集与项目实战[M]. 北京: 电子工业出版社, 2023.
[12] 孙十二, 钱十三. Bootstrap响应式Web开发实战[M]. 北京: 人民邮电出版社, 2022.
[13] 伊诺克森托娃. Python数据分析[M]. 北京: 人民邮电出版社, 2020.
[14] 世界气象组织. 气候服务与数据应用报告[R]. 日内瓦, 2022.
[15] 刘十八. 数据可视化分析与应用[M]. 北京: 机械工业出版社, 2022.
致谢
在毕业设计完成之际,衷心感谢指导老师在选题、需求分析、系统设计与论文撰写过程中给予的耐心指导与严格要求。感谢同学在环境搭建、功能联调与界面体验反馈方面提供的帮助。感谢 NASA POWER 公开数据与开源社区提供的 Django、ECharts、pandas、SimpleUI 等相关技术与工具,使本系统能够顺利落地。也感谢家人一直以来的理解与支持。由于水平与时间有限,系统在密码安全存储、实时数据接入与预测精度评估等方面仍有改进空间,恳请各位老师批评指正。
更多推荐

所有评论(0)