"""时间衰减:招聘数据存在时滞,越旧的 JD 对当前能力刻画的贡献越低。 权重公式:w = exp(-λ · age),age 为发布日期距参考日期的年数。 """ from __future__ import annotations import logging import math from datetime import date from app.models import JDRecord logger = logging.getLogger(__name__) def decay_weight(publish_date: date, ref_date: date, lam: float = 0.35) -> float: """计算单条 JD 的时间衰减权重。""" age_years = max(0.0, (ref_date - publish_date).days / 365.25) return round(math.exp(-lam * age_years), 4) def apply_decay( records: list[JDRecord], ref_date: date | None = None, lam: float = 0.35, ) -> list[JDRecord]: """就地更新每条记录的 weight(与已有降权相乘,不会覆盖抄袭降权)。""" if ref_date is None: ref_date = max((r.publish_date for r in records), default=date.today()) for r in records: r.weight = round(r.weight * decay_weight(r.publish_date, ref_date, lam), 4) logger.info("时间衰减完成:λ=%.3f,参考日期 %s", lam, ref_date.isoformat()) return records