# 连接器与变换操作参考

## ConnectorFactory — 3 种数据连接器

ConnectorFactory 通过 `type` 字段自动路由到对应的连接器。

### csv — CSV 文件连接器

从本地 CSV 文件加载 DataFrame。

```json
{"type": "csv", "path": "data/stock.csv", "encoding": "utf-8"}
```

- `path`: 相对于 `data_dir`（默认 `ppt-st/data/`）或绝对路径
- `encoding`: 默认 `utf-8`

### xlsx — Excel 文件连接器

从 Excel 文件加载 DataFrame。

```json
{"type": "xlsx", "path": "data/report.xlsx", "sheet_name": "Sheet1"}
```

- `path`: 同 csv
- `sheet_name`: 工作表名，默认第一个

### tushare — Tushare 金融数据连接器

从 Tushare Pro API 获取 A 股市场数据。

```json
{
  "type": "tushare",
  "api_name": "pro_bar",
  "ts_code": "600519.SH",
  "start_date": "20240101",
  "end_date": "20241231"
}
```

支持的 `api_name`:
- `index_daily`: 指数日线数据（需 `ts_code` 或 `index_code`）
- `pro_bar`: 通用日线数据，前复权（需 `ts_code`）

返回的 DataFrame 自动按 `trade_date` 升序排列，`trade_date` 列已转为 datetime。

前置条件: `TUSHARE_TOKEN` 环境变量或 `.env` 文件。

## DataFrameTransformer — 7 种变换操作

变换在 `transforms` 中定义，每个变换指定 `from`（数据源）和 `ops`（有序操作列表）。

### 多源合并

`from` 支持字符串（单源）或数组（多源 concat）:

```json
{"from": ["stock_data", "index_data"], "ops": [...]}
```

多源使用 `pd.concat(axis=1)` 按列合并。

### groupby — 分组聚合

```json
{"type": "groupby", "by": ["year"], "agg": {"close": "mean", "vol": "sum"}}
```

### pivot — 透视表

```json
{"type": "pivot", "index": "trade_date", "columns": "indicator", "values": "value"}
```

### compute — 计算新列

```json
{"type": "compute", "expr": "close / close.iloc[0] - 1", "output_col": "cumulative_return"}
```

使用 `pandas.DataFrame.eval()`，支持列名引用。

### filter — 条件过滤

```json
{"type": "filter", "condition": "close > 100 and vol > 10000"}
```

使用 `pandas.DataFrame.query()`。

### sort — 排序

```json
{"type": "sort", "sort_by": ["trade_date"], "ascending": true}
```

### rename — 重命名列

```json
{"type": "rename", "map": {"trade_date": "日期", "close": "收盘价"}}
```

### merge — 未实现

会抛 `NotImplementedError`。替代方案:

```json
{"from": ["src1", "src2"], "ops": [...]}
```

用 `from` 数组实现 concat，然后用其他 ops 整理。

## 常用组合模式

### 合并两个 Tushare 序列

```json
{
  "datasources": {
    "stock": {"type": "tushare", "api_name": "pro_bar", "ts_code": "600519.SH"},
    "index": {"type": "tushare", "api_name": "pro_bar", "ts_code": "000300.SH"}
  },
  "transforms": {
    "combined": {
      "from": ["stock", "index"],
      "ops": [
        {"type": "rename", "map": {"close": "stock_close"}}
      ]
    }
  }
}
```

### 计算累计收益率

```json
{
  "ops": [
    {"type": "sort", "sort_by": ["trade_date"]},
    {"type": "compute", "expr": "close / close.iloc[0] - 1", "output_col": "累计收益率"}
  ]
}
```

### 过滤后重命名

```json
{
  "ops": [
    {"type": "filter", "condition": "trade_date >= '2024-01-01'"},
    {"type": "rename", "map": {"trade_date": "日期", "close": "收盘价"}},
    {"type": "sort", "sort_by": ["日期"]}
  ]
}
```
