导出代码说明
This commit is contained in:
146
upload_app/process_parquet_README.md
Normal file
146
upload_app/process_parquet_README.md
Normal file
@@ -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导出
|
||||
- 支持两层目录结构
|
||||
201
upload_app/使用指南.md
Normal file
201
upload_app/使用指南.md
Normal file
@@ -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导出功能
|
||||
180
upload_app/完整修复说明_v1.2.md
Normal file
180
upload_app/完整修复说明_v1.2.md
Normal file
@@ -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布尔值判断错误,通过全面的防御性编程确保代码的稳定性和健壮性。
|
||||
Reference in New Issue
Block a user