perf(factor): 因子矩阵宽表化polars pivot改pandas pivot——py-spy实锤10.4M行polars pivot单次10+分钟,唯一键下pandas=factorize+reshape秒级;索引/列语义与后续切窗掩码不变 [vps]
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user