From 86727827ae7096cc45c0323837b2c718be7da2de Mon Sep 17 00:00:00 2001 From: zlt Date: Fri, 4 Sep 2026 09:14:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BB=E6=95=B0=E8=84=9A=E6=9C=AC=EF=BC=9A?= =?UTF-8?q?=E5=BF=AB=E7=85=A7=E7=9A=84=20NaN=20=E5=BD=92=E4=B8=80=E6=88=90?= =?UTF-8?q?=20None=EF=BC=8C=E7=8E=AF=E8=8A=82=E5=90=8D=E7=A9=BA=E5=80=BC?= =?UTF-8?q?=E4=B8=8D=E8=BF=9B=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 --- logic_state_coverage.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) 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 "