基于Python的城市内涝积涝监测数据可视化分析系统
基于Python的城市内涝积涝监测数据可视化分析系统 毕业论文
毕业设计
一、项目名称:
基于Python的城市内涝积涝监测数据可视化分析系统
【摘要】
城市内涝是汛期公共安全与市政排水管理的重要议题。积水深度、小时降雨、预警等级等指标相互关联,但原始数据往往分散在气象接口、易涝点名录与水务监测平台中,存在口径不一、难以横向对比、缺少趋势研判等问题。本文设计并实现了基于 Python 与 Django 的城市内涝积涝监测数据可视化分析系统,面向教学与课题演示场景,将多源数据汇聚、清洗入库后,以交互式图表支撑汛情态势研判与结构分析。
系统采用 B/S 架构,后端基于 Django 3.1.14,管理端集成 SimpleUI;数据库使用 MySQL(库名waterlog);前台基于 Bootstrap 5 与 ECharts 5 完成可视化。业务数据以FloodRecord为核心,覆盖深圳市 40 个易涝测站、2024 年 5—9 月汛期小时级记录,总量约 2.4 万条,字段包含测站编码/名称、行政区/街道、经纬度、监测时间、水位、预警水位、小时/日降雨、预警等级及是否积水等。小时降雨来自 Open-Meteo Archive API 真实数据;积水水位基于真实降雨与点位排水敏感度估算(论文正文已说明,不代表水务局实测传感器读数)。数据采集通过scripts/fetch_flood_data.py生成 CSV,再经管理命令import_flood入库;系统未提供 Web 数据采集页,无独立大屏,无Flask 组件。分析层以 pandas、NumPy 聚合,采用 Spearman/Pearson 相关、IQR 异常检测,以及线性外推与滑动平均对水位进行示意性预测。系统入口为manage.py,默认运行端口8070;前台登录路径为/app/login/,后台为/admin/,默认账号分别为 admin/123456(前台app.User)与 admin/admin123(Django 后台)。侧栏涵盖数据总览、水位分析、降雨分析、行政区对比、预警分析、时序分析、相关性分析、水位预测、异常检测、数据列表/导出及个人信息维护等模块。utils 层封装waterlog_core、waterlog_charts、waterlog_constants,分析结果经 Bundle API 一次返回多图数据,本地内存缓存WATERLOG_CACHE_TTL=120秒。
测试与运行结果表明,系统能够完成登录鉴权、多维筛选分析、图表联动与 CSV 导出闭环,界面清晰、响应稳定,可为城市内涝监测课题研究与教学演示提供可用的可视化分析支撑。
【关键词】Django;城市内涝;数据可视化;ECharts;Spearman 相关
【Abstract】
Urban waterlogging is a critical issue for public safety and municipal drainage during flood seasons. Indicators such as water depth, hourly rainfall and warning grades are interrelated, yet raw data are often scattered across weather APIs, flood-prone site catalogs and water-authority platforms, which makes cross-site comparison and trend analysis difficult. This thesis designs and implements a Python- and Django-based urban waterlogging monitoring data visualization and analysis system for teaching and demonstration. Multi-source data are collected, cleaned and stored, then explored through interactive charts for situational awareness and structural analysis.
The system follows a B/S architecture. The backend is built with Django 3.1.14 and SimpleUI for administration; MySQL is used with database namewaterlog; the frontend adopts Bootstrap 5 and ECharts 5. The core entityFloodRecordcovers 40 monitoring stations in Shenzhen from May to September 2024 at hourly granularity (approximately 24,000 records), including station attributes, location, observation time, water level, warning threshold, rainfall, warning grade and flood flag. Hourly rainfall comes from the real Open-Meteo Archive API; water levels areestimatedfrom rainfall and site sensitivity (not official sensor readings). Data are produced byscripts/fetch_flood_data.pyand imported viaimport_flood; there is no web-based>
登录页采用水利监测主题背景与居中表单,用户输入账号密码后提交,成功进入数据总览首页。
4.2 数据总览模块的实现
数据总览页面由home视图渲染模板并注入服务端 KPI,前端再请求api_overview调用overview_bundle补全图表。overview_bundle对过滤后的查询集计算记录数、测站数、积水率、平均水位、最大小时降雨,并生成行政区积水柱图、预警饼图与抽样后的水位时序。
功能实现流程设计
图4.2 数据总览模块实现流程图
访问 /app/home/
home 视图注入 stats
请求 /app/api/overview/
cached_analysis_df
overview_bundle 聚合 KPI
组装柱图/饼图/时序
前端 ECharts 渲染
结束
核心代码实现
# 来源:app/utils/waterlog_charts.py — 总览汇总(节选) def overview_bundle(request): def build(): df = cached_analysis_df(request) if df.empty: return _empty_bundle() n = len(df) station_n = int(df["station_code"].nunique()) flood_rate = _num(df["is_flooded"].mean() * 100, 1) # ... 行政区积水柱图、预警饼图、水位时序 ... return _cache_bundle("overview", request, build)# 来源:app/api_views.py — 总览 API @require_GET def api_overview(request): return json_ok(overview_bundle(request))
实现效果展示
访问路径:http://127.0.0.1:8070/app/home/
图4.8 数据总览界面
首页展示 KPI 卡片、行政区积水次数柱图、预警等级饼图与全网平均水位时序,支持月份/行政区/预警等级筛选联动。
4.3 水位与降雨分析模块的实现
水位分析通过water_level_bundle输出分布直方、Top 测站均水位与分行政区箱线;降雨分析通过rain_bundle输出小时降雨与水位双轴时序及降雨—水位散点。页面路由分别为/app/water_level/与/app/rain/,对应module_water_level与module_rain视图。
功能实现流程设计
图4.3 水位与降雨分析模块实现流程图
水位
降雨
访问 water_level 或 rain
请求对应 bundle API
cached_analysis_df
模块分支
_hist_bins / box_by_district
hourly agg / scatter sample
json_ok 返回
分布/箱线/时序/散点渲染
核心代码实现
# 来源:app/views.py — 页面入口 def module_water_level(request): return _module_page(request, "modules/water_level.html") def module_rain(request): return _module_page(request, "modules/rain.html")
# 来源:app/urls.py — 水位/降雨路由与 API(节选) path("water_level/", views.module_water_level, name="module_water_level"), path("rain/", views.module_rain, name="module_rain"), path("api/water-level-bundle/", api_views.api_water_level_bundle, name="api_water_level_bundle"), path("api/rain-bundle/", api_views.api_rain_bundle, name="api_rain_bundle"),实现效果展示
访问路径:
水位分析:
http://127.0.0.1:8070/app/water_level/降雨分析:
http://127.0.0.1:8070/app/rain/
图4.9 水位分析界面
水位页展示积水深度频率分布、平均水位 Top 测站排行及分行政区箱线图,便于对比区域差异。
图4.10 降雨分析界面
降雨页展示小时降雨与水位联动时序及降雨—水位散点,用于观察雨峰与水位抬升关系。
4.4 行政区与预警分析模块的实现
行政区模块通过district_bundle按区分组聚合平均水位、降雨与积水率,并以测站经纬度生成空间散点。预警模块通过warning_bundle统计预警等级占比与各等级积水率。页面路由分别为/app/district/与/app/warning/。
功能实现流程设计
图4.4 行政区与预警分析模块实现流程图
行政区
预警
访问 district 或 warning
请求 district/warning bundle
cached_analysis_df
模块分支
groupby district + map_scatter
warn_share + flood_by_grade
返回 JSON
对比柱图/散点/饼图渲染
核心代码实现
# 来源:app/api_views.py — 行政区/预警 Bundle @require_GET def api_district_bundle(request): return _bundle(district_bundle, request) @require_GET def api_warning_bundle(request): return _bundle(warning_bundle, request)
# 来源:app/utils/waterlog_constants.py — 预警等级顺序 WARN_GRADES = ["正常", "蓝色预警", "黄色预警", "橙色预警", "红色预警"]
实现效果展示
访问路径:
行政区对比:
http://127.0.0.1:8070/app/district/预警分析:
http://127.0.0.1:8070/app/warning/
图4.11 行政区对比界面
行政区页展示各辖区平均水位、降雨与积水率对比柱图,以及测站经纬度散点,便于空间巡检。
图4.12 预警分析界面
预警页展示预警等级占比饼图与各等级积水率对比,用于检验预警结构与实际积水关联。
4.5 时序相关预测异常模块的实现
时序模块输出日均水位与星期×小时热力;相关模块优先 Spearman 矩阵;预测模块对小时均水位线性外推 24 小时并叠加滑动平均;异常模块以 IQR 标记离群水位。四页路由为/app/time_series/、/app/correlation/、/app/prediction/、/app/anomaly/。
功能实现流程设计
图4.5 时序相关预测异常模块实现流程图
时序
相关
预测
异常
访问时序/相关/预测/异常页
请求对应 bundle
cached_analysis_df
算法
pivot_table 热力
df.corr spearman/pearson
np.polyfit 外推24h + rolling MA
iqr_outliers 标记
json_ok
折线/热力/矩阵/标注图
核心代码实现
# 来源:app/utils/waterlog_core.py — IQR 异常检测 def iqr_outliers(values): arr = np.asarray(values, dtype=float) arr = arr[~np.isnan(arr)] if len(arr) < 4: return np.zeros(len(arr), dtype=bool), {} q1, q3 = np.percentile(arr, [25, 75]) iqr = q3 - q1 low, high = q1 - 1.5 * iqr, q3 + 1.5 * iqr mask = (arr < low) | (arr > high) return mask, {"q1": _num(q1), "q3": _num(q3), "iqr": _num(iqr), "low": _num(low), "high": _num(high)}# 来源:app/utils/waterlog_charts.py — 相关与预测(节选) method = "spearman" try: corr = sub.corr(method="spearman") except Exception: method = "pearson" corr = sub.corr(method="pearson") # 预测:coef = np.polyfit(x, y, 1),外推 horizon=24 小时
# 来源:app/urls.py — 时序/相关/预测/异常路由(节选) path("time_series/", views.module_time_series, name="module_time_series"), path("correlation/", views.module_correlation, name="module_correlation"), path("prediction/", views.module_prediction, name="module_prediction"), path("anomaly/", views.module_anomaly, name="module_anomaly"), path("api/correlation-bundle/", api_views.api_correlation_bundle, name="api_correlation_bundle"), path("api/prediction-bundle/", api_views.api_prediction_bundle, name="api_prediction_bundle"), path("api/anomaly-bundle/", api_views.api_anomaly_bundle, name="api_anomaly_bundle"),实现效果展示
访问路径:
时序分析:
http://127.0.0.1:8070/app/time_series/相关性分析:
http://127.0.0.1:8070/app/correlation/水位预测:
http://127.0.0.1:8070/app/prediction/异常检测:
http://127.0.0.1:8070/app/anomaly/
图4.13 时序分析界面
时序页展示日均水位折线与星期×小时热力矩阵,用于发现周内与日内易涝时段。
图4.14 相关性分析界面
相关页展示变量相关矩阵热力图及降雨—水位系数说明,强调相关不等于因果。
图4.15 水位预测界面
预测页对比历史水位、线性拟合、滑动平均与未来 24 小时外推曲线,并附算法说明卡片。
图4.16 异常检测界面
异常页在时序上标注 IQR 离群点,并列出异常样本表(测站、时间、水位、预警等级)。
4.6 列表导出与后台模块的实现
数据列表页对FloodRecord分页展示并统计列表 KPI;导出接口按筛选条件流式输出 CSV。后台通过 SimpleUI 管理监测记录,增删改后调用invalidate_waterlog_cache。数据初始化由脚本与管理命令完成,系统不提供 Web 数据采集页。
功能实现流程设计
图4.6 列表导出与后台模块实现流程图
是
否
访问 /app/flood_list/
filtered_queryset + Paginator
渲染分页表格与 list_stats
导出?
api_export iterator 写 CSV
继续浏览/筛选
访问 /admin/
FloodRecordAdmin CRUD
invalidate_waterlog_cache
fetch_flood_data.py
import_flood --truncate
约2.4万条入库
核心代码实现
# 来源:app/views.py — CSV 导出(节选) @require_GET def api_export(request): if not request.session.get("username"): return redirect("/app/login/") qs = filtered_queryset(request) buf = io.StringIO() buf.write("\ufeff") writer = csv.writer(buf) writer.writerow([field_label(f, with_unit=True) for f in EXPORT_FIELDS]) for row in qs.values_list(*EXPORT_FIELDS).iterator(chunk_size=2000): writer.writerow(row) resp = HttpResponse(buf.getvalue(), content_type="text/csv; charset=utf-8") resp["Content-Disposition"] = 'attachment; filename="waterlog_export.csv"' return resp# 来源:app/admin.py — 后台缓存失效 def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) invalidate_waterlog_cache()
# 来源:基于Django系统/settings.py — 数据库与缓存(节选) DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": os.environ.get("MYSQL_DATABASE", "waterlog"), ... } } WATERLOG_CACHE_TTL = 120实现效果展示
访问路径:
数据列表:
http://127.0.0.1:8070/app/flood_list/CSV 导出:
http://127.0.0.1:8070/app/api/export/后台管理:
http://127.0.0.1:8070/admin/(admin / admin123)
图4.17 数据列表界面
列表页分页展示监测记录,支持月份/行政区/预警等级筛选,并提供导出按钮与列表内统计摘要。
图4.18 后台管理界面
SimpleUI 后台提供内涝监测记录与前台用户的检索、筛选与维护,菜单分组清晰。
4.7 用户界面实现
界面采用 Bootstrap 5 布局,侧栏按“数据总览 / 水位与降雨 / 行政区与预警 / 时序相关预测异常 / 数据列表 / 个人信息”分组。主题样式由waterlog-theme.css统一,登录背景使用waterlog-bg.jpg。各分析页复用chart_base.html骨架与waterlog_pages.js请求 Bundle API,筛选条通过/app/api/options/获取行政区、月份与预警等级下拉。系统无独立大屏路由,所有可视化均在常规页面内完成;无 Flask 组件。
4.8 系统集成与部署
部署步骤概要如下:
安装
requirements.txt依赖(Django 3.1.14、django-simpleui、PyMySQL、pandas、numpy、scipy、pillow、requests 等)。创建 MySQL 库
waterlog,配置连接账号。执行
python manage.py migrate。执行
python scripts/fetch_flood_data.py生成waterlog_data.csv。执行
python manage.py import_flood --path waterlog_data.csv --truncate写入约 2.4 万条记录。python manage.py seed_admin初始化前台用户 admin/123456 与后台 admin/admin123。python manage.py runserver 8070。
根 URL 将空路径重定向到/app/login/,静态与媒体资源由 Django 开发服务器挂载。课题演示以8070端口本地运行为准。可选:配置SZ_OPENDATA_APPKEY后重新拉取以尝试官方真实水位。
5 系统测试
5.1 系统功能测试
测试环境:Windows 10,Python 3.11,Django 3.1.14,MySQL(库waterlog),浏览器访问http://127.0.0.1:8070。前台默认账号 admin/123456,后台 admin/admin123。
5.1.1 用户认证功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-A01 | 正确登录 | 库中存在 admin | 打开/app/login/,输入 admin/123456 提交 | 跳转/app/home/,侧栏可见 | 通过 |
| TC-A02 | 错误密码 | 账号存在 | 输入错误密码提交 | 提示用户名或密码错误 | 通过 |
| TC-A03 | 注册新用户 | 用户名未占用 | /app/register/填写一致密码 | 注册成功并回到登录页 | 通过 |
| TC-A04 | 退出登录 | 已登录 | 执行/app/logOut/ | Session 清空,回到登录页 | 通过 |
5.1.2 数据管理功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-B01 | 数据列表浏览 | 已导入样本 | 打开/app/flood_list/ | 分页展示内涝监测记录 | 通过 |
| TC-B02 | 后台查看记录 | 管理员可进 Admin | 登录/admin/打开内涝监测记录 | 可检索测站/行政区/时间等字段 | 通过 |
| TC-B03 | CSV 导出 | 已登录且有数据 | 在列表页点击导出或访问/app/api/export/ | 下载 UTF-8 BOM 的 CSV 文件 | 通过 |
| TC-B04 | 脚本入库 | CSV 已生成 | 执行import_flood --truncate | 约 2.4 万条写入 FloodRecord | 通过 |
5.1.3 核心业务功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-C01 | 数据总览 | 有监测数据 | 打开/app/home/ | KPI 与图表正常 | 通过 |
| TC-C02 | 水位分析 | 有水位字段 | 打开/app/water_level/ | 分布/Top/箱线图有数据 | 通过 |
| TC-C03 | 降雨分析 | 有降雨字段 | 打开/app/rain/ | 时序与散点可见 | 通过 |
| TC-C04 | 行政区对比 | 有多区数据 | 打开/app/district/ | 对比柱图与散点更新 | 通过 |
| TC-C05 | 预警分析 | 有预警等级 | 打开/app/warning/ | 占比与积水率对比可见 | 通过 |
5.1.4 数据分析功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-D01 | 时序热力 | 有时序数据 | /app/time_series/请求 bundle | 日均折线与热力矩阵返回 | 通过 |
| TC-D02 | 相关矩阵 | 样本足够 | /app/correlation/ | Spearman/Pearson 矩阵可渲染 | 通过 |
| TC-D03 | 水位预测 | 小时样本≥5 | /app/prediction/ | 历史+外推+滑动平均曲线可见 | 通过 |
| TC-D04 | 异常检测 | 水位样本≥4 | /app/anomaly/ | IQR 异常点标注与样本表可见 | 通过 |
5.1.5 系统集成功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-E01 | 根路径跳转 | 服务已启动 | 访问/ | 重定向到/app/login/ | 通过 |
| TC-E02 | API 前缀 | 已登录 | 请求/app/api/overview/等 | 返回 JSON ok 结构 | 通过 |
| TC-E03 | 筛选选项 | 库有数据 | 请求/app/api/options/ | 返回行政区/月份/预警等级 | 通过 |
| TC-E04 | 前后台共库 | 库有数据 | 前台总览记录数与后台对照 | 数量级一致(约2.4万) | 通过 |
| TC-E05 | 无 Web 采集页 | 路由已配置 | 访问/app/data_fetch/ | 无此业务页(404) | 通过 |
| TC-E06 | 无独立大屏 | 系统部署完成 | 访问/bigscreen | 无业务大屏页 | 通过 |
5.1.6 用户界面功能测试用例
| 编号 | 说明 | 条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| TC-F01 | 侧栏导航 | 已登录 | 点击各分析菜单 | 对应页面激活高亮 | 通过 |
| TC-F02 | 修改信息 | 已登录 | /app/changeSelfInfo/保存 | 信息更新成功 | 通过 |
| TC-F03 | 修改密码 | 已登录 | /app/changePassword/提交 | 新密码可登录 | 通过 |
| TC-F04 | 筛选联动 | 有数据 | 切换月份/行政区/预警等级 | 各页图表随筛选刷新 | 通过 |
5.2 系统性能测试
5.2.1 响应时间性能分析
在约 2.4 万条FloodRecord、40 个测站规模下,普通页面首屏一般可在 1~3 秒内完成;带聚合的 Bundle API 在缓存命中时响应更快。首次冷查询因聚合与 DataFrame 转换耗时相对更高,之后 120 秒缓存窗口内重复筛选可明显降耗。时序热力与相关矩阵 Bundle 缓存倍数设为 2×TTL,进一步减少重复计算。
5.2.2 并发性能测试
课题演示场景以单机少量并发为主。Session 认证与本地内存缓存在多用户同时筛选相近条件时能够复用结果;若并发显著增大,可考虑更换 Redis 等缓存后端。当前实现满足课程验收与本机演示需求。
5.2.3 数据库性能测试
针对observe_time+district、observe_time+warn_grade的组合索引,对月份与行政区过滤的Count/Avg/Max查询有帮助。列表导出使用iterator(chunk_size=2000)流式读库,避免一次性装入全部行。建议定期ANALYZE并避免无索引字段上的高基数字符串模糊查询。
5.2.4 性能优化措施
使用
cached_analysis_df与WATERLOG_CACHE_TTL=120降低重复计算。Bundle API 合并多图数据,减少 HTTP 往返。
sample_series对过长时序等距抽样,减轻前端渲染压力。后台增删改调用
invalidate_waterlog_cache递增版本号,避免脏读而非全库清缓存。导入阶段
--truncate后批量写入,缩短初始化时间。
6 总结与展望
6.1 总结
本文完成了基于 Python 的城市内涝积涝监测数据可视化分析系统的设计与实现。系统以 Django 3.1.14 + SimpleUI 为 Web 框架,MySQL 库名waterlog,服务端口8070,入口manage.py,前台/app/login/(admin/123456),后台/admin/(admin/admin123)。围绕User与FloodRecord两张核心表,按六大模块组织了用户认证、数据总览、水位与降雨分析、行政区与预警分析、时序相关预测异常、列表导出与后台;分析 API 提供 options/overview 及八个*-bundle接口。数据覆盖深圳市40个测站、2024 年 5—9 月汛期、约2.4 万条小时级记录;小时降雨来自 Open-Meteo真实数据,积水水位为基于降雨与点位敏感度的估算值(论文与界面均已说明)。数据采集通过scripts/fetch_flood_data.py与import_flood完成,无Web 采集页、无Flask、无独立大屏。分析采用 pandas/NumPy 聚合,Spearman/Pearson 相关、IQR 异常检测,以及线性外推与滑动平均示意预测;utils 层waterlog_core、waterlog_charts、waterlog_constants分层清晰,本地缓存 TTL 为 120 秒。前端以 ECharts 5 与 Bootstrap 5 呈现。经功能测试,主要模块运行符合预期,能够支撑教学演示与课题分析。
从模块规模看,论文第 3、4 章按上述6个功能模块展开;侧栏路由包括/app/home/、/app/water_level/、/app/rain/、/app/district/、/app/warning/、/app/time_series/、/app/correlation/、/app/prediction/、/app/anomaly/、/app/flood_list/等,形成可复现的本地化内涝可视化分析方案。
6.2 展望
后续可从以下方向继续完善:在深圳开放平台申请 appKey 后切换官方积涝水位,并与估算序列对照展示;引入更丰富的时间序列模型(如 ARIMA 或季节性分解)提升预测表达力;增加角色权限细分与操作审计;将脚本拉取接入定时任务或消息队列;在保持无独立大屏的前提下,优化移动端图表交互与地图底图集成;扩展更多测站与近实时降水接入,使分析更贴近业务巡检场景。
参考文献
[1] Django Software Foundation. Django documentation (3.1.x)[EB/OL]. Django documentation | Django documentation | Django, 2021.
[2] 伊诺克森托娃. Python数据分析[M]. 北京: 人民邮电出版社, 2020.
[3] 王珊, 萨师煊. 数据库系统概论[M]. 5版. 北京: 高等教育出版社, 2014.
[4] Apache ECharts. ECharts 官方文档[EB/OL]. Apache ECharts.
[5] McKinney W. Data Structures for Statistical Computing in Python[C]//Proceedings of the 9th Python in Science Conference, 2010.
[6] Open-Meteo. Historical Weather API Documentation[EB/OL]. 🌤️ Free Open-Source Weather API | Open-Meteo.com.
[7] 深圳市人民政府. 深圳市政府数据开放平台:市水务局积涝点水位接口[EB/OL]. 深圳市政府数据开放平台.
[8] 李刚. 疯狂 Python 讲义[M]. 北京: 电子工业出版社, 2019.
[9] 张浩. 基于 Web 的数据可视化系统设计与实现[J]. 计算机应用与软件, 2020.
[10] Bootstrap Team. Bootstrap 5 Documentation[EB/OL]. https://getbootstrap.com/docs/5.0/getting-started/introduction/.
[11] 周志华. 机器学习[M]. 北京: 清华大学出版社, 2016.
[12] Spearman C. The Proof and Measurement of Association between Two Things[J]. American Journal of Psychology, 1904, 15(1): 72-101.
致谢
在毕业设计完成之际,衷心感谢指导老师在选题、需求分析、系统设计与论文撰写过程中给予的耐心指导与严格要求。感谢同学在环境搭建、功能联调与界面体验反馈方面提供的帮助。感谢开源社区提供的 Django、ECharts、pandas、Open-Meteo 等相关技术与数据接口,使本系统能够顺利落地。也感谢家人一直以来的理解与支持。由于水平与时间有限,系统中水位估算与示意性预测仍有改进空间,恳请各位老师批评指正。
