← Files Public Equity InvestingARCHIVED FILE
skills/equity-model-update/scripts/model_update_format.py
1.34 KB · Oct 2, 2026 · 00:03 UTC
from __future__ import annotations
import math
import re
from typing import Any
INVALID_NUMBERS = {"na", "n/a", "nm", "-", "--", "input required"}
def text(value: Any) -> str:
return "" if value is None else str(value).strip()
def first_text(row: dict[str, str], fields: tuple[str, ...]) -> str:
for field in fields:
value = text(row.get(field))
if value:
return value
return ""
def parse_number(value: Any) -> float | None:
raw = text(value)
if not raw:
return None
if raw.lower() in INVALID_NUMBERS:
return None
negative = raw.startswith("(") and raw.endswith(")")
cleaned = raw.replace(",", "").replace("$", "").replace("%", "").strip("() ")
match = re.search(r"[-+]?\d+(?:\.\d+)?", cleaned)
if not match:
return None
number = float(match.group(0))
if negative:
return -abs(number)
return number
def first_number(row: dict[str, str], fields: tuple[str, ...]) -> float | None:
for field in fields:
parsed = parse_number(row.get(field))
if parsed is not None:
return parsed
return None
def fmt_number(value: float | None) -> str:
if value is None or not math.isfinite(value):
return ""
rendered = f"{value:.1f}" if abs(value) >= 100 else f"{value:.2f}"
return rendered.rstrip("0").rstrip(".")
SHA-256: 9f8f015769c4d4ef742c380685c3d748f21e87c3dbfd077eb6345beaddca22fe