Skip to content

一个基于 Python 和 Folium 的供应链风险数据可视化工具,能够从 Markdown 格式的风险评估报告中自动提取地缘政治风险(GDP)和自然灾害风险(NDP)数据,并生成交互式的全球风险地图。

Notifications You must be signed in to change notification settings

BossHUI/Supply-Chain-Risk-Visualization

Repository files navigation

供应链风险可视化工具

一个基于 Python 和 Folium 的供应链风险数据可视化工具,能够从 Markdown 格式的风险评估报告中自动提取地缘政治风险(GDP)和自然灾害风险(NDP)数据,并生成交互式的全球风险地图。

✨ 功能特性

  • 📊 自动数据提取:支持 LLM和正则表达式两种方式从报告中提取风险数据
  • 🗺️ 交互式地图:使用 Folium 生成专业的交互式风险地图
  • 🎯 多维度可视化
    • 地缘政治风险(GDP):以圆圈大小和颜色表示风险等级
    • 自然灾害风险(NDP):以图标标记表示不同灾种
  • 📈 风险概览面板:实时显示整体风险等级、GDP/NDP 综合概率、置信区间等关键指标
  • 🎨 UI 设计:现代化的界面设计,支持信息提示、折叠面板等功能

📋 目录结构

.
├── main.py                              # 主程序文件
├── research_assessment_manager_report.md # 风险报告示例
├── honda_risk_viz.html                  # 生成的交互式地图
├── coordinate_cache.json                 # 坐标缓存文件(自动生成)
├── README.md                            # 项目说明文档
└── .gitignore                           # Git 忽略文件

🚀 快速开始

环境要求

  • Python 3.8+
  • 依赖包:folium, pandas, openai, python-dotenv, requests

安装依赖

pip install folium pandas openai python-dotenv requests

配置 API 密钥(可选)

如果使用 LLM 提取数据,需要配置 DeepSeek API:

# Windows PowerShell
$env:DEEPSEEK_API_KEY="your-api-key-here"
$env:DEEPSEEK_API_BASE="https://api.deepseek.com"

# Linux/Mac
export DEEPSEEK_API_KEY="your-api-key-here"
export DEEPSEEK_API_BASE="https://api.deepseek.com"

使用方法

python main.py

默认情况下,程序会:

  1. 读取 research_assessment_manager_report.md 报告文件
  2. 使用 LLM 自动提取风险数据(如果配置了 API 密钥)
  3. 生成 honda_risk_viz.html 交互式地图文件

📖 报告格式要求

GDP(地缘政治中断概率)数据格式

报告应包含如下格式的表格:

| 关键供应国/地区 | 基准值(%) | 当前估算值(%) | 置信区间(95%) |
|------------------|-------------|------------------|------------------|
| 荷兰             | 3           | 12               | [10, 14]         |
| 中国             | 2           | 6                | [4, 8]           |

NDP(自然灾变综合概率)数据格式

报告应包含如下格式的表格:

| 灾种 | 独立概率(%) | 区域位置 | 贡献度(%) |
|------|----------------|----------|-------------|
| 地震 | 4.2            | 日本福岛(N32°4' E118°8') | 38%         |
| 台风 | 3.5            | 越南中部(N15° E108°) | 32%         |

坐标格式支持

  • 度分秒格式N32°4' E118°8' - 自动解析
  • 国家名称:自动使用预设的国家中心坐标,或通过地理编码API获取
  • 城市/地区名称:优先使用坐标修正表,未找到则通过地理编码API自动获取
  • 自动地理编码:对于未知地点,系统会自动调用 Nominatim API 获取坐标并缓存

🎨 可视化说明

地图标记

  • 国家边界高亮:有风险的国家会以半透明彩色区域高亮显示

    • 🟠 橙色:高风险国家(GDP>10%)
    • 🟡 黄色:中风险国家(5%<GDP≤10%)
    • 🔵 蓝色:低风险国家(GDP≤5%)
    • 使用实际的国家边界 GeoJSON 数据
  • 圆圈:表示地缘政治风险(GDP)

    • 🟠 橙色:高风险(>10%)
    • 🔵 蓝色:中低风险(≤10%)
    • 圆圈大小与风险值成正比
  • 图标标记:表示自然灾害风险(NDP)

    • 🔴 红色:地震风险
    • 🔵 蓝色:台风/洪水风险

风险等级

  • ER1 低:GDP<5% 且 NDP<7%
  • ER2 中:GDP 5-15% 或 NDP 7-20%
  • ER3 高:GDP>15% 且 NDP>20%

交互功能

  • 点击地图上的标记查看详细信息
  • 左侧面板显示风险概览和详细数据表格
  • 右侧面板显示图例和筛选说明
  • 支持面板折叠/展开

🔧 技术实现

数据提取方式

  1. LLM 提取(推荐)

    • 使用 DeepSeek API 进行语义化提取
    • 支持更灵活的报告格式
    • 自动识别坐标、风险值等关键信息
  2. 正则表达式提取(备用)

    • 基于预定义的正则模式
    • 不依赖外部 API
    • 适用于格式规范的报告

坐标处理

  • 自动解析度分秒格式坐标
  • 内置常用国家和城市的坐标映射
  • 支持坐标修正表(如日本福岛、越南中部等)

代码验证

核心函数验证

  1. geocode_location() 函数

    • ✅ 缓存检查逻辑正确
    • ✅ API请求参数正确
    • ✅ 错误处理完善
    • ✅ 缓存保存功能正常
  2. get_location_coord() 函数

    • ✅ 优先级顺序正确
    • ✅ 参数传递正确
    • ✅ 返回值格式正确
  3. RiskReportParser

    • ✅ 初始化参数支持 use_geocoding
    • extract_gdp_table() 已集成自动坐标获取
    • extract_ndp_table() 已集成自动坐标获取
  4. generate_map() 函数

    • ✅ LLM提取路径已集成
    • ✅ 正则表达式提取路径已集成
    • ✅ 参数支持 use_geocoding

🌍 坐标获取机制

系统支持多种坐标获取方式,按优先级自动选择:

  1. 坐标修正表:已知城市/地区的精确坐标(如日本福岛、越南中部等)
  2. 国家坐标字典:常用国家的中心点坐标(作为缓存和备用)
  3. 度分秒坐标解析:自动解析报告中的度分秒格式坐标(如 N32°4' E118°8'
  4. 地理编码API(推荐):使用 Nominatim(OpenStreetMap)自动获取未知地点的坐标
    • 支持中文地点名称
    • 自动缓存查询结果到 coordinate_cache.json
    • 避免重复查询,提高效率

功能实现验证

已实现的功能

  1. 地理编码API集成

    • 使用Nominatim(OpenStreetMap)API
    • 支持中文地点名称
    • 遵守API速率限制(每秒1次请求)
    • 自动处理错误和超时
  2. 坐标缓存机制

    • 自动保存到 coordinate_cache.json
    • 下次查询时自动使用缓存
    • 避免重复API调用
  3. 多级坐标获取策略

    • 优先级1:坐标修正表(精确坐标)
    • 优先级2:国家坐标字典(预设坐标)
    • 优先级3:度分秒坐标解析
    • 优先级4:地理编码API(自动获取)
  4. 全面集成

    • LLM提取方法已集成
    • 正则表达式提取方法已集成
    • 向后兼容所有现有功能

使用建议

首次使用

  1. 运行 python main.py 处理报告
  2. 系统会自动查询新地点的坐标
  3. 坐标会自动保存到缓存文件
  4. 可能需要一些时间(API速率限制)

后续使用

  1. 已缓存的地点会立即加载
  2. 只有新地点才会调用API
  3. 速度会明显提升

离线模式

如果需要禁用API(仅使用预设坐标):

generate_map("report.md", "output.html", use_llm=True, use_geocoding=False)

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📄TODO List

按重要性降序

  1. 测试系统功能/BUG,测试更多报告实例
  2. 设计接口,系统输入:markdown文件;系统输出:html文件
  3. 国家/风险坐标问题
    • ✅ 列表(静态)- 已实现国家坐标字典和坐标修正表
    • ✅ 随用随加(静态)- 坐标缓存自动保存
    • ✅ 大模型自动添加(动态,推荐)- 已实现地理编码API自动获取
  4. 前后端分离,减少代码冗余

About

一个基于 Python 和 Folium 的供应链风险数据可视化工具,能够从 Markdown 格式的风险评估报告中自动提取地缘政治风险(GDP)和自然灾害风险(NDP)数据,并生成交互式的全球风险地图。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published