diff --git a/upload_app/process_parquet_README.md b/upload_app/process_parquet_README.md new file mode 100644 index 0000000..ab8ee74 --- /dev/null +++ b/upload_app/process_parquet_README.md @@ -0,0 +1,146 @@ +# Parquet数据处理与Excel导出脚本 + +## 功能说明 + +本脚本用于处理铁路项目中的parquet数据文件,将其转换为Excel报表。 + +### 主要功能 +1. 读取data目录下所有parquet文件(按文件夹分组) +2. 关联5种类型数据:断面、观测点、沉降、水准、原始数据 +3. 以水准数据为主体整理并生成Excel报表 + +### 输出列 +- **日期**:水准数据时间(格式:YYYY-MM-DD) +- **水准线路**:linecode +- **起始点**:benchmarkids拆分后的起始点 +- **终止点**:benchmarkids拆分后的终止点 +- **测点**:同一水准线路的所有观测点ID(逗号分隔) +- **起始时间**:原始数据mtime最早时间 +- **终止时间**:原始数据mtime最晚时间 +- **类型**:断面数据的work_site字段 + +## 目录结构 + +``` +data/ + ├── 川藏13B标二分部/ + │ ├── 沉降数据表/ + │ │ └── settlement_*.parquet + │ ├── 断面数据表/ + │ │ └── section_*.parquet + │ ├── 观测点数据表/ + │ │ └── point_*.parquet + │ └── 水准数据表/ + │ └── level_*.parquet + ├── 川藏13B标一分部/ + │ └── ... + └── ... +``` + +## 使用方法 + +### 1. 安装依赖 +```bash +pip install pandas numpy openpyxl +``` + +### 2. 运行脚本 +```bash +python process_parquet_to_excel.py +``` + +### 3. 查看结果 +脚本运行完成后,在output目录中查看生成的Excel文件: +- 川藏13B标二分部_水准数据报表.xlsx +- 川藏13B标一分部_水准数据报表.xlsx +- ... + +## 配置说明 + +可在脚本顶部修改以下配置: + +```python +# 数据根目录 +DATA_ROOT = "./data" + +# 输出目录 +OUTPUT_DIR = "./output" +``` + +## 数据关联逻辑 + +``` +断面数据(sections) + → 观测点数据(checkpoints) via section_id + → 沉降数据(settlements) via point_id + → 水准数据(levels) via NYID + → 原始数据(originals) via NYID +``` + +## 特性 + +- ✅ 支持两层目录结构(主文件夹/中文子文件夹/parquet文件) +- ✅ 自动过滤空文件(<1KB) +- ✅ 断点续传支持(可扩展) +- ✅ 详细的日志输出 +- ✅ 进度显示 +- ✅ 容错处理(缺失字段、缺失数据等) +- ✅ 数据类型动态检查 + +## 注意事项 + +1. **原始数据**:如果某个数据集没有原始数据表,时间范围将使用水准数据的createDate作为默认值 +2. **benchmarkids字段**:如果水准数据中不存在benchmarkids字段,起始点和终止点将为空 +3. **数据关联**:如果某个水准数据找不到对应的沉降数据,将跳过该记录 +4. **文件大小**:自动过滤小于1KB的空parquet文件 + +## 日志说明 + +脚本运行时会输出详细日志,包括: +- 扫描到的文件数量 +- 每种类型的数据记录数 +- 处理进度 +- 警告和错误信息 +- 最终的统计信息 + +## 版本历史 + +- v1.2 (2025-11-08) + - 🔧 彻底修复:numpy array布尔值判断错误根本原因 + - 修复 `find_mtime_range` 函数中的 `not nyids` 问题 + - 添加全面的 DataFrame 类型检查 + - 使用 `.size` 正确处理 numpy array + - ✨ 新增:全面的防御性编程 + - 多层类型验证(isinstance 检查) + - DataFrame/Series 安全检查 + - 防御性错误处理 + - 🛡️ 增强:代码健壮性 + - 防止各种边界情况 + - 安全的 numpy array 操作 + - 防止空值和类型错误 + - ✨ 新增:NYID期数ID重复检查 + - 自动检测水准数据中的重复NYID + - 详细列出每个重复的NYID及其出现次数 + - 全局汇总所有数据集的重复情况 + - 计算额外重复记录数 + - 📝 改进:详细的修复文档和最佳实践 + +- v1.1 (2025-11-08) + - 🔧 修复:numpy array布尔值判断错误(The truth value of an array...) + - ✨ 新增:数据质量检验机制 + - 预期记录数 vs 实际记录数对比 + - 自动检测数据丢失或处理异常 + - 详细的数据质量报告 + - ✨ 新增:全局数据质量统计 + - 每个文件夹的记录数统计 + - 总计记录数显示 + - ✨ 新增:增强错误处理 + - 详细的错误堆栈跟踪 + - 针对常见错误的智能提示 + - 📝 改进:更详细的中文错误提示 + +- v1.0 (2025-11-08) + - 初始版本 + - 支持5种数据类型关联 + - 支持Excel导出 + - 支持两层目录结构 diff --git a/upload_app/使用指南.md b/upload_app/使用指南.md new file mode 100644 index 0000000..58b6fd9 --- /dev/null +++ b/upload_app/使用指南.md @@ -0,0 +1,201 @@ +# Parquet数据处理脚本 - 使用指南 + +## 快速开始 + +### 1. 安装依赖 +```bash +pip install pandas numpy openpyxl +``` + +### 2. 运行脚本 +```bash +python process_parquet_to_excel.py +``` + +### 3. 查看结果 +输出目录:`./output/` +- 川藏13B标二分部_水准数据报表.xlsx +- 川藏13B标一分部_水准数据报表.xlsx +- ... + +## 新版本 v1.1 特性 + +### ✅ 修复了之前的错误 +- 修复了 "The truth value of an array..." 错误 +- 改进了numpy array的处理方式 + +### ✅ 数据质量检验 +脚本现在会自动验证数据完整性: +- 对比预期记录数与实际记录数 +- 如果不一致,提供详细分析 +- 帮助快速发现数据问题 + +**示例输出:** +``` +✅ 数据质量检验通过:实际记录数(150) = 预期记录数(150) +``` + +### ✅ 增强的错误提示 +- 详细的错误堆栈跟踪 +- 智能错误分析 +- 更好的中文提示 + +### ✅ NYID期数ID重复检查 +- 自动检测水准数据中的重复NYID +- 详细列出重复的NYID及其出现次数 +- 全局汇总所有数据集的重复情况 +- 计算额外重复记录数 + +**示例输出:** +``` +检查NYID期数ID重复... + +⚠️ 发现 2 个重复的NYID: + NYID=1308900 出现 2 次 + NYID=1317148 出现 3 次 +``` + +### ✅ 全局统计报告 +``` +全局数据质量统计 +============================================================ +川藏13B标二分部: 150 条记录 +川藏13B标一分部: 120 条记录 +川藏14B标二分部: 200 条记录 +川藏14B标三分部: 180 条记录 +川藏14B标一分部: 160 条记录 + +总计: 810 条记录 +============================================================ +``` + +## 如何验证数据完整性 + +### 方法1:查看质量检验结果 +脚本运行时会显示: +``` +预期生成记录数: 200 +数据质量检验:最终记录数应等于此数字 +... +✅ 数据质量检验通过:实际记录数(200) = 预期记录数(200) +``` + +如果看到 ⚠️ 警告,说明有数据丢失,需要检查。 + +### 方法2:手动验证 +1. 统计水准数据文件中的记录总数 +2. 对比Excel文件中的记录数 +3. 理论上应该相等(每条水准数据对应一条Excel记录) + +### 方法3:检查日志 +寻找以下警告: +- "NYID=xxx 无对应沉降数据" - 说明数据关联链断裂 +- "处理水准数据时出错" - 说明处理过程中出现异常 + +### 方法4:检查NYID重复 +脚本会自动检查NYID期数ID是否重复: +``` +检查NYID期数ID重复... + +✅ 未发现重复的NYID +``` +或 +``` +⚠️ 发现 2 个重复的NYID: + NYID=1308900 出现 2 次 + NYID=1317148 出现 3 次 +``` + +如果在"NYID期数ID重复汇总"中看到重复记录,需要检查数据质量。 + +## 输出文件说明 + +每个Excel文件包含8列: +- **日期**:水准数据时间(YYYY-MM-DD) +- **水准线路**:linecode +- **起始点**:benchmarkids拆分(如果存在) +- **终止点**:benchmarkids拆分(如果存在) +- **测点**:同一水准线路的所有观测点ID +- **起始时间**:原始数据mtime最早时间 +- **终止时间**:原始数据mtime最晚时间 +- **类型**:断面数据的work_site + +## 常见问题 + +### Q: 出现数据质量警告怎么办? +A: 查看脚本输出的"可能原因"部分,通常是因为: +- 某些水准数据没有对应的沉降数据 +- 数据文件损坏或不完整 +- 数据关联链有问题 + +### Q: 起始点和终止点为空怎么办? +A: 这说明水准数据中不存在benchmarkids字段,属于正常情况。脚本会显示: +``` +注意: 未发现benchmarkids字段,起始点/终止点将为空 +``` + +### Q: 时间范围显示默认值怎么办? +A: 这说明该数据集没有原始数据表(原始数据表),脚本会使用水准数据时间作为默认值。 + +### Q: 如何查看详细的处理日志? +A: 脚本会自动输出详细日志,包括: +- 扫描到的文件数量 +- 读取的记录数 +- 处理进度 +- 错误和警告信息 + +## 目录结构要求 + +``` +data/ + ├── 川藏13B标二分部/ + │ ├── 沉降数据表/ + │ │ └── settlement_*.parquet + │ ├── 断面数据表/ + │ │ └── section_*.parquet + │ ├── 观测点数据表/ + │ │ └── point_*.parquet + │ └── 水准数据表/ + │ └── level_*.parquet + ├── 川藏13B标一分部/ + │ └── ... + └── ... +``` + +## 配置选项 + +在脚本顶部可以修改: +```python +# 数据根目录 +DATA_ROOT = "./data" + +# 输出目录 +OUTPUT_DIR = "./output" +``` + +## 技术支持 + +如有问题,请检查: +1. 所有parquet文件是否完整 +2. 数据目录结构是否正确 +3. 依赖包是否已正确安装 +4. 查看脚本输出的错误和警告信息 + +## 版本历史 + +- **v1.2** (2025-11-08) + - 彻底修复numpy array布尔值判断错误 + - 新增NYID期数ID重复检查功能 + - 新增全局重复NYID汇总 + - 增强数据质量检验 + - 增强防御性编程 + +- **v1.1** (2025-11-08) + - 修复numpy array布尔值错误 + - 新增数据质量检验机制 + - 新增全局统计报告 + - 增强错误处理和提示 + +- **v1.0** (2025-11-08) + - 初始版本 + - 基本的数据处理和Excel导出功能 diff --git a/upload_app/完整修复说明_v1.2.md b/upload_app/完整修复说明_v1.2.md new file mode 100644 index 0000000..19fbce5 --- /dev/null +++ b/upload_app/完整修复说明_v1.2.md @@ -0,0 +1,180 @@ +# 完整修复说明 - v1.2 + +## 错误根本原因 + +**错误信息:** +``` +错误: 处理水准数据时出错 - The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() +``` + +**根本原因:** +1. 在pandas中,对numpy array使用`not`操作符会触发"The truth value of an array"错误 +2. pandas的`.unique()`返回numpy array,不能直接用于布尔判断 + +## 修复详情 + +### 修复1: `find_mtime_range`函数(第198-200行) + +**问题代码:** +```python +if original_data.empty or not nyids: # 错误:not nyids 对numpy array无效 + return "", "" +``` + +**修复后:** +```python +# 修复:检查nyids的长度,而不是使用not(对numpy array无效) +if original_data.empty or nyids.size == 0: + return "", "" +``` + +**说明:** +- `nyids`是通过`level_df["NYID"].unique()`得到的numpy array +- 对numpy array使用`not`会触发错误 +- 使用`nyids.size == 0`检查数组是否为空 + +### 修复2: DataFrame类型检查(多个位置) + +**问题:** +在多个位置,直接对可能是numpy array或DataFrame的对象进行布尔判断 + +**修复方法:** +在所有关键位置添加`isinstance()`检查,确保对象是预期的类型 + +**示例1: related_settlements检查(第301行)** +```python +# 防御性检查:确保related_settlements是DataFrame +if isinstance(related_settlements, pd.DataFrame) and related_settlements.empty: + print(f" 警告: NYID={nyid} 无对应沉降数据") + continue +``` + +**示例2: checkpoint_df和section_df检查(第311-327行)** +```python +# 防御性检查:确保DataFrame存在且不为空 +if isinstance(checkpoint_df, pd.DataFrame) and isinstance(section_df, pd.DataFrame): + if not checkpoint_df.empty and not section_df.empty: + # 处理逻辑... +``` + +## 预防措施 + +### 1. 类型检查 +在操作DataFrame或Series之前,总是检查类型: +```python +if isinstance(obj, pd.DataFrame): + if not obj.empty: + # 安全操作 +``` + +### 2. Numpy array检查 +对于numpy array,不要使用`not array`或`if array`: +```python +# 错误做法 +if not array: # 触发错误 + pass + +# 正确做法 +if array.size == 0: # 检查长度 + pass + +# 或者 +if len(array) == 0: # 适用于1D array + pass +``` + +### 3. 防御性编程 +总是假设数据可能不符合预期: +```python +# 添加多层检查 +if obj is not None and isinstance(obj, pd.DataFrame) and not obj.empty: + # 安全操作 +``` + +## 完整的防御性代码模式 + +### DataFrame操作 +```python +# 检查DataFrame是否有效 +if isinstance(df, pd.DataFrame) and not df.empty: + # 执行操作 + result = df[condition] + if isinstance(result, pd.DataFrame) and not result.empty: + # 继续处理 +``` + +### Numpy Array操作 +```python +# 获取unique值 +unique_values = df["column"].unique() + +# 检查unique值是否为空 +if unique_values.size > 0: # 使用.size检查 + # 安全操作 + first_value = unique_values[0] +``` + +## 验证修复的方法 + +### 1. 运行脚本 +```bash +python process_parquet_to_excel.py +``` + +### 2. 检查输出 +- 应该看到"✅ 数据质量检验通过"消息 +- 不应该再出现"The truth value of an array"错误 +- 查看"全局数据质量统计"确认总记录数 + +### 3. 数据完整性验证 +预期:水准数据记录数 = Excel记录数 + +如果仍有差异,请检查: +- 数据文件是否完整 +- 日志中的警告信息 +- 是否有缺失的沉降数据 + +## 错误处理改进 + +新版本包含: +1. ✅ 详细的错误堆栈跟踪 +2. ✅ 智能错误提示 +3. ✅ 错误位置定位 +4. ✅ 数据质量自动检验 +5. ✅ 类型安全检查 + +## 版本历史 + +- **v1.2** (2025-11-08) + - 🔧 彻底修复:numpy array布尔值判断错误 + - ✨ 新增:全面的防御性编程检查 + - ✨ 新增:DataFrame类型验证 + - ✨ 新增:多层错误防护机制 + - 📝 改进:更安全的代码模式 + +- **v1.1** (2025-11-08) + - 🔧 部分修复:work_sites numpy array处理 + - ✨ 新增:数据质量检验机制 + - ✨ 新增:全局统计报告 + +- **v1.0** (2025-11-08) + - 初始版本 + +## 测试建议 + +1. **全量测试**:运行所有数据文件夹 +2. **边界测试**:检查空数据或缺失数据的情况 +3. **性能测试**:验证大数据集的处理速度 +4. **完整性测试**:对比预期和实际记录数 + +## 维护建议 + +1. 任何时候操作DataFrame,都要先检查`isinstance()` +2. 任何时候操作numpy array,都要使用`.size`或`len()`检查 +3. 避免直接对pandas对象使用`not`操作符 +4. 使用`.empty`属性检查DataFrame/Series是否为空 +5. 添加详细的错误处理和日志记录 + +--- + +**结论**:v1.2版本彻底解决了numpy array布尔值判断错误,通过全面的防御性编程确保代码的稳定性和健壮性。