读数脚本:快照的 NaN 归一成 None,环节名空值不进索引
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
5a2a51a2d0
commit
86727827ae
|
|
@ -99,7 +99,19 @@ def snapshot_of(day: str) -> dict:
|
||||||
except Exception as e: # noqa: BLE001
|
except Exception as e: # noqa: BLE001
|
||||||
print(f" (行业观点快照表读取失败,乙路整体缺席: {e!r})")
|
print(f" (行业观点快照表读取失败,乙路整体缺席: {e!r})")
|
||||||
return {}
|
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:
|
def main(ds: str | None = None) -> None:
|
||||||
|
|
@ -121,8 +133,11 @@ def main(ds: str | None = None) -> None:
|
||||||
|
|
||||||
# 乙路按环节名对上主题:候选卡按环节,产业研判按主题聚簇,两者不在一个命名空间,
|
# 乙路按环节名对上主题:候选卡按环节,产业研判按主题聚簇,两者不在一个命名空间,
|
||||||
# 这里只做同名匹配,对不上的票乙路就是缺失。这一路的天花板本来就低(实测 1.4%)。
|
# 这里只做同名匹配,对不上的票乙路就是缺失。这一路的天花板本来就低(实测 1.4%)。
|
||||||
by_seg = {(r.get("segment_name") or r.get("subject_name") or "").strip(): r
|
by_seg = {}
|
||||||
for r in snaps.values()}
|
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 = {}
|
seg_of = {}
|
||||||
try:
|
try:
|
||||||
d = db.read_pg("SELECT ts_code, target FROM v_factor_transmission_moved "
|
d = db.read_pg("SELECT ts_code, target FROM v_factor_transmission_moved "
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue