大家好,
我今天遇到一个无法解决的问题,因为我不知道从哪里开始。
我想计算最近x年来每个特定年份和YearXmonth的Portofolio的总暴露量。
例如,如果合同在2018年1月1日开始并在2018年11月15日结束,则该合同在2018年暴露了11个月或11/12年或318天。在2018年1月,该合同暴露了1个月,1/12年或31天,...
2019年,合同完全没有暴露。
这是我所拥有的信息:
data have;
length ID Status $ 40;
input Id Status $ Date_of_effect Date_Status ;
informat Date_of_effect Date_Status date9.;
format Date_of_effect Date_Status date9.;
infile datalines missover;
datalines;
1 Ongoing 05jul2015 05jul2015
1 Transformation 23Oct2014 05jul2015
2 Death 07jan2017 02dec2018
3 Finished 13feb2005 13feb2015
4 NoEffect 06nov2016 06nov2016
5 Cancellation 08MAR2014 19dec2018
6 Pending 21oct2018 21oct2018
;
run;
ID是合同编号
状态是合同的当前状态
Date_of_effect是合同生效并开始公开的日期。
Date_Status是状态更改的日期。
对于状态为“无影响”,“进行中”或“待处理”的合同,date_of_effect等于Status_date。对于进行中和待处理的合同,我需要计算当天的风险敞口。因此,我认为我需要对那些合同应用不同的规则。对于其他状态,合同已在Date_of_effect和Date_Status之间公开。
我想创建3个差值表,其中第一个表总结了以月和年表示的每年的总曝光量。
data Want_1;
input Year Sum_Exposition_in_year Sum_Exposition_in_months Sum_Exposition_in_days;
infile datalines missover;
datalines;
2014
2015
2016
2017
2018
2019
;
run;
第二张表基本相同,除了我引入了额外的细分:
data Want_2;
input Year month Sum_Exposition_in_year Sum_Exposition_in_months Sum_Exposition_in_days;
infile datalines missover;
datalines;
2014 1
2014 2
2014 3
2014 4
2014 5
2014 6
2014 7
2014 8
2014 9
2014 10
2014 11
2014 12
2015 1
2015 2
2015 3
2015 4
2015 5
2015 6
2015 7
2015 8
2015 9
2015 10
2015 11
2015 12
... ...
;
run;
最后,我想计算以天和月表示的几年合约的风险敞口。
data Want_3;
length ID Status $ 40;
input Id Status $ Date_of_effect Date_Status Expo_days_2015 Expo_days_2016 Expo_days_2017 Expo_days_2018 Expo_days_2019 Expo_month_2015 Expo_month_2016 Expo_month_2017 Expo_month_2018 Expo_month_2019 ;
informat Date_of_effect Date_Status date9.;
format Date_of_effect Date_Status date9.;
infile datalines missover;
datalines;
1 Ongoing 05jul2015 05jul2015 179 365 365 365 153 6 12 12 12 6
1 Transformation 23Oct2014 05jul2015
2 Death 07jan2017 02dec2018
3 Finished 13feb2005 13feb2015
4 NoEffect 06nov2016 06nov2016
5 Cancellation 08MAR2014 19dec2018
6 Pending 21oct2018 21oct2018
;
run;
如果我不够清楚,我深表歉意。不要犹豫,问我更多细节。
谢谢。
答案 0 :(得分:0)
我几乎达到了我想要的目标,但是在宏语句中创建宏变量时遇到了困难。
感谢您评论了我的帖子。我喜欢自己学习,以提高我在sas方面的知识。 :)
%let a=2015;
%let b=2019;
data Want_0 (drop=i) ;
set have;
array Expo_d_ (&a.:&b.) Expo_d_&a.-Expo_d_&b.;
array Expo_m_ (&a.:&b.) Expo_m_&a.-Expo_m_&b.;
if Status = "Ongoing" or Status="Pending" then
Date_Status=today();
do i=&a. to &b.;
Expo_d_(i) = max(0,min(mdy(01,01,i+1),Date_Status)-max(Date_of_effect,mdy(1,1,i)));
Expo_m_(i) = max(0,round((min(mdy(01,01,i+1),Date_Status)-max(Date_of_effect,mdy(1,1,i)))/(365.25/12),1));
end;
run;
%macro Do_stock;
proc sql noprint;
%do i=&a. %to &b.;
select sum(Expo_d_&i.) into: Expo_d_&i.
from work.Want_0;
select sum(Expo_m_&i.) into: Expo_m_&i.
from work.Want_0;
%end;
quit;
run;
%do i=&a. %to &b.;
%put Expo_d_&i.;
%put Expo_m_&i.;
%end;
%mend;
%Do_stock;
data Want_1 ( drop=i);
do i = &a. to &b.;
year= i;
Expo_day=&Expo_d_&i.;
Expo_month=&Expo_m_&i.;
end;
run;