SAS Documentation
SASĀ® Solution for Stress Testing
Reference manual - version 08.2021
Loading...
Searching...
No Matches
irmst_calculate_agg_bep_value.sas
1%macro irmst_calculate_agg_bep_value( ds_in =
2 , ds_in_agg_rules =
3 , ds_in_agg_rules_enrchd =
4 , ds_out =
5 );
6
7 %local
8 src_keep_var
9 n_src_var_cols
10 src_var_cols
11 n_agg_types
12 agg_types
13 n_weights
14 weight_vars
15 tmp_w_var
16 src_var_cols_fnl
17 inx
18 j jj
19 ;
20 /* Get a list of variables used in the where conditions */
21 %let src_keep_var=;
22 %irm_get_vars_where_cond(ds_in = &ds_in_agg_rules.
23 , where_vars_col = src_where_vars
24 , var_list = src_keep_var
25 );
26
27 /* Get the aggregation types and source columns for the proc hpsummary*/
28 proc sql noprint;
29 select count(c.src_col) , c.src_col
30 into :n_src_var_cols , :src_var_cols separated by ' '
31 from (select distinct src_col
32 from &ds_in_agg_rules_enrchd.) as c;
33
34 select count(c.aggregation_rule) , c.aggregation_rule
35 into :n_agg_types , :agg_types separated by ' '
36 from (select distinct aggregation_rule
37 from &ds_in_agg_rules_enrchd.) as c;
38
39 select count(c.weight_var) , c.weight_var
40 into :n_weights , :weight_vars separated by ' '
41 from (select distinct weight_var from &ds_in_agg_rules. )as c;
42 quit;
43
44 %do j = 1 %to &n_weights.;
45 proc sql;
46 select distinct src_col into: tmp_var_stmt_&j. separated by ' '
47 from &ds_in_agg_rules_enrchd. WHERE weight_var=scan("&weight_vars.",&j.,' ');
48 quit;
49 data _null_;
50 call symputx("vars_stmt_&j.",cats("&&tmp_var_stmt_&j..",' /','weight = ',scan("&weight_vars.",&j.,' ')));
51 run;
52 %end;
53
54 data _null_;
55 length temp_stmt $2000.;
56 do i = 1 to &n_agg_types.;
57 agg_type=scan("&agg_types.",i,' ');
58 temp_stmt_l=trim(agg_type)||'('||"&src_var_cols"||')';
59 do ii = 1 to &n_src_var_cols.;
60 src_col=scan("&src_var_cols",-ii,' ');
61 temp_stmt_r=trim(src_col)||'_'||trim(agg_type);
62 temp_stmt=trim(temp_stmt_r)||' '||trim(temp_stmt);
63 end;
64 temp_stmt=trim(temp_stmt_l)||'='||temp_stmt;
65 end;
66 call symputx('agg_type_out_stmt',trim(temp_stmt));
67 run;
68
69 /* Aggregate data */
70 proc summary data = &ds_in.;
71 class FORECAST_TIME &src_keep_var.;
72 %if &n_weights. > 0 %then %do;
73 %do jj = 1 %to &n_weights.;
74 vars &&vars_stmt_&jj..;
75 %let tmp_w_var = %trim(%scan(&&tmp_var_stmt_&jj..,1,' '));
76 %if &jj = 1 %then %do;
77 %let src_var_cols_fnl_&jj = %sysfunc(tranwrd(&src_var_cols.,&tmp_w_var.,%str()));
78 %end;
79 %else %do;
80 %let inx = %eval(&jj.-1);
81 %let src_var_cols_fnl_&jj = %sysfunc(tranwrd(&&src_var_cols_fnl_&inx..,&tmp_w_var.,%str()));
82 %end;
83 %if &jj. = &n_weights. %then %do;
84 %let src_var_cols_fnl = &&src_var_cols_fnl_&jj.;
85 %end;
86 %end;
87 %end;
88 %else
89 %let src_var_cols_fnl = &src_var_cols.;
90 vars &src_var_cols_fnl.;
91 output out = &ds_out. (drop=_TYPE_ _FREQ_) &agg_type_out_stmt.;
92 run;
93%mend;