2026-03-02 22:29:18 +08:00
|
|
|
|
"""数据规格和执行计划定义。
|
|
|
|
|
|
|
|
|
|
|
|
定义因子计算所需的数据规格和执行计划结构。
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
from dataclasses import dataclass, field
|
2026-03-04 23:35:20 +08:00
|
|
|
|
from typing import Any, Dict, List, Literal, Optional, Set, Union
|
2026-03-02 22:29:18 +08:00
|
|
|
|
|
|
|
|
|
|
import polars as pl
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
|
class DataSpec:
|
2026-03-04 23:35:20 +08:00
|
|
|
|
"""数据规格定义(支持多表类型)。
|
2026-03-02 22:29:18 +08:00
|
|
|
|
|
2026-03-04 23:35:20 +08:00
|
|
|
|
描述因子计算所需的数据表和字段,支持多种拼接类型。
|
2026-03-02 22:29:18 +08:00
|
|
|
|
|
|
|
|
|
|
Attributes:
|
|
|
|
|
|
table: 数据表名称
|
|
|
|
|
|
columns: 需要的字段列表
|
2026-03-04 23:35:20 +08:00
|
|
|
|
join_type: 拼接类型
|
|
|
|
|
|
- "standard": 标准等值匹配(默认)
|
|
|
|
|
|
- "asof_backward": 向后寻找最近历史数据(财务数据用)
|
|
|
|
|
|
left_on: 左表 join 键(asof 模式下必须指定)
|
|
|
|
|
|
right_on: 右表 join 键(asof 模式下必须指定)
|
2026-03-02 22:29:18 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
table: str
|
|
|
|
|
|
columns: List[str]
|
2026-03-04 23:35:20 +08:00
|
|
|
|
join_type: Literal["standard", "asof_backward"] = "standard"
|
|
|
|
|
|
left_on: Optional[str] = None # 行情表日期列名
|
|
|
|
|
|
right_on: Optional[str] = None # 财务表日期列名
|
|
|
|
|
|
|
|
|
|
|
|
def __post_init__(self):
|
|
|
|
|
|
"""验证 asof_backward 模式的参数。"""
|
|
|
|
|
|
if self.join_type == "asof_backward":
|
|
|
|
|
|
if not self.left_on or not self.right_on:
|
|
|
|
|
|
raise ValueError("asof_backward 模式必须指定 left_on 和 right_on")
|
2026-03-02 22:29:18 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
|
class ExecutionPlan:
|
|
|
|
|
|
"""执行计划。
|
|
|
|
|
|
|
|
|
|
|
|
包含完整的执行所需信息:数据源、转换逻辑、输出格式。
|
|
|
|
|
|
|
|
|
|
|
|
Attributes:
|
|
|
|
|
|
data_specs: 数据规格列表
|
|
|
|
|
|
polars_expr: Polars 表达式
|
|
|
|
|
|
dependencies: 依赖的原始字段
|
|
|
|
|
|
output_name: 输出因子名称
|
|
|
|
|
|
factor_dependencies: 依赖的其他因子名称(用于分步执行)
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
data_specs: List[DataSpec]
|
|
|
|
|
|
polars_expr: pl.Expr
|
|
|
|
|
|
dependencies: Set[str]
|
|
|
|
|
|
output_name: str
|
|
|
|
|
|
factor_dependencies: Set[str] = field(default_factory=set)
|