From 01b7759921ceae8daa6711a8f559ab9847e9d49b Mon Sep 17 00:00:00 2001 From: joey Date: Thu, 5 Mar 2026 22:02:57 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BB=E5=8F=96Excel=20=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E6=B1=87=E6=80=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 43 ++ README.md | 329 +++++++++++++++ .../process_balance_sheet.cpython-310.pyc | Bin 0 -> 6992 bytes __pycache__/process_cash_flow.cpython-310.pyc | Bin 0 -> 6125 bytes .../process_income_statement.cpython-310.pyc | Bin 0 -> 6297 bytes ...Žçš„集团_利润表_åˆå¹¶æŠ¥è¡¨_20251109_112109.csv | 101 +++++ ...集团_现金æµé‡è¡¨_åˆå¹¶æŠ¥è¡¨_20251109_132401.csv | 16 + ...集团_资产负债表_åˆå¹¶æŠ¥è¡¨_20251106_211306.csv | 169 ++++++++ config.json | 3 + config/泡泡玛特/balance_sheet_categories.json | 129 ++++++ config/泡泡玛特/cash_flow_config.json | 11 + config/泡泡玛特/income_statement_config.json | 11 + config/美的集团/balance_sheet_categories.json | 100 +++++ config/美的集团/cash_flow_config.json | 11 + config/美的集团/income_statement_config.json | 11 + config/蜜雪冰城/balance_sheet_categories.json | 128 ++++++ config/蜜雪冰城/cash_flow_config.json | 11 + config/蜜雪冰城/income_statement_config.json | 11 + docs/æ•°æ®åº“与架构设计-多类型数æ®.md | 194 +++++++++ .../泡泡玛特_利润表_åˆå¹¶æŠ¥è¡¨_20260209_220706.csv | 65 +++ ...¡æ³¡çŽ›ç‰¹_现金æµé‡è¡¨_åˆå¹¶æŠ¥è¡¨_20260209_220714.csv | 13 + ...¡æ³¡çŽ›ç‰¹_资产负债表_åˆå¹¶æŠ¥è¡¨_20260209_220656.csv | 125 ++++++ .../腾讯控股_利润表_åˆå¹¶æŠ¥è¡¨_20251115_072801.csv | 69 ++++ ...¾è®¯æŽ§è‚¡_现金æµé‡è¡¨_åˆå¹¶æŠ¥è¡¨_20251115_072901.csv | 43 ++ ...¾è®¯æŽ§è‚¡_资产负债表_åˆå¹¶æŠ¥è¡¨_20251115_072323.csv | 128 ++++++ .../蜜雪集团_利润表_åˆå¹¶æŠ¥è¡¨_20260111_141847.csv | 65 +++ ...œé›ªé›†å›¢_现金æµé‡è¡¨_åˆå¹¶æŠ¥è¡¨_20260111_141854.csv | 9 + ...œé›ªé›†å›¢_资产负债表_åˆå¹¶æŠ¥è¡¨_20260111_140650.csv | 124 ++++++ main.py | 326 +++++++++++++++ output/泡泡玛特20260209_220656.xlsx | Bin 0 -> 24760 bytes output/美的集团20251106_211306.xlsx | Bin 0 -> 34670 bytes output/腾讯控股20251115_072323.xlsx | Bin 0 -> 53510 bytes output/蜜雪集团20260111_140650.xlsx | Bin 0 -> 15073 bytes process_balance_sheet.py | 375 ++++++++++++++++++ process_cash_flow.py | 298 ++++++++++++++ process_income_statement.py | 320 +++++++++++++++ requirements.txt | 3 + 利润表处ç†è¯´æ˜Ž.md | 214 ++++++++++ 更新日志.md | 112 ++++++ 资产负债表处ç†è¯´æ˜Ž.md | 276 +++++++++++++ 40 files changed, 3843 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 __pycache__/process_balance_sheet.cpython-310.pyc create mode 100644 __pycache__/process_cash_flow.cpython-310.pyc create mode 100644 __pycache__/process_income_statement.cpython-310.pyc create mode 100644 backup-input/美的集团_利润表_åˆå¹¶æŠ¥è¡¨_20251109_112109.csv create mode 100644 backup-input/美的集团_现金æµé‡è¡¨_åˆå¹¶æŠ¥è¡¨_20251109_132401.csv create mode 100644 backup-input/美的集团_资产负债表_åˆå¹¶æŠ¥è¡¨_20251106_211306.csv create mode 100644 config.json create mode 100644 config/泡泡玛特/balance_sheet_categories.json create mode 100644 config/泡泡玛特/cash_flow_config.json create mode 100644 config/泡泡玛特/income_statement_config.json create mode 100644 config/美的集团/balance_sheet_categories.json create mode 100644 config/美的集团/cash_flow_config.json create mode 100644 config/美的集团/income_statement_config.json create mode 100644 config/蜜雪冰城/balance_sheet_categories.json create mode 100644 config/蜜雪冰城/cash_flow_config.json create mode 100644 config/蜜雪冰城/income_statement_config.json create mode 100644 docs/æ•°æ®åº“与架构设计-多类型数æ®.md create mode 100644 input/泡泡玛特/泡泡玛特_利润表_åˆå¹¶æŠ¥è¡¨_20260209_220706.csv create mode 100644 input/泡泡玛特/泡泡玛特_现金æµé‡è¡¨_åˆå¹¶æŠ¥è¡¨_20260209_220714.csv create mode 100644 input/泡泡玛特/泡泡玛特_资产负债表_åˆå¹¶æŠ¥è¡¨_20260209_220656.csv create mode 100644 input/腾讯控股/腾讯控股_利润表_åˆå¹¶æŠ¥è¡¨_20251115_072801.csv create mode 100644 input/腾讯控股/腾讯控股_现金æµé‡è¡¨_åˆå¹¶æŠ¥è¡¨_20251115_072901.csv create mode 100644 input/腾讯控股/腾讯控股_资产负债表_åˆå¹¶æŠ¥è¡¨_20251115_072323.csv create mode 100644 input/蜜雪冰城/蜜雪集团_利润表_åˆå¹¶æŠ¥è¡¨_20260111_141847.csv create mode 100644 input/蜜雪冰城/蜜雪集团_现金æµé‡è¡¨_åˆå¹¶æŠ¥è¡¨_20260111_141854.csv create mode 100644 input/蜜雪冰城/蜜雪集团_资产负债表_åˆå¹¶æŠ¥è¡¨_20260111_140650.csv create mode 100644 main.py create mode 100644 output/泡泡玛特20260209_220656.xlsx create mode 100644 output/美的集团20251106_211306.xlsx create mode 100644 output/腾讯控股20251115_072323.xlsx create mode 100644 output/蜜雪集团20260111_140650.xlsx create mode 100644 process_balance_sheet.py create mode 100644 process_cash_flow.py create mode 100644 process_income_statement.py create mode 100644 requirements.txt create mode 100644 利润表处ç†è¯´æ˜Ž.md create mode 100644 更新日志.md create mode 100644 资产负债表处ç†è¯´æ˜Ž.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..741e713 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# config +.env.local +config/env.local.js + +# compiled output +dist +node_modules +package-lock.json + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +.vscode +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..a26936c --- /dev/null +++ b/README.md @@ -0,0 +1,329 @@ +# 财务报表数æ®å¤„ç†å·¥å…·é›† + +这是一套用于处ç†è´¢åŠ¡æŠ¥è¡¨æ•°æ®çš„ Python 工具集,包å«èµ„产负债表和利润表处ç†åŠŸèƒ½ã€‚ + +--- + +## 📋 工具列表 + +### 主程åºï¼šè´¢åŠ¡æŠ¥è¡¨ç»Ÿä¸€å¤„ç†å·¥å…· ⭠推è使用 + +**脚本**:`main.py` + +**主è¦åŠŸèƒ½**: + +- 🔠**自动识别**:智能识别资产负债表和利润表文件 +- 📊 **统一处ç†**:自动调用对应的处ç†å·¥å…· +- 📠**åˆå¹¶è¾“出**:将两个报表åˆå¹¶åˆ°ä¸€ä¸ª Excel çš„ä¸åŒ Tab 页 +- 🎯 **智能命å**ï¼šè‡ªåŠ¨æ¸…ç†æ–‡ä»¶å,去除"åˆå¹¶æŠ¥è¡¨"等冗余文字 +- 💯 **å•ä½ç»Ÿä¸€**:所有数æ®ç»Ÿä¸€è½¬æ¢ä¸ºäº¿ï¼ˆä¿ç•™ 2 ä½å°æ•°ï¼‰ + +### 1. 资产负债表处ç†å·¥å…· + +**脚本**:`process_balance_sheet.py` + +**主è¦åŠŸèƒ½**: + +- æŒ‰ç…§é¢„å®šä¹‰åˆ†ç±»é‡æ–°ç»„ç»‡æ•°æ® +- 自动计算分类汇总 +- 数字转æ¢ä¸ºäº¿ï¼ˆä¿ç•™ 2 ä½å°æ•°ï¼‰ +- 第一行显示日期 +- 统一输出为 Excel æ ¼å¼ + +**详细说明**:📖 [资产负债表处ç†è¯´æ˜Ž.md](资产负债表处ç†è¯´æ˜Ž.md) + +### 2. 利润表处ç†å·¥å…· + +**脚本**:`process_income_statement.py` + +**主è¦åŠŸèƒ½**: + +- 将大数字转æ¢ä¸ºä»¥äº¿ä¸ºå•ä½ï¼ˆä¿ç•™ 2 ä½å°æ•°ï¼‰ +- ä¿ç•™å°æ•°/比率ä¸å˜ +- 删除指定的无用行 +- 第一行显示日期 +- 统一输出为 Excel æ ¼å¼ + +**详细说明**:📖 [利润表处ç†è¯´æ˜Ž.md](利润表处ç†è¯´æ˜Ž.md) + +--- + +## ðŸ—‚ï¸ ç›®å½•ç»“æž„ + +``` +organize_excel_data/ +├── config/ # é…置文件目录 +│ ├── balance_sheet_categories.json # 资产负债表分类é…ç½® +│ └── income_statement_config.json # 利润表é…ç½® +├── input/ # 输入文件目录 +│ ├── *资产负债表*.csv/*.xlsx # 资产负债表文件 +│ └── *利润表*.csv/*.xlsx # 利润表文件 +├── output/ # 输出文件目录 +│ └── *.xlsx # 处ç†ç»“果(包å«å¤šä¸ª Tab) +├── main.py # 主程åºï¼ˆæŽ¨è使用)⭠+├── process_balance_sheet.py # 资产负债表处ç†è„šæœ¬ +├── process_income_statement.py # 利润表处ç†è„šæœ¬ +├── README.md # 总体说明文档(本文件) +├── 资产负债表处ç†è¯´æ˜Ž.md # 资产负债表详细说明 +└── 利润表处ç†è¯´æ˜Ž.md # 利润表详细说明 +``` + +--- + +## 🚀 快速开始 + +### 1. 环境准备 + +ç¡®ä¿å·²å®‰è£… Python 3 和必è¦çš„ä¾èµ–库: + +```bash +pip install pandas openpyxl +``` + +或使用: + +```bash +pip install -r requirements.txt +``` + +### 2. å‡†å¤‡æ•°æ® + +将待处ç†çš„æ–‡ä»¶æ”¾å…¥ `input/` 目录: + +- 资产负债表文件(建议文件å包å«"资产负债表") +- 利润表文件(建议文件å包å«"利润表") + +### 3. è¿è¡Œç›¸åº”脚本 + +**处ç†èµ„产负债表:** + +```bash +python3 process_balance_sheet.py +``` + +**处ç†åˆ©æ¶¦è¡¨ï¼š** + +```bash +python3 process_income_statement.py +``` + +### 4. 查看结果 + +处ç†å®ŒæˆåŽï¼Œæ–‡ä»¶å°†ä¿å­˜åœ¨ `output/` 目录下: + +- 资产负债表:`organized_原文件å.xlsx` +- 利润表:`processed_原文件å.xlsx` + +--- + +## 📊 å¤„ç†æ•ˆæžœå¯¹æ¯” + +### 资产负债表 + +| 处ç†å‰ | 处ç†åŽ | +| ---------------- | ---------------- | +| æ•°æ®åˆ†æ•£ï¼Œæ— åˆ†ç±» | 按 9 大类组织 | +| æ— æ±‡æ€»æ•°æ® | 自动计算汇总 | +| 一ã€èµ„产总计 | 资产总计(简化) | +| 股票代ç åœ¨ç¬¬ä¸€è¡Œ | 日期在第一行 | +| æ•°æ®ä¿æŒåŽŸå§‹å•ä½ | æ•°æ®ä¿æŒåŽŸå§‹å•ä½ | + +**输出示例:** + +``` +日期 2024/12/31 2023/12/31 ... +资产总计 604,352亿 486,038亿 ... +所有者æƒç›Šåˆè®¡ 227,667亿 174,300亿 ... +负债åˆè®¡ 376,684亿 311,739亿 ... +类现金 216,678亿 142,001亿 ... ↠汇总行 + è´§å¸èµ„金 140,410亿 81,674亿 ... + 交易性金èžèµ„产 6,936亿 1,791亿 ... +``` + +### 利润表 + +| 处ç†å‰ | 处ç†åŽ | +| ------------------ | ----------------------- | +| æ•°æ®å•ä½ä¸º"å…ƒ" | 转æ¢ä¸º"亿"(ä¿ç•™ 2 ä½ï¼‰ | +| åŒ…å«æ— ç”¨ä¿¡æ¯è¡Œ | 删除指定行 | +| 股票代ç åœ¨ç¬¬ä¸€è¡Œ | 日期在第一行 | +| è¥ä¸šæ”¶å…¥: 4.07E+11 | è¥ä¸šæ”¶å…¥: 4071.50 | +| 毛利率: 0.2642 | 毛利率: 0.2642(ä¸å˜ï¼‰ | + +**转æ¢è§„则:** + +- 大数字(≥1)→ 转æ¢ä¸ºäº¿ï¼ˆä¿ç•™ 2 ä½å°æ•°ï¼‰ +- å°æ•°/比率(<1)→ ä¿æŒä¸å˜ + +--- + +## âš™ï¸ é…置说明 + +### 资产负债表é…ç½® + +**文件**:`config/balance_sheet_categories.json` + +**用途**:定义分类和项目归属 + +**示例**: + +```json +{ + "categories": [ + { + "name": "类现金", + "items": ["è´§å¸èµ„金", "交易性金èžèµ„产", "è¡ç”Ÿé‡‘èžèµ„产(æµåЍ)"] + } + ] +} +``` + +### 利润表é…ç½® + +**文件**:`config/income_statement_config.json` + +**用途**:定义需è¦åˆ é™¤çš„行 + +**示例**: + +```json +{ + "rows_to_delete": ["股票代ç ", "上市公å¸", "财报类型", "è´§å¸"] +} +``` + +--- + +## 💡 使用场景 + +### 场景 1ï¼šè´¢åŠ¡åˆ†æž + +- 快速查看资产负债结构 +- 按分类汇总查看å„类资产/è´Ÿå€ºå æ¯” +- 利润表数æ®å•ä½ç»Ÿä¸€ï¼Œä¾¿äºŽåˆ†æž + +### 场景 2:数æ®å¯¹æ¯” + +- å¤šå¹´åº¦æ•°æ®æ¨ªå‘对比 +- 分类汇总数æ®çºµå‘对比 +- Excel æ ¼å¼ä¾¿äºŽåˆ¶ä½œå›¾è¡¨ + +### 场景 3:报告制作 + +- 处ç†åŽçš„æ•°æ®æ ¼å¼è§„范 +- å¯ç›´æŽ¥ç”¨äºŽæŠ¥å‘Šå’Œæ¼”示 +- å‡å°‘æ‰‹å·¥æ•´ç†æ—¶é—´ + +--- + +## âš ï¸ æ³¨æ„事项 + +### 通用事项 + +1. 支æŒçš„输入文件格å¼ï¼š`.csv`ã€`.xlsx`ã€`.xls` +2. 输出文件格å¼ï¼šç»Ÿä¸€ä¸º `.xlsx`(Excel æ ¼å¼ï¼‰ +3. CSV 文件使用 UTF-8 ç¼–ç  +4. è„šæœ¬ä¼šè‡ªåŠ¨å¤„ç† `input/` 目录下的相关文件 +5. 输出文件会覆盖åŒå的已有文件 + +### èµ„äº§è´Ÿå€ºè¡¨ç‰¹åˆ«æ³¨æ„ + +- 项目å称必须与原始数æ®å®Œå…¨åŒ¹é… +- æ•°æ®ä¿æŒåŽŸå§‹å•ä½ï¼Œä¸è¿›è¡Œè½¬æ¢ +- 汇总计算会自动处ç†ç©ºå€¼ + +### åˆ©æ¶¦è¡¨ç‰¹åˆ«æ³¨æ„ + +- ç»å¯¹å€¼ ≥ 1 的数字会转æ¢ä¸ºäº¿ +- ç»å¯¹å€¼ < 1 çš„æ•°å­—ä¿æŒä¸å˜ +- 转æ¢åŽå¯èƒ½æŸå¤±ç²¾åº¦ï¼ˆä¿ç•™ 2 ä½å°æ•°ï¼‰ + +--- + +## 🔧 常è§é—®é¢˜ + +### Q1: 如何批é‡å¤„ç†å¤šä¸ªæ–‡ä»¶ï¼Ÿ + +**A**: 将所有文件放入 `input/` 目录,è¿è¡Œç›¸åº”脚本å³å¯è‡ªåŠ¨å¤„ç†æ‰€æœ‰æ–‡ä»¶ã€‚ + +### Q2: 处ç†åŽçš„æ•°æ®å‡†ç¡®å—? + +**A**: + +- 资产负债表:数æ®ä¿æŒåŽŸæ ·ï¼Œä»…é‡æ–°ç»„织 +- 利润表:大数字转æ¢ä¸ºäº¿ï¼Œä¿ç•™ 2 ä½å°æ•°ï¼Œæ¯”çŽ‡ä¿æŒä¸å˜ + +### Q3: 如何修改é…置? + +**A**: + +- 资产负债表:编辑 `config/balance_sheet_categories.json` 添加/修改分类 +- 利润表:编辑 `config/income_statement_config.json` 添加/删除è¦åˆ é™¤çš„行 + +### Q4: æ–‡ä»¶æ²¡æœ‰è¢«å¤„ç†æ€Žä¹ˆåŠžï¼Ÿ + +**A**: + +1. 检查文件是å¦åœ¨ `input/` 目录 +2. æ£€æŸ¥æ–‡ä»¶åæ˜¯å¦åŒ…å«å…³é”®è¯ï¼ˆèµ„产负债表/利润表) +3. 查看脚本输出的æç¤ºä¿¡æ¯ + +### Q5: 如何查看详细说明? + +**A**: 查看对应的详细说明文档: + +- 资产负债表:[资产负债表处ç†è¯´æ˜Ž.md](资产负债表处ç†è¯´æ˜Ž.md) +- 利润表:[利润表处ç†è¯´æ˜Ž.md](利润表处ç†è¯´æ˜Ž.md) + +--- + +## 📖 详细文档 + +- 📘 [资产负债表处ç†è¯´æ˜Ž.md](资产负债表处ç†è¯´æ˜Ž.md) - 资产负债表处ç†è¯¦ç»†è¯´æ˜Ž +- 📙 [利润表处ç†è¯´æ˜Ž.md](利润表处ç†è¯´æ˜Ž.md) - 利润表处ç†è¯¦ç»†è¯´æ˜Ž +- 📗 [更新日志.md](更新日志.md) - ç‰ˆæœ¬æ›´æ–°åŽ†å² + +--- + +## 🎯 ç‰ˆæœ¬åŽ†å² + +### v1.2 (2025-11-09) + +**资产负债表:** + +- 优化输出:第一行显示日期而éžè‚¡ç¥¨ä»£ç  +- 简化å称:特殊分类使用é…置中的 name +- 完善分类é…ç½®ï¼šæ–°å¢žå¤šä¸ªé—æ¼çš„资产负债项目 + +**利润表:** + +- 新增利润表处ç†å·¥å…· +- æ•°å­—å•ä½è½¬æ¢ä¸ºäº¿ï¼ˆä¿ç•™ 2 ä½å°æ•°ï¼‰ +- 删除指定的无用行 + +### v1.1 (2025-11-09) + +- 优化输出格å¼ï¼šç»Ÿä¸€è¾“出为 `.xlsx` æ ¼å¼ +- 新增分类汇总功能:自动计算æ¯ä¸ªåˆ†ç±»çš„金颿€»å’Œ +- 优化特殊分类显示 + +### v1.0 (2025-11-09) + +- åˆå§‹ç‰ˆæœ¬ +- æ”¯æŒ CSV å’Œ Excel 文件输入 +- 支æŒè‡ªå®šä¹‰åˆ†ç±»é…ç½® +- è‡ªåŠ¨å¤„ç†æ‰¹é‡æ–‡ä»¶ + +--- + +## 📞 æŠ€æœ¯æ”¯æŒ + +如有问题或建议,请: + +1. 查看详细说明文档 +2. 检查é…ç½®æ–‡ä»¶æ ¼å¼ +3. 查看脚本输出的æç¤ºä¿¡æ¯ + +--- + +**ç¥ä½¿ç”¨æ„‰å¿«ï¼ðŸŽ‰** diff --git a/__pycache__/process_balance_sheet.cpython-310.pyc b/__pycache__/process_balance_sheet.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b3525456635a712cf33d74cf4709f6723b6f417 GIT binary patch literal 6992 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 literal 0 HcmV?d00001 diff --git a/__pycache__/process_cash_flow.cpython-310.pyc b/__pycache__/process_cash_flow.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e47a72c63942442390d31ba9f11cefe710a75d71 GIT binary patch literal 6125 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 KzK6T3PyQEyCoWF_ literal 0 HcmV?d00001 diff --git a/__pycache__/process_income_statement.cpython-310.pyc b/__pycache__/process_income_statement.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee76b6899a9cfe204b0244948b2f295a0a547d47 GIT binary patch literal 6297 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 U0_W)uk2DG#C~&IZF#A#ZKgFN!i2wiq literal 0 HcmV?d00001 diff --git a/output/美的集团20251106_211306.xlsx b/output/美的集团20251106_211306.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..74eb19eda108af3f88ec359cd5db8b2cd28e5be7 GIT binary patch literal 34670 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 i>~f{AWZR4r@Np&JXMK~S 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 J5RTvf{y(abRWtwq literal 0 HcmV?d00001 diff --git a/process_balance_sheet.py b/process_balance_sheet.py new file mode 100644 index 0000000..fb164eb --- /dev/null +++ b/process_balance_sheet.py @@ -0,0 +1,375 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +资产负债表数æ®å¤„ç†è„šæœ¬ +功能:按照é…ç½®çš„åˆ†ç±»é‡æ–°ç»„ç»‡èµ„äº§è´Ÿå€ºè¡¨æ•°æ® +""" + +import pandas as pd +import json +import os +from pathlib import Path + + +def load_config(config_path): + """加载分类é…置文件""" + with open(config_path, 'r', encoding='utf-8') as f: + config = json.load(f) + return config['categories'] + + +def find_row_by_item_name(df, item_name): + """åœ¨æ•°æ®æ¡†ä¸­æŸ¥æ‰¾æŒ‡å®šé¡¹ç›®å称的行""" + # 获å–ç¬¬ä¸€åˆ—çš„æ•°æ® + first_col = df.iloc[:, 0] + + # å°è¯•ç²¾ç¡®åŒ¹é… + mask = first_col == item_name + if mask.any(): + return df[mask] + + # å°è¯•模糊匹é…(去除空格) + mask = first_col.str.strip() == item_name.strip() + if mask.any(): + return df[mask] + + return None + + +def safe_float_convert(value): + """安全地将值转æ¢ä¸ºæµ®ç‚¹æ•°ï¼Œå¤„ç†å„ç§æ ¼å¼""" + if pd.isna(value) or value == '' or value is None: + return 0.0 + + try: + # å¦‚æžœå·²ç»æ˜¯æ•°å€¼ç±»åž‹ + if isinstance(value, (int, float)): + return float(value) + + # 转æ¢ä¸ºå­—ç¬¦ä¸²å¹¶æ¸…ç† + str_value = str(value).strip() + if str_value == '' or str_value.lower() == 'nan': + return 0.0 + + # 去除等å·ï¼ˆExcel公弿 ¼å¼ï¼Œå¦‚ "=557395000000") + if str_value.startswith('='): + str_value = str_value[1:] + + # 去除常è§çš„æ•°å­—æ ¼å¼å­—符(逗å·ã€ç©ºæ ¼ç­‰ï¼‰ + str_value = str_value.replace(',', '').replace(' ', '').replace(',', '') + + if str_value == '' or str_value.lower() == 'nan': + return 0.0 + + # å°è¯•转æ¢ï¼ˆæ”¯æŒç§‘学计数法,如 "2.07327E+12") + return float(str_value) + except (ValueError, TypeError): + return 0.0 + + +def convert_to_yi(value): + """将数字转æ¢ä¸ºä»¥äº¿ä¸ºå•ä½ï¼Œä¿ç•™ä¸¤ä½å°æ•°""" + if pd.isna(value) or value == '' or value is None: + return value + + # 统一转æ¢ä¸ºæµ®ç‚¹æ•°è¿›è¡Œå¤„ç† + num = None + + # å¦‚æžœå·²ç»æ˜¯æ•°å€¼ç±»åž‹ï¼Œç›´æŽ¥ä½¿ç”¨ + if isinstance(value, (int, float)): + num = float(value) + else: + # 处ç†å­—ç¬¦ä¸²æ ¼å¼ + try: + # 转æ¢ä¸ºå­—ç¬¦ä¸²å¹¶æ¸…ç† + str_value = str(value).strip() + + # 去除等å·ï¼ˆExcel公弿 ¼å¼ï¼Œå¦‚ "=557395000000") + if str_value.startswith('='): + str_value = str_value[1:] + + # 去除常è§çš„æ•°å­—æ ¼å¼å­—符(逗å·ã€ç©ºæ ¼ç­‰ï¼‰ + str_value = str_value.replace(',', '').replace(' ', '').replace(',', '') + + # 如果为空,返回原值 + if str_value == '' or str_value.lower() == 'nan': + return value + + # 转æ¢ä¸ºæµ®ç‚¹æ•°ï¼ˆæ”¯æŒç§‘学计数法,如 "2.07327E+12") + num = float(str_value) + except (ValueError, TypeError): + # 如果无法转æ¢ï¼Œè¿”回原值 + return value + + # 如果æˆåŠŸè½¬æ¢ä¸ºæ•°å­— + if num is not None: + # å¦‚æžœæ˜¯å°æ•°ï¼ˆæ¯”率),返回去除等å·åŽçš„值 + if abs(num) < 1: + # 如果原值是字符串且以等å·å¼€å¤´ï¼Œè¿”回去除等å·åŽçš„值 + if isinstance(value, str) and value.strip().startswith('='): + return str_value + return value + + # 转æ¢ä¸ºäº¿ï¼Œä¿ç•™ä¸¤ä½å°æ•° + yi_value = num / 100000000 + return round(yi_value, 2) + + # 如果无法处ç†ï¼Œè¿”回原值 + return value + + +def process_balance_sheet_return_df(input_file, config_file): + """ + 处ç†èµ„产负债表文件并返回 DataFrame + + 傿•°ï¼š + input_file: 输入的CSV/Excel文件路径 + config_file: 分类é…置文件路径 + + 返回: + pandas.DataFrame: 处ç†åŽçš„æ•°æ®æ¡† + """ + print(f"æ­£åœ¨è¯»å–æ–‡ä»¶: {input_file}") + + # è¯»å–æ•°æ®æ–‡ä»¶ + if input_file.endswith('.csv'): + df = pd.read_csv(input_file, encoding='utf-8') + else: + df = pd.read_excel(input_file) + + print(f"æ–‡ä»¶è¯»å–æˆåŠŸï¼Œå…± {len(df)} 行") + + # 加载分类é…ç½® + categories = load_config(config_file) + print(f"é…置文件加载æˆåŠŸï¼Œå…± {len(categories)} 个分类") + + # åˆ›å»ºç»“æžœæ•°æ®æ¡† + result_rows = [] + processed_indices = set() + + # æå–日期行作为第一行 + date_row = find_row_by_item_name(df, '日期') + if date_row is not None and len(date_row) > 0: + date_idx = date_row.index[0] + result_rows.append(df.iloc[date_idx].tolist()) + processed_indices.add(date_idx) + print("已添加日期行作为第一行") + else: + print("警告: 未找到日期行") + + # å®šä¹‰ç‰¹æ®Šåˆ†ç±»ï¼ˆåªæœ‰ä¸€é¡¹ï¼Œç›´æŽ¥æ˜¾ç¤ºæ•°æ®ï¼Œä¸éœ€è¦é¢å¤–的分类标题行) + special_categories = ['资产总计', '所有者æƒç›Šåˆè®¡', '负债åˆè®¡'] + + # æŒ‰åˆ†ç±»å¤„ç† + for category in categories: + category_name = category['name'] + items = category['items'] + + print(f"\n处ç†åˆ†ç±»: {category_name}") + + # 查找该分类下的所有项目 + found_rows = [] + found_count = 0 + + for item_name in items: + row_data = find_row_by_item_name(df, item_name) + if row_data is not None and len(row_data) > 0: + for idx in row_data.index: + if idx not in processed_indices: + found_rows.append(df.iloc[idx].tolist()) + processed_indices.add(idx) + found_count += 1 + print(f" 找到: {item_name}") + + if found_count == 0: + print(f" 警告: 该分类下未找到任何项目") + continue + + # 处ç†ç‰¹æ®Šåˆ†ç±» + if category_name in special_categories: + # 特殊分类:直接添加数æ®è¡Œï¼Œä½†å°†ç¬¬ä¸€åˆ—çš„å称替æ¢ä¸ºé…置的 nameï¼Œå¹¶è½¬æ¢æ•°å­—为亿 + for row in found_rows: + modified_row = row[:] # 创建列表的副本 + modified_row[0] = category_name # 使用é…置中的 name 替æ¢åŽŸå§‹åç§° + + # è½¬æ¢æ•°å­—为亿(从第2列开始) + for col_idx in range(1, len(modified_row)): + original_value = modified_row[col_idx] + converted_value = convert_to_yi(original_value) + modified_row[col_idx] = converted_value + # 调试:打å°å‰å‡ ä¸ªè½¬æ¢ç¤ºä¾‹ + if col_idx <= 2 and not pd.isna(original_value) and original_value != '': + print(f" 转æ¢ç¤ºä¾‹: {original_value} -> {converted_value}") + + result_rows.append(modified_row) + else: + # æ™®é€šåˆ†ç±»ï¼šæ·»åŠ åˆ†ç±»æ ‡é¢˜è¡Œï¼ˆåŒ…å«æ±‡æ€»æ•°æ®ï¼‰+ 明细行 + # 计算æ¯åˆ—的汇总(从第2列开始,第1列是å称) + category_header = [category_name] + + # 获å–列数(使用第一个找到的行的长度) + num_cols = len(found_rows[0]) if found_rows else len(df.columns) + + for col_idx in range(1, num_cols): + col_sum = 0.0 + for row in found_rows: + if col_idx < len(row): + col_sum += safe_float_convert(row[col_idx]) + + # 汇总åŽè½¬æ¢ä¸ºäº¿ + if col_sum == 0.0: + category_header.append('') + else: + category_header.append(convert_to_yi(col_sum)) + + result_rows.append(category_header) + + # æ·»åŠ æ˜Žç»†è¡Œï¼ˆè½¬æ¢æ•°å­—为亿) + for row_idx, row in enumerate(found_rows): + converted_row = row[:] # 创建副本 + # è½¬æ¢æ•°å­—为亿(从第2列开始) + for col_idx in range(1, len(converted_row)): + original_value = converted_row[col_idx] + converted_value = convert_to_yi(original_value) + converted_row[col_idx] = converted_value + # 调试:打å°å‰å‡ ä¸ªè½¬æ¢ç¤ºä¾‹ + if row_idx == 0 and col_idx <= 2 and not pd.isna(original_value) and original_value != '': + print(f" 转æ¢ç¤ºä¾‹: {original_value} -> {converted_value}") + result_rows.append(converted_row) + + # 添加3个空行 + # 使用第一行(日期行)的长度æ¥ç¡®å®šåˆ—æ•° + num_cols = len(result_rows[0]) if result_rows else len(df.columns) + empty_row = [''] * num_cols + for _ in range(3): + result_rows.append(empty_row) + + # 添加未分类的行 + print(f"\nå¤„ç†æœªåˆ†ç±»é¡¹ç›®...") + uncategorized_header = ['未分类项目'] + [''] * (num_cols - 1) + result_rows.append(uncategorized_header) + + uncategorized_count = 0 + for idx in range(len(df)): + if idx not in processed_indices: + row = df.iloc[idx].tolist() + # è½¬æ¢æ•°å­—为亿(从第2列开始) + converted_row = [row[0]] # ä¿ç•™ç¬¬ä¸€åˆ—(å称) + for col_idx in range(1, len(row)): + converted_row.append(convert_to_yi(row[col_idx])) + + result_rows.append(converted_row) + uncategorized_count += 1 + # æ‰“å°æœªåˆ†ç±»é¡¹ç›®çš„åç§° + item_name = df.iloc[idx, 0] + if pd.notna(item_name) and str(item_name).strip(): + print(f" 未分类: {item_name}") + + print(f"\n共有 {uncategorized_count} 个未分类项目") + + # åˆ›å»ºç»“æžœæ•°æ®æ¡†ï¼ˆä¸ä½¿ç”¨åˆ—å,因为第一行就是日期行) + result_df = pd.DataFrame(result_rows) + + print("\n处ç†å®Œæˆï¼") + print(f"总行数: {len(result_df)}") + print(f"已分类项目: {len(processed_indices)}") + print(f"未分类项目: {uncategorized_count}") + + return result_df + + +def process_balance_sheet(input_file, config_file, output_file): + """ + 处ç†èµ„产负债表文件并ä¿å­˜ + + 傿•°ï¼š + input_file: 输入的CSV/Excel文件路径 + config_file: 分类é…置文件路径 + output_file: 输出文件路径 + """ + # 调用处ç†å‡½æ•°èŽ·å– DataFrame + result_df = process_balance_sheet_return_df(input_file, config_file) + + # ä¿å­˜ç»“果(默认ä¿å­˜ä¸º xlsx æ ¼å¼ï¼‰ + print(f"\n正在ä¿å­˜ç»“果到: {output_file}") + + # 强制使用 xlsx æ ¼å¼ + if not output_file.endswith('.xlsx'): + output_file = output_file.rsplit('.', 1)[0] + '.xlsx' + + # ä¿å­˜æ—¶ä¸å†™å…¥åˆ—å和索引 + result_df.to_excel(output_file, index=False, header=False, engine='openpyxl') + + print(f"输出文件: {output_file}") + + +def main(): + """主函数""" + # 获å–脚本所在目录 + script_dir = Path(__file__).parent + + # 设置路径 + input_dir = script_dir / 'input' + config_dir = script_dir / 'config' + output_dir = script_dir / 'output' + + # 创建输出目录 + output_dir.mkdir(exist_ok=True) + + # é…置文件路径 + config_file = config_dir / 'balance_sheet_categories.json' + + if not config_file.exists(): + print(f"错误: é…置文件ä¸å­˜åœ¨: {config_file}") + return + + # 查找input目录下的文件 + if not input_dir.exists(): + print(f"错误: input目录ä¸å­˜åœ¨: {input_dir}") + return + + # èŽ·å–æ‰€æœ‰CSVå’ŒExcel文件 + input_files = list(input_dir.glob('*.csv')) + \ + list(input_dir.glob('*.xlsx')) + \ + list(input_dir.glob('*.xls')) + + if not input_files: + print(f"错误: 在 {input_dir} 目录下未找到任何CSV或Excel文件") + return + + print(f"找到 {len(input_files)} 个文件待处ç†\n") + + # å¤„ç†æ¯ä¸ªæ–‡ä»¶ + for input_file in input_files: + print(f"\n{'='*60}") + print(f"å¤„ç†æ–‡ä»¶: {input_file.name}") + print(f"{'='*60}") + + # 生æˆè¾“出文件å(统一使用 .xlsx 扩展å,去除"åˆå¹¶æŠ¥è¡¨_") + base_name = input_file.stem # ä¸å¸¦æ‰©å±•å的文件å + # æ¸…ç†æ–‡ä»¶å + import re + base_name = base_name.replace('åˆå¹¶æŠ¥è¡¨_', '').replace('åˆå¹¶æŠ¥è¡¨', '') + base_name = re.sub(r'_+', '_', base_name).strip('_') + output_file = output_dir / f"{base_name}.xlsx" + + try: + process_balance_sheet( + str(input_file), + str(config_file), + str(output_file) + ) + except Exception as e: + print(f"å¤„ç†æ–‡ä»¶æ—¶å‡ºé”™: {e}") + import traceback + traceback.print_exc() + + print(f"\n{'='*60}") + print("所有文件处ç†å®Œæˆï¼") + print(f"结果ä¿å­˜åœ¨: {output_dir}") + print(f"{'='*60}") + + +if __name__ == '__main__': + main() + diff --git a/process_cash_flow.py b/process_cash_flow.py new file mode 100644 index 0000000..98c050b --- /dev/null +++ b/process_cash_flow.py @@ -0,0 +1,298 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +现金æµé‡è¡¨æ•°æ®å¤„ç†è„šæœ¬ +功能: +1. æ ¹æ®é…ç½®ä¿ç•™æŒ‡å®šçš„列 +2. 删除其他列 +3. 将数字转æ¢ä¸ºä»¥äº¿ä¸ºå•ä½ï¼ˆä¿ç•™ä¸¤ä½å°æ•°ï¼‰ +4. 日期字段在第一列(竖轴) +5. 输出为 Excel æ ¼å¼ +""" + +import pandas as pd +import json +import os +from pathlib import Path + + +def load_config(config_path): + """加载é…置文件""" + with open(config_path, 'r', encoding='utf-8') as f: + config = json.load(f) + return config + + +def convert_to_yi(value): + """将数字转æ¢ä¸ºä»¥äº¿ä¸ºå•ä½ï¼Œä¿ç•™ä¸¤ä½å°æ•°""" + if pd.isna(value) or value == '' or value is None: + return value + + # 统一转æ¢ä¸ºæµ®ç‚¹æ•°è¿›è¡Œå¤„ç† + num = None + + # å¦‚æžœå·²ç»æ˜¯æ•°å€¼ç±»åž‹ï¼Œç›´æŽ¥ä½¿ç”¨ + if isinstance(value, (int, float)): + num = float(value) + else: + # 处ç†å­—ç¬¦ä¸²æ ¼å¼ + try: + # 转æ¢ä¸ºå­—ç¬¦ä¸²å¹¶æ¸…ç† + str_value = str(value).strip() + + # 去除等å·ï¼ˆExcel公弿 ¼å¼ï¼Œå¦‚ "=557395000000") + if str_value.startswith('='): + str_value = str_value[1:] + + # 去除常è§çš„æ•°å­—æ ¼å¼å­—符(逗å·ã€ç©ºæ ¼ç­‰ï¼‰ + str_value = str_value.replace(',', '').replace(' ', '').replace(',', '') + + # 如果为空,返回原值 + if str_value == '' or str_value.lower() == 'nan': + return value + + # 转æ¢ä¸ºæµ®ç‚¹æ•°ï¼ˆæ”¯æŒç§‘学计数法,如 "2.07327E+12") + num = float(str_value) + except (ValueError, TypeError): + # 如果无法转æ¢ï¼Œè¿”回原值 + return value + + # 如果æˆåŠŸè½¬æ¢ä¸ºæ•°å­— + if num is not None: + # å¦‚æžœæ˜¯å°æ•°ï¼ˆæ¯”率),返回去除等å·åŽçš„值 + if abs(num) < 1: + # 如果原值是字符串且以等å·å¼€å¤´ï¼Œè¿”回去除等å·åŽçš„值 + if isinstance(value, str) and value.strip().startswith('='): + return str_value + return value + + # 转æ¢ä¸ºäº¿ï¼Œä¿ç•™ä¸¤ä½å°æ•° + yi_value = num / 100000000 + return round(yi_value, 2) + + # 如果无法处ç†ï¼Œè¿”回原值 + return value + + +def find_date_column(df): + """ + 查找日期列(通常在列å中包å«'日期',或者第一列) + 返回日期列的索引,如果找ä¸åˆ°è¿”回 0(第一列) + """ + for col_idx, col_name in enumerate(df.columns): + col_str = str(col_name).strip() + if '日期' in col_str: + return col_idx + # 如果找ä¸åˆ°ï¼Œè¿”回第一列(通常日期在第一列) + return 0 + + +def process_cash_flow_return_df(input_file, config_file): + """ + 处ç†çް金æµé‡è¡¨æ–‡ä»¶å¹¶è¿”回 DataFrame + + 傿•°ï¼š + input_file: 输入的CSV/Excel文件路径 + config_file: é…置文件路径 + + 返回: + pandas.DataFrame: 处ç†åŽçš„æ•°æ®æ¡† + """ + print(f"æ­£åœ¨è¯»å–æ–‡ä»¶: {input_file}") + + # è¯»å–æ•°æ®æ–‡ä»¶ + if input_file.endswith('.csv'): + df = pd.read_csv(input_file, encoding='utf-8') + else: + df = pd.read_excel(input_file) + + print(f"æ–‡ä»¶è¯»å–æˆåŠŸï¼Œå…± {len(df)} 行,{len(df.columns)} 列") + + # 加载é…置文件 + config = load_config(config_file) + columns_to_keep = config.get('columns_to_keep', []) + print(f"é…置文件加载æˆåŠŸï¼Œéœ€è¦ä¿ç•™ {len(columns_to_keep)} 列") + + # 查找日期列(通常在第一列) + date_col_idx = find_date_column(df) + date_col_name = df.columns[date_col_idx] + print(f"日期列: {date_col_name} (第 {date_col_idx + 1} 列)") + + # 查找需è¦ä¿ç•™çš„列在原始数æ®ä¸­çš„ä½ç½® + columns_to_keep_indices = {} + for col_name in columns_to_keep: + found = False + for orig_col_idx, orig_col_name in enumerate(df.columns): + if str(orig_col_name).strip() == str(col_name).strip(): + columns_to_keep_indices[col_name] = orig_col_idx + found = True + print(f" ✓ 找到列: {col_name}") + break + if not found: + print(f" âš ï¸ æœªæ‰¾åˆ°åˆ—: {col_name}") + columns_to_keep_indices[col_name] = None + + # åˆ›å»ºç»“æžœæ•°æ®æ¡† + result_rows = [] + + # å¤„ç†æ¯ä¸€è¡Œ + print("\nå¼€å§‹å¤„ç†æ•°æ®...") + kept_count = 0 + deleted_count = 0 + + for idx in range(len(df)): + row = df.iloc[idx] + + # æå–日期(第一列) + date_value = row.iloc[date_col_idx] + + # 如果日期为空,跳过该行 + if pd.isna(date_value) or str(date_value).strip() == '': + deleted_count += 1 + continue + + # 创建结果行:日期 + ä¿ç•™çš„列 + result_row = [date_value] + + # 添加需è¦ä¿ç•™çš„列(按é…置顺åºï¼‰ + for col_name in columns_to_keep: + col_idx = columns_to_keep_indices.get(col_name) + if col_idx is not None: + # 找到匹é…çš„åˆ—ï¼Œè½¬æ¢æ•°å­—并添加 + value = row.iloc[col_idx] + converted_value = convert_to_yi(value) + result_row.append(converted_value) + else: + # 如果找ä¸åˆ°è¯¥åˆ—,添加空值 + result_row.append('') + + result_rows.append(result_row) + kept_count += 1 + + print(f"å…±ä¿ç•™ {kept_count} 行,删除 {deleted_count} 行") + + # åˆ›å»ºç»“æžœæ•°æ®æ¡† + # 列å:日期 + ä¿ç•™çš„列å + column_names = ['日期'] + columns_to_keep + result_df = pd.DataFrame(result_rows, columns=column_names) + + print("\n处ç†å®Œæˆï¼") + print(f"总行数: {len(result_df)}") + print(f"总列数: {len(result_df.columns)}") + print(f"ä¿ç•™çš„列: {', '.join(columns_to_keep[:3])}... (å…± {len(columns_to_keep)} 列)") + + return result_df + + +def process_cash_flow(input_file, config_file, output_file): + """ + 处ç†çް金æµé‡è¡¨æ–‡ä»¶å¹¶ä¿å­˜ + + 傿•°ï¼š + input_file: 输入的CSV/Excel文件路径 + config_file: é…置文件路径 + output_file: 输出文件路径 + """ + # 调用处ç†å‡½æ•°èŽ·å– DataFrame + result_df = process_cash_flow_return_df(input_file, config_file) + + # ä¿å­˜ç»“æžœ + print(f"\n正在ä¿å­˜ç»“果到: {output_file}") + + # 强制使用 xlsx æ ¼å¼ + if not output_file.endswith('.xlsx'): + output_file = output_file.rsplit('.', 1)[0] + '.xlsx' + + # ä¿å­˜æ—¶ä¸å†™å…¥åˆ—å和索引(因为第一行就是日期) + result_df.to_excel(output_file, index=False, header=True, engine='openpyxl') + + print(f"输出文件: {output_file}") + + +def main(): + """主函数""" + # 获å–脚本所在目录 + script_dir = Path(__file__).parent + + # 设置路径 + input_dir = script_dir / 'input' + config_dir = script_dir / 'config' + output_dir = script_dir / 'output' + + # 创建输出目录 + output_dir.mkdir(exist_ok=True) + + # é…置文件路径 + config_file = config_dir / 'cash_flow_config.json' + + if not config_file.exists(): + print(f"错误: é…置文件ä¸å­˜åœ¨: {config_file}") + return + + # 查找input目录下的文件 + if not input_dir.exists(): + print(f"错误: input目录ä¸å­˜åœ¨: {input_dir}") + return + + # èŽ·å–æ‰€æœ‰CSVå’ŒExcel文件(å¯ä»¥æ ¹æ®æ–‡ä»¶å筛选现金æµé‡è¡¨ï¼‰ + input_files = [] + for pattern in ['*现金æµé‡è¡¨*.csv', '*现金æµé‡è¡¨*.xlsx', '*现金æµé‡è¡¨*.xls', + '*cash*.csv', '*cash*.xlsx', '*cash*.xls']: + input_files.extend(list(input_dir.glob(pattern))) + + # åŽ»é‡ + input_files = list(set(input_files)) + + if not input_files: + print(f"警告: 在 {input_dir} 目录下未找到现金æµé‡è¡¨æ–‡ä»¶") + print("æç¤º: 文件å应包å«'现金æµé‡è¡¨'或'cash'") + print("\nå¦‚éœ€å¤„ç†æ‰€æœ‰æ–‡ä»¶ï¼Œè¯·ä¿®æ”¹è„šæœ¬ä¸­çš„æ–‡ä»¶åŒ¹é…规则") + + # å¤‡é€‰ï¼šå¤„ç†æ‰€æœ‰æ–‡ä»¶ + all_files = list(input_dir.glob('*.csv')) + \ + list(input_dir.glob('*.xlsx')) + \ + list(input_dir.glob('*.xls')) + + if all_files: + print(f"\nå‘现 {len(all_files)} 个文件,是å¦å…¨éƒ¨å¤„ç†ï¼Ÿ") + input_files = all_files + + if not input_files: + print("未找到任何文件") + return + + print(f"找到 {len(input_files)} 个文件待处ç†\n") + + # å¤„ç†æ¯ä¸ªæ–‡ä»¶ + for input_file in input_files: + print(f"\n{'='*60}") + print(f"å¤„ç†æ–‡ä»¶: {input_file.name}") + print(f"{'='*60}") + + # 生æˆè¾“出文件å(统一使用 .xlsx 扩展å,去除"åˆå¹¶æŠ¥è¡¨_") + base_name = input_file.stem # ä¸å¸¦æ‰©å±•å的文件å + # æ¸…ç†æ–‡ä»¶å + import re + base_name = base_name.replace('åˆå¹¶æŠ¥è¡¨_', '').replace('åˆå¹¶æŠ¥è¡¨', '') + base_name = re.sub(r'_+', '_', base_name).strip('_') + output_file = output_dir / f"{base_name}.xlsx" + + try: + process_cash_flow( + str(input_file), + str(config_file), + str(output_file) + ) + except Exception as e: + print(f"å¤„ç†æ–‡ä»¶æ—¶å‡ºé”™: {e}") + import traceback + traceback.print_exc() + + print(f"\n{'='*60}") + print("所有文件处ç†å®Œæˆï¼") + print(f"结果ä¿å­˜åœ¨: {output_dir}") + print(f"{'='*60}") + + +if __name__ == '__main__': + main() diff --git a/process_income_statement.py b/process_income_statement.py new file mode 100644 index 0000000..eca37c7 --- /dev/null +++ b/process_income_statement.py @@ -0,0 +1,320 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +利润表数æ®å¤„ç†è„šæœ¬ +功能: +1. 将数字转æ¢ä¸ºä»¥äº¿ä¸ºå•ä½ï¼ˆä¿ç•™ä¸¤ä½å°æ•°ï¼‰ +2. 删除é…置文件中指定的行 +3. 第一行为日期 +4. 输出为 Excel æ ¼å¼ +""" + +import pandas as pd +import json +import os +from pathlib import Path + + +def load_config(config_path): + """加载é…置文件""" + with open(config_path, 'r', encoding='utf-8') as f: + config = json.load(f) + return config + + +def is_decimal_number(value): + """判断是å¦ä¸ºå°æ•°ï¼ˆç»å¯¹å€¼å°äºŽ1的数字)""" + if pd.isna(value) or value == '' or value is None: + return False + + try: + num = float(value) + # 如果ç»å¯¹å€¼å°äºŽ1ï¼Œè®¤ä¸ºæ˜¯å°æ•°/比率 + return abs(num) < 1 + except (ValueError, TypeError): + return False + + +def is_large_number(value): + """判断是å¦ä¸ºéœ€è¦è½¬æ¢çš„大数字(ç»å¯¹å€¼>=1)""" + if pd.isna(value) or value == '' or value is None: + return False + + try: + num = float(value) + # 如果ç»å¯¹å€¼>=1,认为是需è¦è½¬æ¢çš„大数字 + return abs(num) >= 1 + except (ValueError, TypeError): + return False + + +def convert_to_yi(value): + """将数字转æ¢ä¸ºä»¥äº¿ä¸ºå•ä½ï¼Œä¿ç•™ä¸¤ä½å°æ•°""" + if pd.isna(value) or value == '' or value is None: + return value + + # 统一转æ¢ä¸ºæµ®ç‚¹æ•°è¿›è¡Œå¤„ç† + num = None + + # å¦‚æžœå·²ç»æ˜¯æ•°å€¼ç±»åž‹ï¼Œç›´æŽ¥ä½¿ç”¨ + if isinstance(value, (int, float)): + num = float(value) + else: + # 处ç†å­—ç¬¦ä¸²æ ¼å¼ + try: + # 转æ¢ä¸ºå­—ç¬¦ä¸²å¹¶æ¸…ç† + str_value = str(value).strip() + + # 去除等å·ï¼ˆExcel公弿 ¼å¼ï¼Œå¦‚ "=557395000000") + if str_value.startswith('='): + str_value = str_value[1:] + + # 去除常è§çš„æ•°å­—æ ¼å¼å­—符(逗å·ã€ç©ºæ ¼ç­‰ï¼‰ + str_value = str_value.replace(',', '').replace(' ', '').replace(',', '') + + # 如果为空,返回原值 + if str_value == '' or str_value.lower() == 'nan': + return value + + # 转æ¢ä¸ºæµ®ç‚¹æ•°ï¼ˆæ”¯æŒç§‘学计数法,如 "2.07327E+12") + num = float(str_value) + except (ValueError, TypeError): + # 如果无法转æ¢ï¼Œè¿”回原值 + return value + + # 如果æˆåŠŸè½¬æ¢ä¸ºæ•°å­— + if num is not None: + # å¦‚æžœæ˜¯å°æ•°ï¼ˆæ¯”率),返回去除等å·åŽçš„值 + if abs(num) < 1: + # 如果原值是字符串且以等å·å¼€å¤´ï¼Œè¿”回去除等å·åŽçš„值 + if isinstance(value, str) and value.strip().startswith('='): + return str_value + return value + + # 转æ¢ä¸ºäº¿ï¼Œä¿ç•™ä¸¤ä½å°æ•° + yi_value = num / 100000000 + return round(yi_value, 2) + + # 如果无法处ç†ï¼Œè¿”回原值 + return value + + +def find_row_by_name(df, row_name): + """åœ¨æ•°æ®æ¡†ä¸­æŸ¥æ‰¾æŒ‡å®šå称的行""" + first_col = df.iloc[:, 0] + + # å°è¯•ç²¾ç¡®åŒ¹é… + mask = first_col == row_name + if mask.any(): + return df[mask] + + # å°è¯•模糊匹é…(去除空格) + mask = first_col.str.strip() == row_name.strip() + if mask.any(): + return df[mask] + + return None + + +def process_income_statement_return_df(input_file, config_file): + """ + 处ç†åˆ©æ¶¦è¡¨æ–‡ä»¶å¹¶è¿”回 DataFrame + + 傿•°ï¼š + input_file: 输入的CSV/Excel文件路径 + config_file: é…置文件路径 + + 返回: + pandas.DataFrame: 处ç†åŽçš„æ•°æ®æ¡† + """ + print(f"æ­£åœ¨è¯»å–æ–‡ä»¶: {input_file}") + + # è¯»å–æ•°æ®æ–‡ä»¶ + if input_file.endswith('.csv'): + df = pd.read_csv(input_file, encoding='utf-8') + else: + df = pd.read_excel(input_file) + + print(f"æ–‡ä»¶è¯»å–æˆåŠŸï¼Œå…± {len(df)} 行") + + # 加载é…置文件 + config = load_config(config_file) + rows_to_delete = config.get('rows_to_delete', []) + print(f"é…置文件加载æˆåŠŸï¼Œéœ€è¦åˆ é™¤ {len(rows_to_delete)} ç§è¡Œ") + + # 记录è¦åˆ é™¤çš„行索引 + indices_to_delete = set() + + # 查找并标记è¦åˆ é™¤çš„行 + for row_name in rows_to_delete: + row_data = find_row_by_name(df, row_name) + if row_data is not None and len(row_data) > 0: + for idx in row_data.index: + indices_to_delete.add(idx) + print(f" 标记删除: {row_name}") + + print(f"\n共标记 {len(indices_to_delete)} 行待删除") + + # åˆ›å»ºç»“æžœæ•°æ®æ¡† + result_rows = [] + + # 首先添加日期行 + date_row = find_row_by_name(df, '日期') + date_idx = None + if date_row is not None and len(date_row) > 0: + date_idx = date_row.index[0] + result_rows.append(df.iloc[date_idx].tolist()) + indices_to_delete.add(date_idx) + print("已添加日期行作为第一行") + else: + print("警告: 未找到日期行") + + # 处ç†å…¶ä»–行 + print("\nå¼€å§‹å¤„ç†æ•°æ®...") + processed_count = 0 + + for idx in range(len(df)): + # 跳过è¦åˆ é™¤çš„行 + if idx in indices_to_delete: + continue + + row = df.iloc[idx].tolist() + processed_row = [] + + # å¤„ç†æ¯ä¸€åˆ— + for col_idx, value in enumerate(row): + if col_idx == 0: + # 第一列是å称,ä¸å¤„ç† + processed_row.append(value) + else: + # 其他列,转æ¢å¤§æ•°å­—为亿 + converted_value = convert_to_yi(value) + processed_row.append(converted_value) + + result_rows.append(processed_row) + processed_count += 1 + + print(f"å…±å¤„ç† {processed_count} 行数æ®") + + # åˆ›å»ºç»“æžœæ•°æ®æ¡†ï¼ˆä¸ä½¿ç”¨åˆ—å) + result_df = pd.DataFrame(result_rows) + + print("\n处ç†å®Œæˆï¼") + print(f"总行数: {len(result_df)}") + + return result_df + + +def process_income_statement(input_file, config_file, output_file): + """ + 处ç†åˆ©æ¶¦è¡¨æ–‡ä»¶å¹¶ä¿å­˜ + + 傿•°ï¼š + input_file: 输入的CSV/Excel文件路径 + config_file: é…置文件路径 + output_file: 输出文件路径 + """ + # 调用处ç†å‡½æ•°èŽ·å– DataFrame + result_df = process_income_statement_return_df(input_file, config_file) + + # ä¿å­˜ç»“æžœ + print(f"\n正在ä¿å­˜ç»“果到: {output_file}") + + # 强制使用 xlsx æ ¼å¼ + if not output_file.endswith('.xlsx'): + output_file = output_file.rsplit('.', 1)[0] + '.xlsx' + + # ä¿å­˜æ—¶ä¸å†™å…¥åˆ—å和索引 + result_df.to_excel(output_file, index=False, header=False, engine='openpyxl') + + print(f"输出文件: {output_file}") + + +def main(): + """主函数""" + # 获å–脚本所在目录 + script_dir = Path(__file__).parent + + # 设置路径 + input_dir = script_dir / 'input' + config_dir = script_dir / 'config' + output_dir = script_dir / 'output' + + # 创建输出目录 + output_dir.mkdir(exist_ok=True) + + # é…置文件路径 + config_file = config_dir / 'income_statement_config.json' + + if not config_file.exists(): + print(f"错误: é…置文件ä¸å­˜åœ¨: {config_file}") + return + + # 查找input目录下的文件 + if not input_dir.exists(): + print(f"错误: input目录ä¸å­˜åœ¨: {input_dir}") + return + + # èŽ·å–æ‰€æœ‰CSVå’ŒExcel文件(å¯ä»¥æ ¹æ®æ–‡ä»¶å筛选利润表) + input_files = [] + for pattern in ['*利润表*.csv', '*利润表*.xlsx', '*利润表*.xls', + '*income*.csv', '*income*.xlsx', '*income*.xls']: + input_files.extend(list(input_dir.glob(pattern))) + + # åŽ»é‡ + input_files = list(set(input_files)) + + if not input_files: + print(f"警告: 在 {input_dir} 目录下未找到利润表文件") + print("æç¤º: 文件å应包å«'利润表'或'income'") + print("\nå¦‚éœ€å¤„ç†æ‰€æœ‰æ–‡ä»¶ï¼Œè¯·ä¿®æ”¹è„šæœ¬ä¸­çš„æ–‡ä»¶åŒ¹é…规则") + + # å¤‡é€‰ï¼šå¤„ç†æ‰€æœ‰æ–‡ä»¶ + all_files = list(input_dir.glob('*.csv')) + \ + list(input_dir.glob('*.xlsx')) + \ + list(input_dir.glob('*.xls')) + + if all_files: + print(f"\nå‘现 {len(all_files)} 个文件,是å¦å…¨éƒ¨å¤„ç†ï¼Ÿ") + input_files = all_files + + if not input_files: + print("未找到任何文件") + return + + print(f"找到 {len(input_files)} 个文件待处ç†\n") + + # å¤„ç†æ¯ä¸ªæ–‡ä»¶ + for input_file in input_files: + print(f"\n{'='*60}") + print(f"å¤„ç†æ–‡ä»¶: {input_file.name}") + print(f"{'='*60}") + + # 生æˆè¾“出文件å(统一使用 .xlsx 扩展å,去除"åˆå¹¶æŠ¥è¡¨_") + base_name = input_file.stem # ä¸å¸¦æ‰©å±•å的文件å + # æ¸…ç†æ–‡ä»¶å + import re + base_name = base_name.replace('åˆå¹¶æŠ¥è¡¨_', '').replace('åˆå¹¶æŠ¥è¡¨', '') + base_name = re.sub(r'_+', '_', base_name).strip('_') + output_file = output_dir / f"{base_name}.xlsx" + + try: + process_income_statement( + str(input_file), + str(config_file), + str(output_file) + ) + except Exception as e: + print(f"å¤„ç†æ–‡ä»¶æ—¶å‡ºé”™: {e}") + import traceback + traceback.print_exc() + + print(f"\n{'='*60}") + print("所有文件处ç†å®Œæˆï¼") + print(f"结果ä¿å­˜åœ¨: {output_dir}") + print(f"{'='*60}") + + +if __name__ == '__main__': + main() + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..48f8f8a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +pandas>=2.0.0 +openpyxl>=3.0.0 + diff --git a/利润表处ç†è¯´æ˜Ž.md b/利润表处ç†è¯´æ˜Ž.md new file mode 100644 index 0000000..03e352c --- /dev/null +++ b/利润表处ç†è¯´æ˜Ž.md @@ -0,0 +1,214 @@ +# 利润表数æ®å¤„ç†å·¥å…·ä½¿ç”¨è¯´æ˜Ž + +## 📋 åŠŸèƒ½ä»‹ç» + +本工具用于处ç†åˆ©æ¶¦è¡¨æ•°æ®ï¼Œä¸»è¦åŠŸèƒ½ï¼š + +1. **æ•°å­—å•ä½è½¬æ¢**:将大数字(≥1)转æ¢ä¸ºä»¥äº¿ä¸ºå•ä½ï¼Œä¿ç•™ä¸¤ä½å°æ•° +2. **ä¿ç•™å°æ•°**ï¼šå°æ•°/比率(<1ï¼‰ä¿æŒä¸å˜ +3. **删除指定行**:根æ®é…置删除ä¸éœ€è¦çš„行 +4. **日期置顶**:第一行显示日期 +5. **输出 Excel**:统一输出为 `.xlsx` æ ¼å¼ + +--- + +## 🚀 快速开始 + +### 1. 准备利润表文件 + +将利润表文件(CSV 或 Excel)放入 `input/` 目录 + +**文件命å建议**:文件å包å«"利润表"或"income",如: + +- `美的集团_利润表_åˆå¹¶æŠ¥è¡¨_20251106.csv` +- `income_statement.xlsx` + +### 2. è¿è¡Œå¤„ç†è„šæœ¬ + +```bash +python3 process_income_statement.py +``` + +### 3. 查看结果 + +处ç†åŽçš„æ–‡ä»¶ä¿å­˜åœ¨ `output/` ç›®å½•ï¼Œæ–‡ä»¶åæ ¼å¼ï¼š`processed_原文件å.xlsx` + +--- + +## âš™ï¸ é…置文件说明 + +é…置文件ä½äºŽï¼š`config/income_statement_config.json` + +### 默认é…ç½® + +```json +{ + "rows_to_delete": [ + "股票代ç ", + "上市公å¸", + "财报类型", + "è´§å¸", + "审计æ„è§", + "会计师事务所", + "æ•°æ®æ¥æºäºŽï¼šç†æä»ç½‘ç«™(lixinger.com)" + ] +} +``` + +### 自定义é…ç½® + +如需删除其他行,直接在 `rows_to_delete` 数组中添加: + +```json +{ + "rows_to_delete": ["股票代ç ", "上市公å¸", "ä½ è¦åˆ é™¤çš„行åç§°"] +} +``` + +--- + +## 📊 æ•°æ®è½¬æ¢è§„则 + +### 规则说明 + +| åŽŸå§‹æ•°æ® | 判断标准 | 转æ¢ç»“æžœ | 示例 | +| --------- | ---------- | ------------------------ | ---------------- | +| 大数字 | ç»å¯¹å€¼ ≥ 1 | 除以 1 亿,ä¿ç•™ 2 ä½å°æ•° | 123456789 → 1.23 | +| å°æ•°/比率 | ç»å¯¹å€¼ < 1 | ä¿æŒä¸å˜ | 0.15 → 0.15 | +| 空值 | - | ä¿æŒç©º | - | + +### 示例 + +**输入数æ®ï¼š** + +``` +è¥ä¸šæ”¶å…¥,381900000000,343200000000 +毛利率,0.2543,0.2489 +``` + +**输出数æ®ï¼š** + +``` +è¥ä¸šæ”¶å…¥,3819.00,3432.00 +毛利率,0.2543,0.2489 +``` + +--- + +## ðŸ“ è¾“å‡ºæ ¼å¼ + +### 文件结构 + +``` +第1行:日期 2024/12/31 2023/12/31 2022/12/31 ... +第2行:è¥ä¸šæ”¶å…¥ 3819.00 3432.00 3200.50 ... +第3行:è¥ä¸šæˆæœ¬ 2848.12 2578.45 2401.32 ... +第4行:毛利率 0.2543 0.2489 0.2498 ... +... +``` + +### 特点 + +- ✅ 第一行是日期 +- ✅ 大数字转æ¢ä¸ºäº¿ï¼ˆä¿ç•™ 2 ä½å°æ•°ï¼‰ +- ✅ æ¯”çŽ‡ä¿æŒåŽŸæ · +- ✅ 删除了é…置中指定的行 +- ✅ 输出为 Excel æ ¼å¼ + +--- + +## 🔧 常è§é—®é¢˜ + +### Q1: å¦‚ä½•åˆ¤æ–­å“ªäº›æ˜¯å°æ•°/比率? + +**A**: 脚本自动判断:ç»å¯¹å€¼ < 1 çš„æ•°å­—ä¿æŒä¸å˜ï¼Œâ‰¥ 1 的转æ¢ä¸ºäº¿ + +### Q2: 如何添加è¦åˆ é™¤çš„行? + +**A**: 编辑 `config/income_statement_config.json`,在 `rows_to_delete` 中添加行åç§° + +### Q3: æ–‡ä»¶æ²¡æœ‰è¢«å¤„ç†æ€Žä¹ˆåŠžï¼Ÿ + +**A**: + +1. 检查文件是å¦åœ¨ `input/` 目录 +2. 文件å建议包å«"利润表"或"income" +3. 如果文件åä¸ç¬¦åˆè§„则,脚本会æç¤ºæ˜¯å¦å¤„ç†æ‰€æœ‰æ–‡ä»¶ + +### Q4: å¦‚ä½•å¤„ç†æ‰€æœ‰æ–‡ä»¶ï¼Ÿ + +**A**: 如果文件åä¸åŒ…å«"利润表"或"income",脚本会询问是å¦å¤„ç†æ‰€æœ‰æ–‡ä»¶ + +--- + +## 📂 目录结构 + +``` +organize_excel_data/ +├── config/ +│ ├── balance_sheet_categories.json # 资产负债表é…ç½® +│ └── income_statement_config.json # 利润表é…置(新增) +├── input/ +│ └── [你的利润表文件] +├── output/ +│ └── processed_[原文件å].xlsx +├── process_balance_sheet.py # 资产负债表处ç†è„šæœ¬ +├── process_income_statement.py # 利润表处ç†è„šæœ¬ï¼ˆæ–°å¢žï¼‰ +└── 利润表处ç†è¯´æ˜Ž.md # 本文档 +``` + +--- + +## 💡 使用示例 + +### 示例 1:处ç†å•个文件 + +```bash +# 1. 将文件放入 input 目录 +cp 美的集团_利润表.csv input/ + +# 2. è¿è¡Œè„šæœ¬ +python3 process_income_statement.py + +# 3. 查看结果 +open output/processed_美的集团_利润表.xlsx +``` + +### 示例 2:批é‡å¤„ç† + +```bash +# 1. 将多个文件放入 input 目录 +cp *利润表*.csv input/ + +# 2. è¿è¡Œè„šæœ¬ï¼ˆè‡ªåŠ¨å¤„ç†æ‰€æœ‰åˆ©æ¶¦è¡¨æ–‡ä»¶ï¼‰ +python3 process_income_statement.py + +# 3. 查看 output 目录 +ls output/ +``` + +--- + +## âš ï¸ æ³¨æ„事项 + +1. **æ•°æ®ç²¾åº¦**:转æ¢ä¸ºäº¿åŽä¿ç•™ 2 ä½å°æ•°ï¼Œå¯èƒ½æŸå¤±ç²¾åº¦ +2. **å°æ•°åˆ¤æ–­**:ç»å¯¹å€¼ < 1 的数字被认为是比率,ä¸ä¼šè½¬æ¢ +3. **行å称匹é…**:删除行时需è¦å®Œå…¨åŒ¹é…(包括空格和标点) +4. **日期行**:必须有"日期"这一行,å¦åˆ™æ— æ³•正确放置第一行 +5. **输出覆盖**:åŒå输出文件会被覆盖 + +--- + +## 🎯 与资产负债表处ç†çš„区别 + +| 特性 | 资产负债表 | 利润表 | +| -------- | ------------------------------- | ------------------------------ | +| 脚本åç§° | `process_balance_sheet.py` | `process_income_statement.py` | +| 主è¦åŠŸèƒ½ | 分类汇总 | å•ä½è½¬æ¢ + 删除行 | +| æ•°å­—å¤„ç† | ä¿æŒåŽŸå§‹æ•°æ® | 转æ¢ä¸ºäº¿ï¼ˆä¿ç•™ 2 ä½å°æ•°ï¼‰ | +| é…置文件 | `balance_sheet_categories.json` | `income_statement_config.json` | +| è¾“å‡ºæ ¼å¼ | 按分类组织 | ä¿æŒåŽŸå§‹é¡ºåº | + +--- + +**如有问题,请å‚考详细文档 README.md 或查看示例输出** diff --git a/更新日志.md b/更新日志.md new file mode 100644 index 0000000..1a42819 --- /dev/null +++ b/更新日志.md @@ -0,0 +1,112 @@ +# 更新日志 + +## v1.2 - 2025-11-09 进一步优化 + +### ✨ 新增优化 + +1. **第一行显示日期而éžè‚¡ç¥¨ä»£ç ** + + - 输出文件的第一行现在是"日期"行,直接显示å„年份的日期 + - 移除了"股票代ç "è¡Œï¼Œä½¿æ•°æ®æ›´åŠ ç®€æ´ + - 日期格å¼ï¼š`日期 2024/12/31 2023/12/31 2022/12/31 ...` + +2. **简化特殊分类åç§°** + + - "一ã€èµ„产总计" → "资产总计" + - "ä¸‰ã€æ‰€æœ‰è€…æƒç›Šåˆè®¡" → "所有者æƒç›Šåˆè®¡" + - "二ã€è´Ÿå€ºåˆè®¡" → "负债åˆè®¡" + - 使用é…置文件中定义的 nameï¼Œè¾“å‡ºæ›´åŠ ç®€æ´ + +3. **完善分类é…ç½®** + - æŠ•èµ„èµ„äº§å¢žåŠ ï¼šå€ºæƒæŠ•èµ„ã€å…¶ä»–å€ºæƒæŠ•èµ„ã€æŒæœ‰è‡³åˆ°æœŸæŠ•èµ„ã€æŠ•èµ„æ€§æˆ¿åœ°äº§ + - 有æ¯è´Ÿå€ºå¢žåŠ ï¼šå‘中央银行借款ã€å–出回购金èžèµ„产 + - ç»è¥æ€§è´Ÿå€ºå¢žåŠ ï¼šå¸æ”¶å­˜æ¬¾åŠåŒä¸šå­˜æ”¾ã€é•¿æœŸåº”付èŒå·¥è–ªé…¬ + +### 📊 输出示例 + +``` +第1行:日期 2024/12/31 2023/12/31 2022/12/31 ... +第2行:资产总计 604,352亿 486,038亿 422,555亿 ... +第3行:所有者æƒç›Šåˆè®¡ 227,667亿 174,300亿 151,924亿 ... +第4行:负债åˆè®¡ 376,684亿 311,739亿 270,631亿 ... +... +``` + +--- + +## v1.1 - 2025-11-09 优化版本 + +### ✨ 新增功能 + +1. **统一输出格å¼ä¸º Excel (.xlsx)** + + - 所有输出文件统一为 `.xlsx` æ ¼å¼ï¼Œæ— è®ºè¾“入是 CSV 还是 Excel + - 输出文件命å:`organized_[原文件å].xlsx` + +2. **分类自动汇总功能** + + - 普通分类(类现金ã€åº”æ”¶è´¦æ¬¾ã€æŠ•èµ„èµ„äº§ç­‰ï¼‰ä¼šåœ¨åˆ†ç±»æ ‡é¢˜è¡Œæ˜¾ç¤ºè¯¥åˆ†ç±»ä¸‹æ‰€æœ‰é¡¹ç›®çš„é‡‘é¢æ€»å’Œ + - æ¯åˆ—独立计算汇总值 + - 汇总行ä½äºŽè¯¥åˆ†ç±»çš„æ˜Žç»†é¡¹ç›®ä¹‹å‰ + +3. **特殊分类优化** + - èµ„äº§æ€»è®¡ã€æ‰€æœ‰è€…æƒç›Šåˆè®¡ã€è´Ÿå€ºåˆè®¡è¿™ä¸‰ä¸ªç‰¹æ®Šåˆ†ç±»ç›´æŽ¥æ˜¾ç¤ºæ•°æ® + - ä¸é¢å¤–æ·»åŠ åˆ†ç±»æ ‡é¢˜è¡Œï¼Œä¿æŒç®€æ´ + +### 🔧 技术改进 + +- 新增 `safe_float_convert()` 函数,安全处ç†å„ç§æ•°å€¼æ ¼å¼ +- 优化分类处ç†é€»è¾‘,区分特殊分类和普通分类 +- 改进输出文件扩展å处ç†ï¼Œå¼ºåˆ¶ä½¿ç”¨ `.xlsx` + +### 📊 输出示例 + +``` +一ã€èµ„产总计 604,352,000,000 486,038,000,000 ... +ä¸‰ã€æ‰€æœ‰è€…æƒç›Šåˆè®¡ 227,667,000,000 174,300,000,000 ... +二ã€è´Ÿå€ºåˆè®¡ 376,684,000,000 311,739,000,000 ... +类现金 216,678,221,000 142,001,262,000 ... ↠汇总行 + è´§å¸èµ„金 140,410,000,000 81,673,846,000 ... + 交易性金èžèµ„产 6,936,113,000 1,790,588,000 ... + è¡ç”Ÿé‡‘èžèµ„产(æµåЍ) 2,449,535,000 1,278,161,000 ... + 应收票æ®åŠåº”收账款 42,517,549,000 38,406,699,000 ... + (其中)åº”æ”¶ç¥¨æ® 6,718,575,000 5,521,960,000 ... + 应收款项èžèµ„ 17,646,449,000 13,330,008,000 ... +``` + +### ✅ 验è¯ç»“æžœ + +- ✓ 输出格å¼ï¼š`.xlsx` +- ✓ 特殊分类:直接显示数æ®ï¼Œæ— é¢å¤–标题行 +- ✓ 普通分类:汇总行计算正确 +- ✓ æµ‹è¯•æ–‡ä»¶ï¼šç¾Žçš„é›†å›¢èµ„äº§è´Ÿå€ºè¡¨å¤„ç†æˆåŠŸ + +--- + +## v1.0 - 2025-11-09 åˆå§‹ç‰ˆæœ¬ + +### 🎯 核心功能 + +1. æ”¯æŒ CSV å’Œ Excel 文件输入 +2. æŒ‰ç…§é¢„å®šä¹‰åˆ†ç±»é‡æ–°ç»„ç»‡èµ„äº§è´Ÿå€ºè¡¨æ•°æ® +3. 自定义分类é…置(JSON æ ¼å¼ï¼‰ +4. 批é‡å¤„ç†å¤šä¸ªæ–‡ä»¶ +5. 未分类项目å•独列出 + +### 📠é…置的分类 + +- 资产总计 +- 所有者æƒç›Šåˆè®¡ +- 负债åˆè®¡ +- 类现金(6 项) +- 应收账款(5 项) +- 投资资产(4 项) +- ç»è¥ç±»èµ„产(12 项) +- 有æ¯è´Ÿå€ºï¼ˆ6 项) +- ç»è¥æ€§è´Ÿå€ºï¼ˆ15 项) + +### 📦 输出说明 + +- 输出格å¼ï¼šCSV/Excel +- åˆ†ç±»æ•°æ® + 3 行空行 + æœªåˆ†ç±»æ•°æ® +- 文件命å:`organized_[原文件å]` diff --git a/资产负债表处ç†è¯´æ˜Ž.md b/资产负债表处ç†è¯´æ˜Ž.md new file mode 100644 index 0000000..b17ec8a --- /dev/null +++ b/资产负债表处ç†è¯´æ˜Ž.md @@ -0,0 +1,276 @@ +# 资产负债表数æ®å¤„ç†å·¥å…·ä½¿ç”¨è¯´æ˜Ž + +## 📋 åŠŸèƒ½ä»‹ç» + +本工具用于处ç†èµ„产负债表数æ®ï¼Œä¸»è¦åŠŸèƒ½ï¼š + +1. **分类é‡ç»„**ï¼šæŒ‰ç…§é¢„å®šä¹‰åˆ†ç±»é‡æ–°ç»„ç»‡æ•°æ® +2. **自动汇总**:计算æ¯ä¸ªåˆ†ç±»çš„金颿€»å’Œ +3. **日期置顶**:第一行显示日期 +4. **å称简化**:特殊分类使用简化åç§° +5. **输出 Excel**:统一输出为 `.xlsx` æ ¼å¼ + +--- + +## 🚀 快速开始 + +### 1. 准备资产负债表文件 + +将资产负债表文件(CSV 或 Excel)放入 `input/` 目录 + +**文件命å建议**:文件å包å«"资产负债表",如: + +- `美的集团_资产负债表_åˆå¹¶æŠ¥è¡¨_20251106.csv` +- `balance_sheet.xlsx` + +### 2. è¿è¡Œå¤„ç†è„šæœ¬ + +```bash +python3 process_balance_sheet.py +``` + +### 3. 查看结果 + +处ç†åŽçš„æ–‡ä»¶ä¿å­˜åœ¨ `output/` ç›®å½•ï¼Œæ–‡ä»¶åæ ¼å¼ï¼š`organized_原文件å.xlsx` + +--- + +## 📊 分类说明 + +é…置文件定义了以下 9 个分类: + +### 1. 资产总计 + +- 一ã€èµ„产总计 + +### 2. 所有者æƒç›Šåˆè®¡ + +- ä¸‰ã€æ‰€æœ‰è€…æƒç›Šåˆè®¡ + +### 3. 负债åˆè®¡ + +- 二ã€è´Ÿå€ºåˆè®¡ + +### 4. 类现金(6 项) + +- è´§å¸èµ„金 +- 交易性金èžèµ„产 +- è¡ç”Ÿé‡‘èžèµ„产(æµåЍ) +- 应收票æ®åŠåº”收账款 +- (其中)åº”æ”¶ç¥¨æ® +- 应收款项èžèµ„ + +### 5. 应收账款(5 项) + +- (其中)应收账款 +- 其他应收款 +- åˆåŒèµ„产 +- 长期应收款 +- ä¸€å¹´å†…åˆ°æœŸçš„éžæµåŠ¨èµ„äº§ + +### 6. 投资资产(8 项) + +- å€ºæƒæŠ•èµ„ +- å…¶ä»–å€ºæƒæŠ•èµ„ +- å¯ä¾›å‡ºå”®é‡‘èžèµ„产(éžæµåЍ) +- æŒæœ‰è‡³åˆ°æœŸæŠ•资 +- é•¿æœŸè‚¡æƒæŠ•èµ„ +- å…¶ä»–æƒç›Šå·¥å…·æŠ•资 +- å…¶ä»–éžæµåЍ金èžèµ„产 +- 投资性房地产 + +### 7. ç»è¥ç±»èµ„产(12 项) + +- å…¶ä»–æµåŠ¨èµ„äº§ +- 存货 +- æŒæœ‰å¾…售资产 +- 固定资产 +- 在建工程 +- 使用æƒèµ„产 +- 无形资产 +- 商誉 +- 预付款项 +- 长期待摊费用 +- 递延所得税资产 +- å…¶ä»–éžæµåŠ¨èµ„äº§ + +### 8. 有æ¯è´Ÿå€ºï¼ˆ8 项) + +- 短期借款 +- å‘中央银行借款 +- 交易性金èžè´Ÿå€º +- è¡ç”Ÿé‡‘èžè´Ÿå€º +- å–出回购金èžèµ„产 +- 长期借款 +- 应付债券 +- ä¸€å¹´å†…åˆ°æœŸçš„éžæµåŠ¨è´Ÿå€º + +### 9. ç»è¥æ€§è´Ÿå€ºï¼ˆ17 项) + +- 应付票æ®åŠåº”付账款 +- (其中)åº”ä»˜ç¥¨æ® +- (其中)应付账款 +- 预收账款 +- åˆåŒè´Ÿå€º +- 叿”¶å­˜æ¬¾åŠåŒä¸šå­˜æ”¾ +- 应付èŒå·¥è–ªé…¬ +- 应交税费 +- 其他应付款 +- å…¶ä»–æµåŠ¨è´Ÿå€º +- ç§Ÿèµè´Ÿå€º +- 长期应付款 +- 长期应付èŒå·¥è–ªé…¬ +- 预计负债(éžæµåЍ) +- 长期递延收益 +- 递延所得税负债 +- å…¶ä»–éžæµåŠ¨è´Ÿå€º + +--- + +## ðŸ“ è¾“å‡ºæ ¼å¼ + +### 文件结构 + +``` +第1行:日期 2024/12/31 2023/12/31 2022/12/31 ... +第2行:资产总计 604,352亿 486,038亿 422,555亿 ... +第3行:所有者æƒç›Šåˆè®¡ 227,667亿 174,300亿 151,924亿 ... +第4行:负债åˆè®¡ 376,684亿 311,739亿 270,631亿 ... +第5行:类现金 216,678亿 142,001亿 110,501亿 ... ↠汇总行 +第6行: è´§å¸èµ„金 140,410亿 81,674亿 55,270亿 ... +第7行: 交易性金èžèµ„产 6,936亿 1,791亿 3,285亿 ... +... +[空3行] +未分类项目 + [未在é…置中的项目] +``` + +### 输出说明 + +1. **第一行**:日期行,显示å„年份的日期(如:日期, 2024/12/31, 2023/12/31, ...) +2. **特殊分类**ï¼šèµ„äº§æ€»è®¡ã€æ‰€æœ‰è€…æƒç›Šåˆè®¡ã€è´Ÿå€ºåˆè®¡è¿™ä¸‰é¡¹ç›´æŽ¥æ˜¾ç¤ºæ•°æ®ï¼Œä¸é¢å¤–添加分类标题行 + - å称已简化(如:"一ã€èµ„产总计" → "资产总计") + - 使用é…置文件中定义的 name +3. **普通分类**:其他分类会添加分类标题行,该行显示该分类下所有项目的**汇总金é¢**ï¼Œç„¶åŽæ˜¯æ˜Žç»†é¡¹ç›® +4. **空行分隔**:在已分类数æ®å’Œæœªåˆ†ç±»æ•°æ®ä¹‹é—´æœ‰ 3 行空行 +5. **未分类项目**:é…置文件中未定义的项目会放在最åŽï¼Œæ ‡é¢˜ä¸º"未分类项目" +6. **输出格å¼**:统一输出为 `.xlsx` æ ¼å¼ï¼ˆExcel 文件) + +--- + +## âš™ï¸ è‡ªå®šä¹‰é…ç½® + +### é…置文件ä½ç½® + +`config/balance_sheet_categories.json` + +### é…ç½®æ ¼å¼ + +```json +{ + "categories": [ + { + "name": "分类åç§°", + "items": ["项目1", "项目2"] + } + ] +} +``` + +### 傿•°è¯´æ˜Ž + +- `name`:分类的显示åç§° +- `items`:该分类包å«çš„项目列表(需è¦ä¸ŽåŽŸå§‹æ•°æ®ä¸­çš„字段å称完全匹é…) + +### 添加新分类 + +```json +{ + "categories": [ + { + "name": "你的分类åç§°", + "items": ["项目åç§°1", "项目åç§°2", "项目åç§°3"] + } + ] +} +``` + +âš ï¸ **注æ„**:项目å称必须与原始数æ®ä¸­çš„字段åç§°**完全匹é…**(包括空格和标点符å·ï¼‰ + +--- + +## 💡 使用示例 + +### 示例 1:处ç†å•个文件 + +```bash +# 1. 将文件放入 input 目录 +cp 美的集团_资产负债表.csv input/ + +# 2. è¿è¡Œè„šæœ¬ +python3 process_balance_sheet.py + +# 3. 查看结果 +open output/organized_美的集团_资产负债表.xlsx +``` + +### 示例 2:批é‡å¤„ç† + +```bash +# 1. 将多个文件放入 input 目录 +cp *资产负债表*.csv input/ + +# 2. è¿è¡Œè„šæœ¬ï¼ˆè‡ªåŠ¨å¤„ç†æ‰€æœ‰æ–‡ä»¶ï¼‰ +python3 process_balance_sheet.py + +# 3. 查看 output 目录 +ls output/ +``` + +--- + +## 🔧 常è§é—®é¢˜ + +### Q1: 为什么æŸäº›é¡¹ç›®æ²¡æœ‰è¢«åˆ†ç±»ï¼Ÿ + +**A**: 请检查é…置文件中的项目å称是å¦ä¸ŽåŽŸå§‹æ•°æ®ä¸­çš„字段å称完全一致。å¯ä»¥æŸ¥çœ‹è„šæœ¬è¾“å‡ºçš„"未分类"列表æ¥ç¡®è®¤å­—段å称。 + +### Q2: 如何处ç†åˆå¹¶é¡¹ç›®ï¼ˆå¦‚"应收票æ®åŠåº”收账款")? + +**A**: é…置文件已ç»åŒ…å«äº†å¸¸è§çš„åˆå¹¶é¡¹ç›®å’Œæ˜Žç»†é¡¹ç›®ã€‚如果有其他åˆå¹¶é¡¹ç›®ï¼Œè¯·åœ¨é…置文件中添加相应的字段å称。 + +### Q3: æ±‡æ€»é‡‘é¢æ˜¯å¦‚何计算的? + +**A**: 脚本会自动将该分类下所有明细项目的金é¢ç›¸åŠ ã€‚è®¡ç®—æ—¶ä¼šè‡ªåŠ¨å¤„ç†ç©ºå€¼å’Œéžæ•°å­—æ•°æ®ã€‚ + +### Q4: å¯ä»¥ä¿®æ”¹åˆ†ç±»åç§°å—? + +**A**: å¯ä»¥ã€‚在é…置文件中修改 `name` 字段å³å¯ã€‚输出时会使用新的å称。 + +### Q5: 如何查看未分类的项目? + +**A**: è¿è¡Œè„šæœ¬æ—¶ï¼ŒæŽ§åˆ¶å°ä¼šè¾“出所有未分类项目的列表,也å¯ä»¥åœ¨è¾“å‡ºæ–‡ä»¶çš„æœ€åŽæŸ¥çœ‹ã€‚ + +--- + +## âš ï¸ æ³¨æ„事项 + +1. **项目å称匹é…**:项目å称必须与原始数æ®ä¸­çš„字段åç§°**完全匹é…**(包括空格和标点符å·ï¼‰ +2. **æ•°æ®å•ä½**:数æ®ä¿æŒåŽŸå§‹å•ä½ï¼Œä¸è¿›è¡Œè½¬æ¢ +3. **汇总计算**ï¼šåˆ†ç±»æ±‡æ€»è¡Œä¼šè‡ªåŠ¨è®¡ç®—è¯¥åˆ†ç±»ä¸‹æ‰€æœ‰é¡¹ç›®çš„é‡‘é¢æ€»å’Œ +4. **文件格å¼**:支æŒè¾“å…¥ `.csv`ã€`.xlsx`ã€`.xls`,统一输出为 `.xlsx` +5. **文件覆盖**:输出文件会覆盖åŒå的已有文件 +6. **CSV ç¼–ç **:CSV 文件使用 UTF-8 ç¼–ç  + +--- + +## 📂 相关文件 + +- **é…置文件**:`config/balance_sheet_categories.json` +- **处ç†è„šæœ¬**:`process_balance_sheet.py` +- **输出目录**:`output/` +- **主文档**:`README.md` + +--- + +**如有更多问题,请å‚考主文档 README.md 或查看示例输出**