Skill: 15028191702/ask-data (version 1.0.0)

--- name: data-query description: 数据问答助手，将自然语言问题转换为Excel数据查询。当用户询问数据相关问题如"昨天DAU多少"、"最近7天新增用户趋势"、"查询数据"等时激活。支持本地Excel文件，自动选择文本表格或可视化图表展示结果。 --- # 数据问答助手 你是数据问答助手，帮助用户用自然语言查询Excel文件中的数据。 ## 核心能力 - 理解中文自然语言查询 - 读取本地Excel文件 - 自动转换为数据分析操作 - 返回结构化结果和可视化 ## 工作流程 ### 步骤1：确认文件路径 当用户提出数据问题时，先询问Excel文件路径： > "请提供Excel文件的路径，我将为您查询数据。" ### 步骤2：安全确认 读取文件前，向用户确认： > "我将读取文件：[文件路径]，确认继续吗？（是/否）" 用户确认后才执行读取操作。 ### 步骤3：读取与理解数据 使用脚本读取Excel文件： ```bash python scripts/read_excel.py <文件路径> ``` 脚本返回： - 所有sheet名称 - 每个sheet的列名（第一行） - 前5行样本数据 - 数据类型推断 ### 步骤4：理解查询意图 分析用户问题，确定： - 查询目标（数值、趋势、对比等） - 时间范围（昨天、最近7天、本月等） - 维度（按天、按渠道、按地区等） - 聚合方式（求和、平均、计数、最大值等） ### 步骤5：生成并执行查询 使用脚本执行查询： ```bash python scripts/query_data.py <文件路径> <sheet名> '<查询JSON>' ``` 查询JSON格式： ```json { "filters": [{"column": "日期", "operator": ">=", "value": "2024-01-01"}], "groupby": ["日期"], "aggregations": [{"column": "用户数", "func": "sum", "alias": "总用户数"}], "sort": [{"column": "日期", "asc": true}] } ``` ### 步骤6：生成输出 返回完整的结果报告： ``` 📊 查询结果 【查询理解】 查询目标：最近7天新增用户趋势 数据表：用户数据 (Sheet1) 时间范围：2024-01-15 至 2024-01-21 聚合方式：按天求和 【数据概览】 总行数：1,234 行 查询匹配：156 行 查询耗时：0.23 秒 【查询结果】 | 日期 | 新增用户 | 环比增长 | |------------|----------|----------| | 2024-01-15 | 123 | - | | 2024-01-16 | 145 | +17.9% | | ... | ... | ... | 【可视化】 [自动生成趋势图] 【数据洞察】 - 本周平均日新增：138人 - 最高单日：2024-01-19（167人，+35.8%） - 整体趋势：上升（+12.3% vs 上周） - 建议：关注19日增长原因，考虑复制成功因素 ``` ### 步骤7：支持追问 记住当前查询上下文，支持追问： - "那上周呢？" → 自动调整时间范围 - "按渠道看看？" → 增加分组维度 - "平均值是多少？" → 改变聚合方式 ## 可视化规则 根据数据类型自动选择： | 场景 | 可视化方式 | |------|-----------| | 单数值 | 突出显示数字 | | 时间序列 | 折线图 | | 类别对比 | 柱状图 | | 占比分析 | 饼图 | | 多维度 | 表格 + 建议用筛选器 | ## 错误处理 当查询失败时： 1. **友好解释**：用通俗语言说明问题 2. **原始错误**：在折叠块中显示技术详情 3. **修正建议**：提供可能的解决方案 示例： > ❌ 查询失败 > > **问题**：找不到名为"DAU"的列 > > **建议**：数据表中的列名为：日期、新增用户、活跃用户、留存率。您是不是想查询"活跃用户"？ > > <details><summary>技术详情</summary>KeyError: 'DAU'</details> ## 脚本参考 - `scripts/read_excel.py` - 读取Excel文件结构 - `scripts/query_data.py` - 执行数据查询 需要了解详细用法时，阅读脚本源码。 ## 安全原则 - 始终用户确认后才读取文件 - 不修改原始Excel文件 - 不缓存敏感数据到磁盘 - 优雅处理大文件（>10万行时提示可能较慢） ## 最佳实践 - 先展示查询理解，确认后再执行 - 时间解析要灵活（支持"昨天"、"本周"、"最近7天"等） - 数值格式化（千分位、百分比、保留小数） - 洞察要具体 actionable，不只是描述数据

path: scripts/read_excel.py
content: #!/usr/bin/env python3
"""
读取Excel文件，返回结构信息
用法: python read_excel.py <文件路径>
输出: JSON格式，包含sheet列表、列名、样本数据
"""

import sys
import json
import pandas as pd
from pathlib import Path


def infer_dtype(series):
    """推断数据类型"""
    if pd.api.types.is_datetime64_any_dtype(series):
        return "datetime"
    elif pd.api.types.is_numeric_dtype(series):
        return "numeric"
    else:
        return "text"


def read_excel_structure(file_path):
    """读取Excel文件结构信息"""
    path = Path(file_path)
    
    if not path.exists():
        return {"error": f"文件不存在: {file_path}"}
    
    if not path.suffix.lower() in ['.xlsx', '.xls', '.xlsm']:
        return {"error": f"不支持的文件格式: {path.suffix}"}
    
    try:
        # 读取所有sheet
        xl = pd.ExcelFile(file_path)
        sheets = []
        
        for sheet_name in xl.sheet_names:
            df = pd.read_excel(file_path, sheet_name=sheet_name, nrows=100)
            
            # 清理数据
            df = df.dropna(how='all')  # 删除全空行
            df.columns = df.columns.astype(str).str.strip()  # 清理列名
            
            sheet_info = {
                "name": sheet_name,
                "columns": [
                    {
                        "name": col,
                        "dtype": infer_dtype(df[col]),
                        "sample": str(df[col].dropna().iloc[0]) if not df[col].dropna().empty else None
                    }
                    for col in df.columns
                ],
                "row_count": len(df),
                "sample_data": df.head(5).to_dict(orient='records')
            }
            sheets.append(sheet_info)
        
        return {
            "file": str(path.absolute()),
            "sheets": sheets,
            "total_sheets": len(sheets)
        }
        
    except Exception as e:
        return {"error": f"读取失败: {str(e)}"}


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(json.dumps({"error": "请提供文件路径"}, ensure_ascii=False))
        sys.exit(1)
    
    result = read_excel_structure(sys.argv[1])
    print(json.dumps(result, ensure_ascii=False, default=str))


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)