# Pie Chart Data Analysis

对多Sheet Excel或CSV数据进行分类汇总统计，自动识别关键字段并生成包含占比、数值及美化饼图的可下载分析报告。

- Repository: https://github.com/OpenSenseNova/SenseNova-Skills (6002 stars)
- Category: Engineering
- License: MIT
- Last updated: 2026-10-29
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add OpenSenseNova/SenseNova-Skills --skill pie-chart-data-analysis -g -a claude-code -y`
Codex: `npx skills add OpenSenseNova/SenseNova-Skills --skill pie-chart-data-analysis -g -a codex -y`
Cursor: `npx skills add OpenSenseNova/SenseNova-Skills --skill pie-chart-data-analysis -g -a cursor -y`
Gemini CLI: `npx skills add OpenSenseNova/SenseNova-Skills --skill pie-chart-data-analysis -g -a gemini-cli -y`

## Description

对多Sheet Excel或CSV数据进行分类汇总统计，自动识别关键字段并生成包含占比、数值及美化饼图的可下载分析报告。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

Step1 读取文件并统计所有 Sheet 的行数，确认数据规模以决定处理策略。
```python
import pandas as pd

file_path = input_file
total_rows = 0
sheet_names = []

try:
    if file_path.endswith('.xlsx'):
        excel_file = pd.ExcelFile(file_path)
        sheet_names = excel_file.sheet_names
        # 统计所有工作表总行数
        for sheet in sheet_names:
            df_tmp = pd.read_excel(file_path, sheet_name=sheet)
            total_rows += len(df_tmp)
    elif file_path.endswith('.csv'):
        df = pd.read_csv(file_path)
        total_rows = len(df)
    else:
        raise ValueError("不支持的文件格式，仅支持 .xlsx 或 .csv")
except Exception as e:
    raise RuntimeError(f"文件读取失败: {e}")

is_large_file = total_rows >= 10000
```

Step2 自动识别分类列与数值列，执行数据清洗与格式转换。
```python
import re

# 加载首个有效数据集
if file_path.endswith('.xlsx'):
    df = pd.read_excel(file_path, sheet_name=sheet_names[0])
else:
    df = pd.read_csv(file_path)

# 1. 识别数值目标列（如：金额、支出、得分、数量）
target_keywords = ['金额', '支出', '造价', '经费', '数量', '得分']
target_cols = [col for col in df.columns if any(k in col for k in target_keywords)]
target_col = target_cols[0] if target_cols else df.select_dtypes(include=['number']).columns[0]

# 2. 识别分类列（支持正则匹配中文序号或特定分类标识）
category_pattern = re.compile(r'[一二三四五六七八九十百]+|地区|类别|类型|状态')
category_cols = [col for col in df.columns if category_pattern.search(col)]
category_col = category_cols[0] if category_cols else df.select_dtypes(include=['object']).columns[0]

# 3. 数据清洗：处理合并单元格填充、缺失值及类型转换
df[category_col] = df[category_col].ffill() # 处理 Excel 合并单元格
df[target_col] = pd.to_numeric(df[target_col], errors='coerce')
clean_df = df[[category_col, target_col]].dropna()
clean_df.columns = ['category', 'value']
```

Step3 执行多维度聚合分析，计算占比及汇总统计。
```python
# 分类汇总
summary_df = clean_df.groupby('category', as_index=False)['value'].sum()
total_val = summary_df['value'].sum()

# 计算占比并格式化
summary_df['percentage'] = (summary_df['value'] / total_val * 100).round(2)
summary_df = summary_df.sort_values(by='value', ascending=False)

The rest: https://github.com/OpenSenseNova/SenseNova-Skills/blob/HEAD/skills/sn-da-excel-workflow/capability/excel-data-visualization/pie-chart-visualization/SKILL.md
