wechat-robot-skills/skills/xlsx/references/data-analysis.md

113 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据理解、处理和汇总
## 先确认数据口径
用 `scripts/inspect_workbook.py` 分段检查相关 sheet。它返回活动表、隐藏状态、合并范围、表格图表、公式、缓存、样式和行列游标;表头不清晰时向下、向右继续读取,不猜测空表头的字段含义。对多表确定各自主键与关系,不默认逐表独立分析,也不默认第一张表代表整本工作簿。
`analyze_workbook.py` 的 `profile` 检查指定范围的类型分布、缺失、唯一值与疑似汇总行。该检查不自动排除任何候选行;“合计成本”可能是字段名称,备注里出现“合计”也未必是汇总行。排除明细中的真实汇总行后再聚合,避免重复计数。
合并区域用于分类标记时,可以对确认的分类字段前向填充;数值和普通缺失记录不能跟随整表填充。ID、邮编、前导零文本先保持文本,只有指定数值字段才转换。退款、冲销、净流出等负数照业务含义保留。
## 统一调用
通过 `execute_skill_script` 调用 `scripts/analyze_workbook.py`:
```text
--input '/usr/local/src/excel/tmp/task/source.xlsx' --spec '<JSON>' --output '/usr/local/src/excel/tmp/task/analysis.json'
```
也支持 `--spec-file <JSON路径>`,与 `--spec` 二选一。`profile` 可省略 `--output`,直接返回 JSON 概况;其他方法输出供原写入脚本使用的操作说明,而不是直接修改源文件。
```text
scripts/apply_workbook.py
--input '/usr/local/src/excel/tmp/task/source.xlsx' --output '/usr/local/src/excel/result.xlsx' --spec-file '<返回的 spec_path>'
```
新建独立结果文件时省略写入脚本的 `--input`。分析计划只追加结果 sheet;若目标已有同名 sheet,先选择新名称或明确规划替换区域,不默默清空已有内容。计划内的 `分析说明` 为保留名称,记录来源哈希、字段映射、筛选规则、算法参数和快照属性。
## 输入范围
所有分析/模型共用 `source` 对象:
```json
{
"source": {
"sheet": "销售明细",
"range": "A3:F502",
"header_row": 3,
"columns": {"地区": "B", "销售额": "E", "日期": "A"},
"exclude_rows": [502],
"numeric": ["销售额"],
"dates": {"日期": "%Y-%m-%d"}
}
}
```
- 默认活动表、第一行为表头、读取整个使用区域。`range` 含表头;`header_row` 是源文件中的真实行号。
- `columns` 是**名称 → Excel 列字母**,用于选择字段、空表头或多层表头的人工映射;未指定时,表头必须非空且唯一。
- `exclude_rows` 指定已确认需要排除的源行号。输出 `__source_row` 始终保存原始行号,不是 DataFrame 的索引。
- Excel 公式使用缓存值;相关区域存在未计算或错误缓存时先重算,不能把缺失缓存视作空记录。外部链接数据需先确认并固化。
- `.xlsx/.xlsm/.xltx/.xltm/.csv/.tsv` 可直接分析;`.xls` 先转换。CSV 默认 `utf-8-sig`,可设 `source.encoding: "gb18030"`,所有字段初始按文本保留。
- 输入文件最大 25 MiB,单次读取最多 500000 单元格;超过时选相关区域或分组处理。不得只分析前一批却宣称覆盖全表。
## 方法
| `method` | 参数与输出 |
| --- | --- |
| `profile` | 类型分布、缺失、唯一值、样本与疑似汇总行;候选最多显示 100 项并报告总数 |
| `transform` | 执行 `steps` 后输出明细及来源行号 |
| `aggregate` | `by: [分组字段]`、`metrics: {字段: 聚合方式}` |
| `pivot` | 同 aggregate,加 `columns: [列维度]`;结果为静态交叉汇总 |
| `describe` | `columns: [数值字段]`;计数、均值、标准差、分位数、极值 |
| `correlate` | `columns`,`correlation: "pearson"` 或 `"spearman"`;相关系数和每对字段的有效样本数 |
| `classify` | `column`、`rules`,详见 [文本处理](text-analysis.md) |
非 profile 方法可用 `result_sheet` 设置首张结果表名称。聚合支持 `sum/count/size/mean/min/max/median/nunique`:`count` 排除值字段空值,`size` 统计记录数,空分类保留;全空 `sum` 保持空白,不自动写 0。均价、转化率等加权指标应从分子与分母的汇总重新计算,不能简单平均各组百分比。
交叉汇总的多层列名采用 JSON 数组形式,如 `["销售额","华东"]`,避免简单拼接导致不同维度重名。没有观测的交叉组合保留空白,不自动认为业务值为零。
## 处理步骤
`steps` 顺序执行,最多 50 项;返回处理前后行数。支持:
| `type` | 字段 |
| --- | --- |
| `trim` | `columns`,仅修剪文本前后空格 |
| `replace` | `columns`、`mapping: {原值: 新值}`,显式同义词/编码映射 |
| `numeric` | `columns`,非法文本报错,不自动去掉单位或百分号 |
| `date` | `columns`、`format`,显式日期格式 |
| `fill` | `columns`,明确 `value` 或 `method: "ffill"` |
| `drop_missing` | `columns`,排除关键字段缺失记录 |
| `deduplicate` | `columns` 为判重键;`keep: "first"/"last"/false` |
| `filter` | `column`、`operator`、`value`;比较 `eq/ne/gt/ge/lt/le`、`in/not_in`、`contains`、`is_missing/not_missing` |
| `sort` | `columns`,可选 `ascending`,稳定排序 |
| `select` | `columns`,始终保留来源行号 |
| `rename` | `mapping: {旧名: 新名}`;不能重命名来源行号 |
| `merge` | `source: {path, …输入范围参数}`、`on: [连接键]`、`how: left/inner/right/outer`;`validate` 默认 many_to_one,可选 one_to_one/one_to_many |
| `concat` | `source: {path, …输入范围参数}`,相同字段纵向拼接,保留文件与行号来源 |
连接键含空值时先处理。默认拒绝意外多对多连接,避免金额因笛卡尔积重复统计。`contains` 是字面子串匹配,不执行正则或代码;任何步骤都没有 `eval`、SQL 或 Python 执行入口。日期跨天、货币换算、百分比缩放等业务运算优先在结果工作簿写可检查的公式,不凭常识自动修改原数值。
## 销售汇总示例
```json
{
"method": "aggregate",
"source": {"sheet": "明细", "exclude_rows": [502], "numeric": ["收入", "成本"]},
"by": ["地区"],
"metrics": {"收入": "sum", "成本": "sum"},
"result_sheet": "地区汇总",
"chart": {"type": "column", "category": "地区", "values": ["收入", "成本"], "title": "各地区收入与成本"}
}
```
`chart` 使用首张结果表,`values` 必须按顺序选择相邻数值列;支持原 xlsx 的 bar/column/line/area/pie。多层表或复杂对照图可在后续 `apply_workbook.py` 操作中明确设置引用。
## 透视表边界与洞察
这里生成的是 pandas 聚合后写入的**静态汇总表和普通图表**,不含原生 Excel PivotTable 字段拖拽、切片器或自动刷新控件。用户需要原生控件时,先说明当前固定接口的边界;不能把静态表称为已满足原生透视表要求。用户需要实时变化的简单汇总时,优先用 SUMIFS/COUNTIFS 等公式。
交付前核对:原始明细与模板保留、分组结果与明细合计一致、记录数与排除口径一致、图表引用实际结果且不重复包含总计。不要因图表不好看删除用户要求的结果;先调整图表或说明限制。
从统计到洞察时,先给结论及数值证据,再给解释和建议;将“数据表现”与“可能原因”区分。相关系数不代表因果或显著性;常量列相关系数为空,不改成零。报告组织见 [展示与交付](reporting.md)。