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
相关产品推荐
相关产品推荐

