From 5c3efbff940bf58277bc7a60ffb7f2b3416788ef Mon Sep 17 00:00:00 2001 From: zlt Date: Wed, 5 Aug 2026 10:24:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=A7=E4=B8=9A=E9=93=BE=E7=BB=86=E5=8C=96?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chain_diag.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/chain_diag.py b/chain_diag.py index b6fa508..d13f341 100644 --- a/chain_diag.py +++ b/chain_diag.py @@ -242,7 +242,7 @@ def diag_matrix(yml: dict, mem: pd.DataFrame, chain2track, kw, outdir: str) -> N # ---------------------------------------------------------------- 读数四 -def diag_misskill(segs: dict, outdir: str) -> None: +def diag_misskill(mem: pd.DataFrame, outdir: str) -> None: d = db.read_mysql("factor", "SELECT MAX(trade_date) d FROM t_factor_akg_gate") v = None if d.empty else d.iloc[0, 0] if v is None or pd.isna(v): @@ -256,13 +256,17 @@ def diag_misskill(segs: dict, outdir: str) -> None: gate = {str(r.stock_code).strip(): float(r.factor_value) for r in g.itertuples()} upside = {str(r.stock_code).strip(): float(r.factor_value) for r in up.itertuples()} + # 图谱证据按"该股自己的成员边"逐行归集——链名取本股边上的 chain 修饰。 + # 首版从环节聚合继承整个环节的链名集合,串味成"3D打印、6G"满屏(08-05 实测),勿回退。 stock_ev: dict[str, dict] = {} # 前缀码 → 图谱证据 - for seg, dd in segs.items(): - for ts in dd["listed_set"]: - k = common.to_prefix(ts) - e = stock_ev.setdefault(k, {"name": "", "segs": [], "chains": set()}) - e["segs"].append(seg) - e["chains"] |= set(dd["chains"]) + for r in mem.itertuples(): + if pd.isna(r.ts_code) or not str(r.ts_code).strip(): + continue + k = common.to_prefix(str(r.ts_code).strip()) + e = stock_ev.setdefault(k, {"name": "", "segs": set(), "chains": set()}) + e["segs"].add(r.segment_name) + if r.chain: + e["chains"].add(r.chain) names = {} try: pools = db.read_pg("SELECT members FROM industry_pools") @@ -281,8 +285,8 @@ def diag_misskill(segs: dict, outdir: str) -> None: e = stock_ev[k] nm = names.get(k, "") risk = "风险股" if re.match(r"^(\*?S?ST|退市)", nm.replace(" ", "")) else "" - return (k, nm, risk, len(set(e["segs"])), - "、".join(sorted(set(e["segs"]))[:3]), + return (k, nm, risk, len(e["segs"]), + "、".join(sorted(e["segs"])[:3]), "、".join(sorted(e["chains"])[:3])) a_rows = [(_row(k) + (round(upside[k], 4),)) @@ -459,7 +463,7 @@ def main() -> int: ("读数一", lambda: diag_unordered(segs, edg, seg2track, chain2track, outdir)), ("读数二", lambda: diag_unmapped(segs, seg2track, chain2track, track_all, outdir)), ("读数三", lambda: diag_matrix(yml, mem, chain2track, kw, outdir)), - ("读数四", lambda: diag_misskill(segs, outdir)), + ("读数四", lambda: diag_misskill(mem, outdir)), ("读数五", lambda: diag_fragmentation(segs, mem, edg, outdir)), ("读数六", lambda: diag_research(yml, mem, edg, kw, outdir)), ]: