point_time_parts, version_flows = [], [] # 只收集开发期逐目标年样本与检查结果
for target_year in range(2016, 2023): # 构造 2016—2022 开发目标年,不提前构造 2023 标签
year_panel, year_flow = build_eps_year(target_year) # 执行固定决策日与评分日说明
point_time_parts.append(year_panel) # 保存当年面板
version_flows.append(year_flow) # 保存版本选择证据
development_panel = pd.concat(point_time_parts, ignore_index=True).replace([np.inf, -np.inf], np.nan).dropna(subset=['log_assets', 'debt_ratio', 'roa', 'next_eps']) # 合并开发期有效样本
assert not development_panel.duplicated(['order_book_id', 'target_year']).any() # 每公司目标年唯一
assert development_panel['target_year'].max() == 2022 # 保证最终测试目标年尚未构造或查看
assert set(development_panel['target_year']) == set(range(2016, 2023)) # 核对七个开发目标年完整
feature_names = ['log_assets', 'debt_ratio', 'roa'] # 确定特征字典
X_development, y_development = development_panel[feature_names], development_panel['next_eps'] # 构造开发期特征和目标
flow_table = pd.json_normalize(version_flows)[['target_year', 'feature.raw_versions', 'feature.excluded_after_cutoff', 'label.raw_versions', 'label.excluded_after_cutoff', 'merged']].set_axis(['年', '特征版本', '特征排除', '标签版本', '标签排除', '合并'], axis=1) # 用短列名展示完整样本数量变化
display(flow_table) # 输出全部目标年的版本与排除数
print({'开发期X': X_development.shape, 'feature_max': development_panel.feature_info_date.max().date(), 'label_min': development_panel.target_info_date.min().date(), '最终测试状态': '2023 标签尚未构造'}) # 输出紧凑不变量摘要