You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAS按customer_nr和account_nr组合填充下一个default date方案咨询

SAS实现按客户+账户分组填充违约日期方案

实现逻辑说明

  • 首先按customer_nr、account_nr分组,对观测按时间顺序排序(默认原始数据已带对应时序字段,如观测日期obs_date)
  • 每组内先提取所有default_flag = 1对应的违约日期,生成有序的违约日期序列
  • 对每组内的每条观测匹配对应区间的违约日期:
    • 首次违约之前的观测,填充首次违约日期
    • 两次违约之间的观测,填充后一次的违约日期
    • 最后一次违约之后的观测,统一填充最后一次的违约日期

完整代码实现

/* 第一步:对原始数据按分组+时间排序 */
proc sort data=你的原始数据集名 out=sorted_data;
    by customer_nr account_nr obs_date; /* obs_date替换为实际的时间字段名 */
run;

/* 第二步:提取每组所有违约日期,生成映射表 */
proc sql noprint;
    create table default_dates as
    select distinct customer_nr, account_nr, default_date as dt
    from sorted_data
    where default_flag = 1
    order by customer_nr, account_nr, dt;
quit;

/* 第三步:用DOW循环按分组匹配填充日期 */
data want;
    if _n_ = 1 then do;
        /* 加载违约日期到哈希表,按分组存储有序序列 */
        declare hash h(dataset:'default_dates', ordered:'a');
        h.definekey('customer_nr','account_nr');
        h.definedata('dt');
        h.definedone();
        declare hiter hi('h');
    end;

    /* 逐组处理原始数据 */
    do until(last.account_nr);
        set sorted_data;
        by customer_nr account_nr;
        length filled_default_date 8;
        format filled_default_date yymmdd10.; /* 日期格式可根据需要调整 */
        filled_default_date = .;

        /* 遍历当前组的所有违约日期匹配区间 */
        rc = hi.first();
        do while(rc = 0);
            if obs_date <= dt then do;
                filled_default_date = dt;
                leave;
            end;
            rc = hi.next();
        end;

        /* 最后一次违约之后的观测,填充最后一次违约日期 */
        if filled_default_date = . then filled_default_date = dt;

        output;
    end;
    drop rc dt;
run;

代码调整说明

  • 代码中的你的原始数据集名、obs_date、default_date、default_flag需替换为实际数据集对应的字段名
  • 日期输出格式可根据需求调整,如需中文格式可将yymmdd10.替换为cnymmdd10.或其他自定义格式

内容的提问来源于stack exchange,提问作者Qurban Abbasov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:12:04