Auto Data Analyzer
输入CSV/Excel数据,自动生成包含清洗、分析与可视化的综合报告。
提供完整的数据处理流程,涵盖清洗、转换、分析与自动化报告生成。
openclaw skills install @1kalin/afrexai-spreadsheet-master命令、参数、文件名以原文为准
将杂乱的数据转化为清晰的洞察、自动化报告和决策可用的仪表盘。平台无关 —— 适用于 CSV、Excel、Google Sheets 或任何表格格式。
在处理任何数据之前,先评估你所拥有的数据。
data_intake:
source: "" # 文件路径、URL、API、数据库、手动输入
format: "" # CSV、XLSX、TSV、JSON、剪贴板粘贴
rows: 0
columns: 0
file_size: ""
encoding: "" # UTF-8、Latin-1、Windows-1252 等
delimiter: "" # 逗号、制表符、竖线、分号
health_score: # 每项评分 0–4,总分 /20
completeness: 0 # 4=缺失率 <1%,3=<5%,2=<15%,1=<30%,0=>30%
consistency: 0 # 4=类型统一,3=少量混合,2=显著混合,1=混乱,0=不可用
accuracy: 0 # 4=已验证,3=合理,2=部分异常值,1=错误较多,0=不可信
freshness: 0 # 4=实时,3=<24小时,2=<7天,1=<30天,0=过时/未知
structure: 0 # 4=整洁(每行=一条记录),3=轻微重构,2=需要转置,1=多级标题,0=自由格式
issues_found: [] # 在修复前列出所有问题START
│
├─ 标题 → 标准化(小写、snake_case、去除空格和特殊字符)
│
├─ 存在重复数据?
│ ├─ 完全重复 → 删除,保留第一条
│ ├─ 接近重复 → 标记待审(通过姓名+地址进行模糊匹配)
│ └─ 有意重复 → 保留(如同一客户多次下单)
│
├─ 存在缺失值?
│ ├─ 缺失比例 <5% → 填充(数值用均值,分类用众数,时间序列用前向填充)
│ ├─ 5%-30% → 标记并填充为“UNKNOWN”或插值,附说明
│ ├─ >30% → 考虑删除该列或标记为不可靠
│ └─ 关键字段整行缺失 → 删除并记录日志
│
├─ 数据类型是否正确?
│ ├─ 日期为文本 → 解析为日期(尝试多种格式,记录失败情况)
│ ├─ 数字为文本 → 去除货币符号、逗号、空格,转换为数值
│ ├─ ID/邮编含前导零 → 保持为文本(切勿转为数字)
│ ├─ 电话号码 → 保留为文本,统一格式
│ ├─ 列中类型混杂 → 拆分或强制转换,并记录错误
│ └─ 布尔值变体 → 统一映射(Yes/No/True/False/1/0/Y/N → 一致)
│
├─ 存在异常值?
│ ├─ 计算 IQR:Q1 - 1.5×IQR 至 Q3 + 1.5×IQR
│ ├─ 业务逻辑校验(负收入?年龄 200 岁?2099 年的日期?)
│ ├─ 决策:修正(打字错误)、截断(Winsorize)、删除或保留并标记
│ └─ 始终记录被修改的异常值及其原因
│
├─ 是否需要标准化?
│ ├─ 文本大小写 → 统一格式(姓名用首字母大写,代码用全大写)
│ ├─ 空白字符 → 去除首尾空白,压缩内部空白
│ ├─ 分类项 → 映射统一("US"/"USA"/"United States" → "US")
│ ├─ 日期 → 内部使用 ISO 8601 格式(YYYY-MM-DD)
│ ├─ 货币 → 统一符号位置与小数精度
│ └─ 电话/邮箱 → 验证格式
│
└─ 结构性问题?
├─ 多级标题行 → 合并为单行标题
├─ 合并单元格 → 取消合并并向下填充
├─ 转置/交叉表 → 反转为整洁格式(每行=一条观测)
├─ 一张表中有多个数据表 → 拆分为独立工作表或文件
└─ 元数据行(总计、备注)→ 与数据行分离cleaning_log:
date: "YYYY-MM-DD"
source_file: ""
rows_before: 0
rows_after: 0
actions:
- action: "移除完全重复项"
rows_affected: 0
key_columns: ["email"]
- action: "填充缺失值"
column: "state"
method: "众数"
values_filled: 0
- action: "移除异常值"
column: "revenue"
criteria: "负值"
rows_removed: 0
- action: "标准化日期"
column: "order_date"
from_format: "MM/DD/YYYY"
to_format: "YYYY-MM-DD"
parse_failures: 0
notes: ""| # | 操作 | 使用场景 | 示例 |
|---|---|---|---|
| 1 | 筛选 | 根据条件提取行子集 | 订单金额 > $1000,日期在 2024-01-01 之后 |
| 2 | 排序 | 按一个或多个列排序 | 收入降序,再按日期升序 |
| 3 | 分组 + 聚合 | 按类别汇总 | 按地区统计总收入,按客户计算平均订单额 |
| 4 | 转置 | 行转列 | 从日期行生成月度列 |
| 5 | 反转/熔接 | 列转行 | 月度列还原为日期行 |
| 6 | 连接/合并 | 合并多个数据集 | 通过 customer_id 合并客户数据与订单数据 |
| 7 | 去重 | 消除冗余 | 每个客户保留最新记录 |
| 8 | 派生 | 创建新列 | profit = revenue - cost,age = today - birthdate |
| 9 | 拆分 | 一列拆分为多列 | "John Smith" → first_name, last_name |
| 10 | 拼接 | 多列合并为一列 | city + state + zip → full_address |
| 11 | 查找/映射 | 用参考数据补充信息 | state_code → state_name,product_id → category |
| 12 | 窗口计算 | 进行累计运算 | 7 日移动平均、组内排名、累计总额 |
│
├─ 需要左表所有行 → LEFT JOIN
│ (可能有订单,也可能没有订单的客户)
│
├─ 只需要匹配的行 → INNER JOIN
│ (仅有订单的客户)
│
├─ 需要两个表的所有行 → FULL OUTER JOIN
│ (对账:发现不一致数据)
│
├─ 需要不在另一张表中的所有行 → LEFT JOIN + WHERE 右侧列 IS NULL
│ (从未下单的客户)
│
└─ 需要所有组合 → CROSS JOIN(较少使用,需谨慎)
(所有产品 × 所有门店,用于价格矩阵)
⚠️ 始终检查连接结果:
| 任务 | Excel | Google Sheets | Python (pandas) |
|---|---|---|---|
| 查找 | VLOOKUP, XLOOKUP | VLOOKUP, XLOOKUP | df.merge(), df.map() |
| 条件求和 | SUMIFS | SUMIFS | df.groupby().sum() |
| 条件计数 | COUNTIFS | COUNTIFS | df.groupby().count() |
| 文本拆分 | TEXTSPLIT, LEFT/MID/RIGHT | SPLIT | df.str.split() |
| 日期差 | DATEDIF, 数学计算 | DATEDIF | (df.col2 - df.col1).dt.days |
| 累计合计 | SUM($A$1:A1) | SUM($A$1:A1) | df.cumsum() |
| 排名 | RANK.EQ | RANK | df.rank() |
| 占比 | =A1/SUM($A:$A) | =A1/SUM($A:$A) | df.col / df.col.sum() |
| 去除重复项 | 数据 → 删除重复项 | 数据 → 删除重复项 | df.drop_duplicates() |
| 汇总表 | 汇总表 | 汇总表 | df.pivot_table() |
根据问题选择对应的分析类型:
描述性分析(发生了什么?)
诊断性分析(为什么会发生?)
预测性分析(可能会发生什么?)
决策性分析(应该怎么做?)
每个发现必须遵循以下结构:
洞察:[你发现的内容 — 一句话]
证据:[具体数据]
所以呢:[对业务的意义]
行动:[应采取的措施]
信心:[高/中/低 + 原因]示例:
洞察:第三季度客户获取成本相比第二季度上升了43%
证据:CAC从47美元升至67美元,主要由付费搜索点击单价上涨62%驱动
所以呢:当前LTV为180美元,回本周期从3.1个月延长至4.5个月
行动:将30%的付费搜索预算转移至邮件/推荐渠道(对应CAC分别为12美元和23美元)
信心:高 — 基于完整季度的Stripe + Google Ads数据┌──────────────────────────────────────────────────┐
│ 执行仪表板 — [期间] │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐│
│ │ 收入 │ │ 客户数 │ │ 利润率 │ │ 增长率 ││
│ │ $XXX,XXX │ │ X,XXX │ │ XX.X% │ │ +XX.X% ││
│ │ ▲ +X.X% │ │ ▲ +XXX │ │ ▼ -X.X% │ │ vs LY ││
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘│
│ │
│ [趋势图 — 关键指标过去12个月] │
│ │
│ 最重要的3个洞察: │
│ 1. [洞察 + 行动] │
│ 2. [洞察 + 行动] │
│ 3. [洞察 + 行动] │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 按细分维度 │ │ 按渠道 │ │
│ │ (表格或图表) │ │ (表格或图表) │ │
│ └──────────────────┘ └──────────────────┘ │
└──────────────────────────────────────────────────┘| 元素 | 规则 | 示例 |
|---|---|---|
| 大数值 | 使用千/万单位,保留一位小数 | $1.2M,14.3K |
| 百分比 | 保留一位小数,始终显示方向 | ▲ +12.3%,▼ -4.1% |
| 货币 | 小于1000时保留两位小数,更大时保留整数 | $47.50,$12,000 |
| 日期 | 全文统一格式 | Jan 2025,不使用01/2025 |
| 对比 | 必须包含基线 | $120K (+15% vs LY) |
| RAG状态 | 使用颜色+文字 | 🟢 正常,🟡 风险,🔴 落后 |
| 信号线 | 一眼看出趋势 | ▁▂▃▅▇(向上趋势) |
你在展示什么?
│
├─ 随时间的变化 → 折线图(≤5条系列)或面积图(堆叠组成)
│
├─ 不同类别的比较 → 柱状图(长标签建议横向)
│
├─ 整体占比 → 饼图(≤5个扇区)或堆叠柱状图(>5个或随时间变化)
│
├─ 分布情况 → 直方图或箱形图
│
├─ 两变量关系 → 散点图
│
├─ 地理位置 → 地图(若有地理位置数据)
│
├─ 排名列表 → 横向柱状图,按降序排列
│
└─ 单一关键指标 → 大数字 + 趋势指示器
⚠️ 绝对不要使用:
- 3D图表(扭曲视觉感知)
- 双Y轴(误导读者)
- 饼图超过7个扇区(改用柱状图)
- 彩虹色系(最多使用2-3种主色 + 灰色)recurring_report:
name: ""
frequency: "" # daily, weekly, monthly, quarterly
owner: ""
recipients: []
data_sources:
- source: "" # 文件路径、API、数据库
refresh: "" # 数据如何更新
format: ""
processing_steps:
- step: "加载数据"
tool: "" # Python、Excel 宏、Google Apps Script
- step: "清洗"
rules: [] # 参考清洗协议
- step: "转换"
operations: []
- step: "分析"
calculations: []
- step: "格式化"
template: "" # 填充的仪表板模板
- step: "交付"
method: "" # 邮件、Slack、共享驱动器、API 推送
quality_checks:
- "行数在预期范围内(±20%)"
- "关键列中无空值"
- "总计与源系统一致"
- "日期范围符合预期周期"
- "关键指标通过合理性检查(无10倍增长且无解释)"
error_handling:
- trigger: "数据源不可用"
action: "使用缓存的上一次有效版本 + 发送告警"
- trigger: "行数超出范围"
action: "暂停处理 + 标记人工审查"
- trigger: "指标超过历史标准差3倍"
action: "在报告中包含异常提示""""
定期报告:[NAME]
调度频率:[FREQUENCY]
"""
import pandas as pd
from pathlib import Path
from datetime import datetime
# --- 配置 ---
INPUT_PATH = Path("data/raw/")
OUTPUT_PATH = Path("data/reports/")
REPORT_DATE = datetime.now().strftime("%Y-%m-%d")
# --- 加载 ---
df = pd.read_csv(INPUT_PATH / "source.csv", parse_dates=["date"])
# --- 清洗 ---
df = df.drop_duplicates()
df = df.dropna(subset=["required_column"])
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")
# --- 转换 ---
summary = (
df.groupby("category")
.agg(
total=("amount", "sum"),
count=("id", "count"),
avg=("amount", "mean"),
)
.sort_values("total", ascending=False)
.reset_index()
)
# --- 质量检查 ---
assert len(df) > 0, "数据集为空!"
assert df["amount"].isna().sum() / len(df) < 0.05, "缺失金额比例过高"
# --- 输出 ---
output_file = OUTPUT_PATH / f"report-{REPORT_DATE}.csv"
summary.to_csv(output_file, index=False)
print(f"✅ 报告已保存:{output_file} | {len(summary)} 行")工作表结构:
├── 假设 → 所有可编辑输入集中在一个位置(高亮单元格)
├── 收入 → 公式引用假设
├── 成本 → 公式引用假设
├── 利润表 → 汇总收入与成本
├── 现金流 → 由利润表 + 营运资金推导
├── 资产负债表 → 由现金流推导
├── 场景 → 最佳/基准/最差切换,影响假设
└── 仪表板 → 图表 + KPI,数据来自利润表/现金流
规则:
- 输入项 = 蓝色字体或黄色背景(选择一种,保持一致)
- 公式 = 黑色字体,公式中不硬编码数字
- 每个公式必须回溯到假设或原始数据
- 无循环引用
- 包含版本号 + 最后更新日期必需列:
- id(自动递增或 UUID)
- 姓名、邮箱、电话、公司
- 来源(如何获取客户)
- 状态(潜在客户 → 已联系 → 已评估 → 提案 → 成功/失败)
- 上次联系时间
- 下一步行动 + 下一步行动时间
- 交易金额
- 备注
衍生列:
- 从上次联系至今天数 = TODAY() - last_contact_date
- 流程阶段停留天数 = TODAY() - stage_entry_date
- 是否过期 = 从上次联系至今天数 > 14
仪表板指标:
- 各阶段管道价值
- 阶段间转化率
- 各阶段平均停留天数
- 过期联系人数量(需处理)必需列:
- sku、名称、类别
- 当前库存量、补货点、补货数量
- 单位成本、单位售价
- 最近入库时间、最近销售时间
- 供应商
衍生列:
- 库存价值 = 当前库存量 × 单位成本
- 毛利率 = (单位售价 - 单位成本) / 单位售价
- 库存可用天数 = 当前库存量 / 日均销量
- 是否需要补货 = 当前库存量 ≤ 补货点
预警:
- 🔴 低于补货点
- 🟡 7天内可能缺货(基于周转速度)
- ⚪ 死库存(90天内无销售)必需列:
- 任务编号、任务名称、描述
- 责任人、优先级(P0-P3)
- 状态(待办 → 进行中 → 审核 → 完成)
- 开始日期、截止日期、完成日期
- 预估工时、实际工时
衍生列:
- 剩余天数 = 截止日期 - TODAY()
- 是否逾期 = 截止日期 < TODAY() 且状态 ≠ "完成"
- 工时偏差 = 实际工时 - 预估工时
- 完成率 = 已完成任务数 / 总任务数
仪表板:
- 剩余工作量趋势图(剩余 vs 时间)
- 状态分布饼图
- 逾期任务列表
- 团队工作负载(每人任务数)结构:
- 行:费用类别 + 收入项目
- 列:预算 | 实际 | 差异 | 差异百分比
- 分组:按月或季度
关键公式:
- 差异 = 实际 - 预算
- 差异百分比 = (实际 - 预算) / 预算
- 累计预算 = 当前月份及之前所有月份之和
- 年化速率 = (累计实际 / 已过去月份数) × 12
条件格式:
- 绿色:有利差异(收入超预期,成本低于预算)
- 红色:不利差异(收入未达预期,成本超预算)
- 阈值:若 |差异| > 10%,则标记validation:
structural:
- "无重复的列名"
- "无完全空的列"
- "无完全空的行(除有意设置的分隔行外)"
- "所有行的列数保持一致"
- "表头位于第1行(不支持多行表头,除非已处理)"
type_integrity:
- "日期列能正确解析为有效日期"
- "数值列中不含文本(表头除外)"
- "ID 列在预期位置具有唯一性"
- "邮箱列符合基本邮箱格式"
- "电话列格式保持一致"
business_rules:
- "收入 ≥ 0(或说明负值代表退款)"
- "日期在合理范围内(历史数据不应包含未来日期)"
- "百分比在 0-100 之间(或 0-1,需保持一致)"
- "状态值在允许的列表中"
- "外键在参考表中存在"
completeness:
- "必填列缺失值少于 5%"
- "无孤立记录(子记录无父记录)"
- "日期范围连续(每日数据无间隔)"| 维度 | 权重 | 分数 0-4 | 评估标准 |
|---|---|---|---|
| 完整性 | 25% | 必填字段中非空值占比 | |
| 唯一性 | 15% | 具有有效唯一键的行占比 | |
| 一致性 | 20% | 符合预期格式/类型的值占比 | |
| 准确性 | 20% | 通过业务规则验证的占比 | |
| 实时性 | 10% | 数据新鲜度与预期刷新周期对比 | |
| 符合性 | 10% | 匹配标准格式(日期、电话、邮箱)的占比 |
评分 = Σ(权重 × 得分/4 × 100)
| 源格式 → 目标格式 | 推荐方法 | 注意事项 |
|---|---|---|
| CSV → Excel | pandas + openpyxl | 编码问题、日期解析、前导零丢失 |
| Excel → CSV | pandas 或 openpyxl | 多工作表、公式丢失、合并单元格 |
| JSON → CSV | pandas json_normalize | 嵌套对象需展开 |
| CSV → JSON | pandas to_json | 选择 records 或 columns 方向 |
| Excel → Google Sheets | 直接上传 | 宏被移除,部分公式差异 |
| Google Sheets → Excel | 下载为 .xlsx | IMPORTRANGE 失效,自定义函数丢失 |
| PDF 表格 → CSV | Tabula、pdfplumber | 布局识别、合并单元格、跨页处理 |
| HTML 表格 → CSV | pandas read_html | 多个表格、嵌套表格、编码问题 |
文本乱码?请按顺序尝试以下编码:
1. UTF-8(默认,支持所有语言)
2. UTF-8-BOM(Windows 导出常带 BOM)
3. Latin-1 / ISO-8859-1(西欧语言)
4. Windows-1252(Windows “ANSI”)
5. Shift-JIS(日文)
6. GB2312 / GBK(中文)
Python: pd.read_csv("file.csv", encoding="utf-8-sig")
检测工具:chardet 或 charset-normalizer 库| 行数 | 工具推荐 |
|---|---|
| <10K | 任意工具(Excel、Sheets、pandas) |
| 10K-100K | Excel(谨慎使用)或 pandas |
| 100K-1M | pandas 加 chunking,或 DuckDB |
| 1M-10M | DuckDB、Polars 或数据库 |
| >10M | 数据库(PostgreSQL、BigQuery) |
pd.read_csv(file, usecols=["col1","col2"])pd.read_csv(file, chunksize=50000)df["status"] = df["status"].astype("category").apply()duckdb.sql("SELECT * FROM 'file.csv' WHERE x > 100")currency_rules:
- 金额与币种代码分列存储
- 单列中不得混合多种币种,除非包含币种代码
- 使用 ISO 4217 币种代码(USD、GBP、EUR、BTC)
- 记录转换所用汇率及汇率日期
- 保留原始金额与转换后金额为独立列
- 明确说明:此汇率是交易时的汇率还是当前汇率?timezone_rules:
- 内部时间戳统一存储为 UTC
- 记录原始时区信息
- 仅在展示时转换为本地时间
- “当日结束” = 业务时区的 23:59:59,而非 UTC
- 夏令时切换可能导致一天为 23 小时或 25 小时
- 日度聚合应在业务时区进行,而非 UTC| 维度 | 权重 | 0(失败) | 1(差) | 2(一般) | 3(良好) | 4(优秀) |
|---|---|---|---|---|---|---|
| 数据洁净度 | 20% | 原始数据,未处理 | 部分清洗,不一致 | 大部分问题已解决 | 数据整洁,有文档记录 | 完全无瑕 + 自动化验证 |
| 结构设计 | 15% | 杂乱无章 | 基础表格形式,存在缺陷 | 结构合理,略有缺失 | 整洁规范,模式清晰 | 完美规范化 + 关系建模 |
| 分析深度 | 20% | 无分析 | 基础统计(计数/求和) | 分段分析 | 多维度洞察 | 预测性 + 规划性 + 可行动建议 |
| 可视化呈现 | 15% | 无图表 | 图表类型错误 | 图表可用 | 清晰、标注完整 | 发布级仪表盘 |
| 文档说明 | 10% | 无文档 | 极简注释 | 列字段说明 | 完整数据字典 + 方法论 | 可复现 + 版本管理 |
| 自动化能力 | 10% | 全手动操作 | 部分使用公式 | 模板驱动 | 脚本化流程 | 完全自动化 + 监控机制 |
| 准确性 | 10% | 未经验证 | 抽样检查 | 样本验证 | 与源数据交叉核对 | 已对账 + 审计追踪 |
评分等级:
"Clean this CSV" → 执行第2阶段清洗流程,输出干净文件 + 日志
"Analyze this data" → 第1阶段评估 → 第4阶段分析 → 输出洞察
"Build a dashboard" → 使用第5阶段模板 → 填充数据生成可视化
"Convert this to Excel" → 第9阶段转换,保持质量不变
"Find duplicates" → 执行去重分析,支持精确匹配与模糊匹配
"What's wrong with this data?" → 第1阶段健康检查 + 第8阶段验证
"Create a monthly report" → 生成第6阶段自动化模板
"Compare these two files" → 合并 + 差异分析
"Summarize by category" → 分组聚合 + 帕累托分析
"Make this data tidy" → 执行反透视/重塑,实现每行一个观测值
"Set up a budget tracker" → 应用第7阶段模式5模板
"Profile this dataset" → 完整执行第1阶段 + 第8阶段质量评分afrexai-data-analyst — 高级分析方法论(DICE 框架、统计分析)afrexai-fpa-engine — 财务规划与分析,含电子表格模型afrexai-budget-tracker — 个人或企业预算管理afrexai-business-automation — 重复性电子表格工作流自动化⚡ 提升你的数据能力 → [AfrexAI 上下文包 ($47)](https://afrexai-cto.github.io/context-packs/) — 行业专用数据模板、KPI 框架与报告自动化工具,涵盖 SaaS、金融科技、制造、电商等领域。
🔗 更多免费 AfrexAI 技能:
afrexai-data-analyst — 完整的数据分析方法论afrexai-business-automation — 工作流自动化框架afrexai-seo-content-engine — SEO 优化内容创作afrexai-customer-success — 客户留存与健康度评分afrexai-devops-engine — DevOps 与平台工程📦 浏览全部:[AfrexAI 商店](https://afrexai-cto.github.io/context-packs/)
已收录 14 个 Skill