---
name: managing-scripts
description: Manages shared scripts repository for reusable data analysis tools. Check scripts/README.md before writing, design generalized scripts with parameters, and keep documentation in sync.
---

# Managing Scripts

管理可复用的数据分析脚本资源库，通过通用化设计最大化脚本复用价值。

## Quick Start

编写数据分析脚本时的通用化流程：
1. 读取 `./executable_code/README.md` 检查是否有可复用的现成脚本
2. 如有合适脚本，优先复用
3. 如需编写新脚本，**设计通用化方案**而非解决单一问题
4. 保存到 `./executable_code/` 并更新 README

## Instructions

### 使用前检查

当用户请求任何数据处理/分析任务时：

1. 检查 `./executable_code/README.md` 是否存在
2. 查找可处理**此类问题**的脚本（非完全匹配即可）
3. 现有脚本可通过参数调整满足需求时，优先复用
4. 告知用户使用的是现成脚本

### 编写通用化脚本

核心原则：**解决一类问题，而非单一问题**

#### 1. 识别问题模式

在编写脚本前，分析当前请求属于哪类通用模式：

| 问题类型 | 通用模式 | 可参数化项 |
|---------|---------|-----------|
| 数据转换 | 格式A → 格式B | 输入文件、输出格式、字段映射 |
| 数据分析 | 统计/聚合/可视化 | 数据源、分析维度、输出类型 |
| 数据清洗 | 去重/填充/过滤 | 规则配置、阈值参数 |
| 文件操作 | 批量处理文件 | 文件路径、匹配模式、操作类型 |

#### 2. 参数化设计

将硬编码值改为可配置参数：

```python
# ❌ 不通用：硬编码特定字段
def analyze_sales():
    df = pd.read_excel("sales_data.xlsx")
    result = df.groupby("region")["amount"].sum()

# ✅ 通用化：参数化输入
def analyze_data(input_file, group_by_column, aggregate_column, method="sum"):
    """
    通用数据聚合分析
    :param input_file: 输入文件路径
    :param group_by_column: 分组列名
    :param aggregate_column: 聚合列名
    :param method: 聚合方法 (sum/mean/count/etc)
    """
    df = pd.read_excel(input_file)
    return df.groupby(group_by_column)[aggregate_column].agg(method)
```

#### 3. 使用命令行参数

```python
import argparse

def main():
    parser = argparse.ArgumentParser(description="通用数据聚合工具")
    parser.add_argument("--input", required=True, help="输入文件路径")
    parser.add_argument("--output", help="输出文件路径")
    parser.add_argument("--group-by", required=True, help="分组列名")
    parser.add_argument("--agg-column", required=True, help="聚合列名")
    parser.add_argument("--method", default="sum", help="聚合方法")
    args = parser.parse_args()
    # ... 处理逻辑
```

#### 4. 配置文件支持

复杂逻辑使用配置文件：

```yaml
# config.yaml
transformations:
  - column: "date"
    action: "parse_format"
    params: {"format": "%Y-%m-%d"}
  - column: "amount"
    action: "fill_na"
    params: {"value": 0}
```

### 保存新脚本

脚本验证成功后：

1. 使用**通用性强的命名**：
   - ✅ `aggregate_data.py`、`convert_format.py`、`clean_dataset.py`
   - ❌ `analyze_sales_2024.py`、`fix_import_error.py`

2. 保存到 `./executable_code/` 文件夹

3. 在 `./executable_code/README.md` 添加说明，包含：
   - **通用功能描述**（描述解决的问题类型，非具体业务）
   - 使用方法（含所有参数说明）
   - 输入/输出格式
   - 使用示例
   - 依赖要求

### 修改现有脚本

修改 `./executable_code/` 下的脚本时：

1. 保持/增强通用性，避免收缩为特定用途
2. 同步更新 README.md 文档
3. 在变更日志中记录修改内容

## Examples

**场景：用户请求分析销售数据**

```
用户：帮我分析这个 Excel 文件，按地区统计销售额

思考过程：
1. 这是一个"数据聚合"问题，属于通用模式
2. 检查 ./executable_code/README.md 是否有聚合工具
3. 如没有，创建通用聚合脚本 aggregate_data.py
4. 支持参数：--input、--group-by、--agg-column、--method
5. 用户调用：python ./executable_code/aggregate_data.py \
              --input data.xlsx --group-by region --agg-column amount
```

**通用脚本模板示例：**

```python
#!/usr/bin/env python3
"""
通用数据聚合工具
支持按任意列分组，对任意列进行聚合统计
"""

import argparse
import pandas as pd

def aggregate_data(input_file, group_by, agg_column, method="sum", output=None):
    """通用聚合函数"""
    # 根据文件扩展名选择读取方法
    ext = input_file.split(".")[-1]
    read_func = getattr(pd, f"read_{ext}", pd.read_csv)
    df = read_func(input_file)

    # 执行聚合
    result = df.groupby(group_by)[agg_column].agg(method)

    # 输出
    if output:
        result.to_csv(output)
    return result

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="通用数据聚合工具")
    parser.add_argument("--input", "-i", required=True, help="输入文件路径")
    parser.add_argument("--group-by", "-g", required=True, help="分组列名")
    parser.add_argument("--agg-column", "-a", required=True, help="聚合列名")
    parser.add_argument("--method", "-m", default="sum",
                       choices=["sum", "mean", "count", "min", "max"],
                       help="聚合方法")
    parser.add_argument("--output", "-o", help="输出文件路径")
    args = parser.parse_args()

    aggregate_data(args.input, args.group_by, args.agg_column,
                   args.method, args.output)
```

## Guidelines

### 通用化设计原则

- **抽象思维**：识别问题的本质模式，而非表面细节
- **参数化一切**：任何可能变化的值都应可配置
- **避免业务术语**：使用通用技术术语（如 "group_by" 而非 "region"）
- **支持扩展**：预留扩展点，便于未来增加新功能
- **提供默认值**：合理默认值降低使用门槛

### 命名规范

| 类型 | 推荐 | 避免 |
|-----|------|------|
| 脚本名 | `aggregate_data.py` | `sales_analysis.py` |
| 参数名 | `--group-by` | `--region` |
| 函数名 | `transform_data()` | `fix_sales_format()` |

### 文档规范

README 条目应说明：
- **解决哪类问题**（非具体业务场景）
- **所有参数及默认值**
- **支持的输入格式**
- **使用示例**（至少2个不同场景）

### 何时创建新脚本

创建新脚本当：
- 现有脚本无法通过参数调整满足需求
- 问题属于新的通用模式
- 预计该场景会重复出现

### 何时修改现有脚本

修改现有脚本当：
- 增强通用性（添加新参数/配置）
- 修复 bug 但不破坏现有接口
- 扩展功能范围

## Directory Structure

```
./executable_code/
├── README.md              # 脚本目录和使用说明（必须存在）
├── aggregate_data.py      # 通用聚合工具
├── convert_format.py      # 格式转换工具
├── clean_dataset.py       # 数据清洗工具
└── config/                # 可选：配置文件目录
    └── templates.yaml
```
