name: 数据分析 description: 当用户上传Excel (.xlsx/.xls) 或CSV文件并希望进行数据分析、生成统计信息、创建摘要、透视表、SQL查询或任何形式的结构化数据探索时使用此技能。支持多工作表Excel工作簿、聚合、过滤、连接以及将结果导出为CSV/JSON/Markdown。
数据分析技能
概述
此技能使用DuckDB(一个进程内分析SQL引擎)分析用户上传的Excel/CSV文件。它支持模式检查、基于SQL的查询、统计摘要和结果导出,全部通过一个Python脚本实现。
核心能力
- 检查Excel/CSV文件结构(工作表、列名、数据类型、行数)
- 对上传的数据执行任意SQL查询
- 生成统计摘要(均值、中位数、标准差、百分位数、空值数)
- 支持多工作表Excel工作簿(每个工作表成为一个表)
- 将查询结果导出为CSV、JSON或Markdown
- 使用DuckDB的列式引擎高效处理大文件
工作流程
步骤1:理解需求
当用户上传数据文件并请求分析时,识别:
- 文件位置:上传的Excel/CSV文件路径,位于
/mnt/user-data/uploads/ - 分析目标:用户希望获得的见解(摘要、过滤、聚合、比较等)
- 输出格式:结果应如何呈现(表格、CSV导出、JSON等)
- 您不需要检查
/mnt/user-data下的文件夹
步骤2:检查文件结构
首先,检查上传的文件以了解其模式:
python /mnt/skills/public/data-analysis/scripts/analyze.py \
--files /mnt/user-data/uploads/data.xlsx \
--action inspect
返回内容:
- 工作表名称(对于Excel)或文件名(对于CSV)
- 列名、数据类型和非空计数
- 每工作表/文件的行数
- 样本数据(前5行)
步骤3:执行分析
基于模式,构建SQL查询以回答用户的问题。
运行SQL查询
python /mnt/skills/public/data-analysis/scripts/analyze.py \
--files /mnt/user-data/uploads/data.xlsx \
--action query \
--sql "SELECT category, COUNT(*) as count, AVG(amount) as avg_amount FROM Sheet1 GROUP BY category ORDER BY count DESC"
生成统计摘要
python /mnt/skills/public/data-analysis/scripts/analyze.py \
--files /mnt/user-data/uploads/data.xlsx \
--action summary \
--table Sheet1
为每个数值列返回:计数、均值、标准差、最小值、25%、50%、75%、最大值、空值计数。 为字符串列返回:计数、唯一值数、最高频值、频率、空值计数。
导出结果
python /mnt/skills/public/data-analysis/scripts/analyze.py \
--files /mnt/user-data/uploads/data.xlsx \
--action query \
--sql "SELECT * FROM Sheet1 WHERE amount > 1000" \
--output-file /mnt/user-data/outputs/filtered-results.csv
支持的输出格式(根据扩展名自动检测):
.csv— 逗号分隔值.json— 记录JSON数组.md— Markdown表格
参数
| 参数 | 必填 | 描述 |
|---|---|---|
--files |
是 | 以空格分隔的Excel/CSV文件路径 |
--action |
是 | 其中之一:inspect、query、summary |
--sql |
对于query |
要执行的SQL查询 |
--table |
对于summary |
要摘要的表/工作表名称 |
--output-file |
否 | 导出结果的路径(CSV/JSON/MD) |
[!NOTE] 不要读取Python文件,只需使用参数调用它。
表命名规则
- Excel文件:每个工作表成为一个以工作表命名的表(例如,
Sheet1、Sales、Revenue) - CSV文件:表名为不带扩展名的文件名(例如,
data.csv→data) - 多文件:所有文件中的所有表在同一查询上下文中可用,支持跨文件连接
- 特殊字符:带有空格或特殊字符的工作表/文件名会自动清理(空格→下划线)。对于以数字开头或包含特殊字符的名称使用双引号,例如
"2024_Sales"
分析模式
基本探索
-- 行数
SELECT COUNT(*) FROM Sheet1
-- 列中唯一值
SELECT DISTINCT category FROM Sheet1
-- 值分布
SELECT category, COUNT(*) as cnt FROM Sheet1 GROUP BY category ORDER BY cnt DESC
-- 日期范围
SELECT MIN(date_col), MAX(date_col) FROM Sheet1
聚合与分组
-- 按类别和月的收入
SELECT category, DATE_TRUNC('month', order_date) as month,
SUM(revenue) as total_revenue
FROM Sales
GROUP BY category, month
ORDER BY month, total_revenue DESC
-- 按支出前10名客户
SELECT customer_name, SUM(amount) as total_spend
FROM Orders GROUP BY customer_name
ORDER BY total_spend DESC LIMIT 10
跨文件连接
-- 从不同文件连接销售与客户信息
SELECT s.order_id, s.amount, c.customer_name, c.region
FROM sales s
JOIN customers c ON s.customer_id = c.id
WHERE s.amount > 500
窗口函数
-- 累计总和和排名
SELECT order_date, amount,
SUM(amount) OVER (ORDER BY order_date) as running_total,
RANK() OVER (ORDER BY amount DESC) as amount_rank
FROM Sales
透视式分析
-- 透视:按类别的月收入
SELECT category,
SUM(CASE WHEN MONTH(date) = 1 THEN revenue END) as Jan,
SUM(CASE WHEN MONTH(date) = 2 THEN revenue END) as Feb,
SUM(CASE WHEN MONTH(date) = 3 THEN revenue END) as Mar
FROM Sales
GROUP BY category
完整示例
用户上传sales_2024.xlsx(带有工作表:Orders、Products、Customers)并询问:“分析我的销售数据——显示按收入和月度趋势的前几名产品。”
步骤1:检查文件
python /mnt/skills/public/data-analysis/scripts/analyze.py \
--files /mnt/user-data/uploads/sales_2024.xlsx \
--action inspect
步骤2:按收入前几名产品
python /mnt/skills/public/data-analysis/scripts/analyze.py \
--files /mnt/user-data/uploads/sales_2024.xlsx \
--action query \
--sql "SELECT p.product_name, SUM(o.quantity * o.unit_price) as total_revenue, SUM(o.quantity) as total_units FROM Orders o JOIN Products p ON o.product_id = p.id GROUP BY p.product_name ORDER BY total_revenue DESC LIMIT 10"
步骤3:月度收入趋势
python /mnt/skills/public/data-analysis/scripts/analyze.py \
--files /mnt/user-data/uploads/sales_2024.xlsx \
--action query \
--sql "SELECT DATE_TRUNC('month', order_date) as month, SUM(quantity * unit_price) as revenue FROM Orders GROUP BY month ORDER BY month" \
--output-file /mnt/user-data/outputs/monthly-trends.csv
步骤4:统计摘要
python /mnt/skills/public/data-analysis/scripts/analyze.py \
--files /mnt/user-data/uploads/sales_2024.xlsx \
--action summary \
--table Orders
向用户呈现结果,清晰解释发现、趋势和可操作见解。
多文件示例
用户上传orders.csv和customers.xlsx并询问:“哪个区域的平均订单价值最高?”
python /mnt/skills/public/data-analysis/scripts/analyze.py \
--files /mnt/user-data/uploads/orders.csv /mnt/user-data/uploads/customers.xlsx \
--action query \
--sql "SELECT c.region, AVG(o.amount) as avg_order_value, COUNT(*) as order_count FROM orders o JOIN Customers c ON o.customer_id = c.id GROUP BY c.region ORDER BY avg_order_value DESC"
输出处理
分析后:
- 在对话中直接以格式化表格呈现查询结果
- 对于大结果,导出到文件并通过
present_files工具分享 - 始终用通俗语言解释发现,突出关键要点
- 当模式有趣时,建议后续分析
- 如果用户希望保留结果,提供导出选项
缓存
脚本自动缓存已加载数据,避免每次调用重新解析文件:
- 首次加载时,文件被解析并存储在持久性DuckDB数据库中,位于
/mnt/user-data/workspace/.data-analysis-cache/ - 缓存键是所有输入文件内容的SHA256哈希——如果文件更改,则创建新缓存
- 后续使用相同文件的调用将直接使用缓存数据库(几乎即时启动)
- 缓存透明——无需额外参数
这在运行针对同一数据文件的多个查询时(检查→查询→摘要)尤其有用。
注意事项
- DuckDB支持完整SQL,包括窗口函数、CTE、子查询和高级聚合
- Excel日期列自动解析;使用DuckDB日期函数(
DATE_TRUNC、EXTRACT等) - 对于非常大文件(100MB+),DuckDB高效处理,无需将所有内容加载到内存
- 带有空格的列名使用双引号访问:
"Column Name"