diff --git a/logic_state_coverage.py b/logic_state_coverage.py index 7a5a920..34d2ae3 100644 --- a/logic_state_coverage.py +++ b/logic_state_coverage.py @@ -99,7 +99,19 @@ def snapshot_of(day: str) -> dict: except Exception as e: # noqa: BLE001 print(f" (行业观点快照表读取失败,乙路整体缺席: {e!r})") return {} - return {str(r["cluster_key"]): dict(r) for _, r in df.iterrows()} if not df.empty else {} + if df.empty: + return {} + # pandas 把空值读成 NaN,而 NaN 是真值——直接往下传会让"没有上一版倾向"看着像有值。 + # 全部归一成 None,判据那边只认 None。 + import math + + def _n(v): + if v is None or (isinstance(v, float) and math.isnan(v)): + return None + return v + + return {str(r["cluster_key"]): {k: _n(v) for k, v in r.items()} + for _, r in df.iterrows()} def main(ds: str | None = None) -> None: @@ -121,8 +133,11 @@ def main(ds: str | None = None) -> None: # 乙路按环节名对上主题:候选卡按环节,产业研判按主题聚簇,两者不在一个命名空间, # 这里只做同名匹配,对不上的票乙路就是缺失。这一路的天花板本来就低(实测 1.4%)。 - by_seg = {(r.get("segment_name") or r.get("subject_name") or "").strip(): r - for r in snaps.values()} + by_seg = {} + for r in snaps.values(): + name = str(r.get("segment_name") or r.get("subject_name") or "").strip() + if name: + by_seg[name] = r seg_of = {} try: d = db.read_pg("SELECT ts_code, target FROM v_factor_transmission_moved "