数据分析Skill data-analysis

这个技能用于使用DuckDB分析用户上传的Excel和CSV文件,支持数据探索、SQL查询、统计汇总和结果导出,适用于数据科学和商业智能场景。关键词:数据分析、Excel处理、CSV解析、SQL查询、统计摘要、DuckDB、数据工程、商业智能、量化金融。

数据分析 0 次安装 0 次浏览 更新于 3/18/2026

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 其中之一:inspectquerysummary
--sql 对于query 要执行的SQL查询
--table 对于summary 要摘要的表/工作表名称
--output-file 导出结果的路径(CSV/JSON/MD)

[!NOTE] 不要读取Python文件,只需使用参数调用它。

表命名规则

  • Excel文件:每个工作表成为一个以工作表命名的表(例如,Sheet1SalesRevenue
  • CSV文件:表名为不带扩展名的文件名(例如,data.csvdata
  • 多文件:所有文件中的所有表在同一查询上下文中可用,支持跨文件连接
  • 特殊字符:带有空格或特殊字符的工作表/文件名会自动清理(空格→下划线)。对于以数字开头或包含特殊字符的名称使用双引号,例如"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(带有工作表:OrdersProductsCustomers)并询问:“分析我的销售数据——显示按收入和月度趋势的前几名产品。”

步骤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.csvcustomers.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_TRUNCEXTRACT等)
  • 对于非常大文件(100MB+),DuckDB高效处理,无需将所有内容加载到内存
  • 带有空格的列名使用双引号访问:"Column Name"