perf(factor): 因子矩阵宽表化polars pivot改pandas pivot——py-spy实锤10.4M行polars pivot单次10+分钟,唯一键下pandas=factorize+reshape秒级;索引/列语义与后续切窗掩码不变 [vps]

This commit is contained in:
2026-08-25 23:56:44 +08:00
parent 919fa50d0f
commit 75f824341b
+4 -2
View File
@@ -144,9 +144,11 @@ def _eval_one(name: str, alpha_df: pl.DataFrame, cutoff_map: dict[str, _dt],
# 优化:先 pivot 全表,再 pandas 切窗口+预热期广播掩码置 NaN(替代 per-factor hash join
# 语义等价性:join 版把「窗口外或 bar_idx<WARMUP」的行剔除;新版这些位置变 NaN
# 下游 rank_corr_rows/metrics 所有指标以 NaN=缺失自动剔除,两者等价
Fw = res.pivot(index="datetime", on="vt_symbol", values="data").sort("datetime")
F = Fw.to_pandas().set_index("datetime")
# polars pivot 在 10M 行宽表化分钟级(py-spy实锤);唯一键下 pandas pivot=factorize+reshape 秒级
_pd = res.to_pandas()
F = _pd.pivot(index="datetime", columns="vt_symbol", values="data").sort_index()
F.index = pd.to_datetime(F.index)
F.columns.name = None
F = F.loc[start_dt:end_dt] # 评估窗口切片
# 预热期前置 NaN:每列用对应 cutoff_map[vt_symbol] 进行广播比较
cut_arr = pd.Series([cutoff_map.get(s) for s in F.columns], index=F.columns).to_numpy()