1、取上周日日期和rolling12月的日期:
data timing;
format date1 yymmdd10. date2 yymmdd10.;
date2=intnx('week',today(),0);/上周末,数据截止日/
if mod(year(date2),4)=0 then do;
if (month(date2)100+day(date2))>228 then date1=date2-365;
else date1=date2-364;
end;
else if mod(year(date2)-1,4)=0 then do;
if month(date2)>2 then date1=date2-364;
else date1=date2-365;
end;
else date1=date2-364;/闰年,平年往前R12的date1计算/
month=year(date2)10000+month(date2)100+day(date2);/数据截止日*/
run;
2、转置:
PROC TRANSPOSE DATA=newcatbycnt out=newcatbycnt1(drop=NAME);
BY CustomerID; /列不变/
ID newcat; /newcat变为行/
VAR fag; /fag值/
run;
3、添加最后一笔往前rolling一年的日期oneyearago
data lastandfirst;
set lastandfirst;
format oneyearago yymmdd10.;
if month(lastpurchase) =2 and day(lastpurchase)=29 then do;
oneyearago=mdy(month(lastpurchase),day(lastpurchase)-1,
year(lastpurchase)-1)+1;
end;
else do;
oneyearago=mdy(month(lastpurchase),day(lastpurchase),
year(lastpurchase)-1)+1;
end;
run; /添加最后一笔往前rolling一年的日期oneyearago/
proc sort data=trans;by customer_id;run;
proc sort data=lastandfirst;by customer_id;run;
data trans;
merge trans(in=a) lastandfirst;
by customer_id;
if a;
oneyear=0;
if oneyearago<=purchasetime<=lasttime then oneyear=1;
run;
/************************************************************************/
4、/*********计算最后一笔往前rolling一年的av am af ipt************/
%macro rfm(input,timevar,output);
proc sql;
create table a1 as
select customer_id,purchasetime,sum(price) as salesbyday,sum(unit) as ui
from &input where &timevar=1 group by 1,2 having sum(price) ne 0;
quit;
proc sort data=a1;by customer_id purchasetime;run;
data &output(keep=customer_id av am af ipt);
set a1;
by customer_id;
if first.customer_id then do;
f=0;
v=0;
u=0;
end;
if salesbyday>0 then q=1;
else q=-1;
f+q;
v+salesbyday;
u+ui;
if last.customer_id then do;
if f=0 and v>0 then f=1;
if f ne 0 then do;
m=v/f;
ipt=u/f;
end;
av=v;
am=m;
af=f;
if f>0 then output;
end;
run;
%mend;
%rfm(trans,oneyear,rfm_1year);
/************************************************************************/
5、导出CSV:
proc export data=result
outfile='D:\Lancome_ec\报表\sampler.csv' dbms=csv replace;
run;
6、导入CSV:
%macro importcsv(dataset,path);
proc import datafile=&path out=&dataset;run;
%mend;
%importcsv(dataset=listwave,path="D:\Lancome_ec\报表\listwave.csv");
7、导入excel:
PROC IMPORT OUT= WORK.recommend_rule
DATAFILE= "E:\EC\kie\ff-test\recommend_rule.xlsx"
DBMS=EXCEL REPLACE;
SHEET="Sheet1$";
GETNAMES=YES;
RUN;
8、导出excel:
PROC EXPORT DATA=&input
OUTFILE= "E:\EC\kie\ff-test\result&output..xls"
DBMS=EXCEL REPLACE label;
SHEET="sheet1";
RUN;
9、/**************************excel多表导出*****************************/
方法1:
%macro report(input,output);
PROC EXPORT DATA=&input
OUTFILE= "E:\EC\kie\ff-test\定期项目\TMALL先试后买\Review\review&EC_date..xlsx"
DBMS=EXCEL REPLACE label;
SHEET="&output.";
RUN;
%mend;
%report(S2p_p2,先试后买推荐结果);
%report(P2p_p2,正装推荐结果);
%report(Productnum,正装回购人数);
%report(Samplenum,先试后买回购人数);
%report(p_time,正装回购参考日期);
%report(s_time,先试后买回购参考日期);
方法2:
libname xlout excel "E:\EC\kie\ff-test\定期项目\TMALL先试后买\Review\review&EC_date..xlsx";
proc datasets lib=xlout kill;run;
data xlout.先试后买推荐结果;set S2p_p2;run;
data xlout.正装推荐结果;set P2p_p2;run;
data xlout.正装回购人数;set Productnum;run;
data xlout.先试后买回购人数;set Samplenum;run;
data xlout.正装回购参考日期;set p_time;run;
data xlout.先试后买回购参考日期;set s_time;run;
libname xlout clear;
/***********************************************************************/
10、SAS 中可以利用PROC suveryselect 过程实现各种抽样
其一般形式是:
PROC SURVEYSELECT
data=<源数据集名>
method = <srs l urs l sys >
out=<抽取样本存放的数据集>
n=<抽取数量>(or samprate=抽样比例)
seed =n;
strata <指定分层变量>;
id <指定抽取的样本所保留的源数据集变量>;
run;
说明:method用来指定随机抽样方法的,其中SRS是指不放回简单随机抽样(Simple Random Samping);urs是指放回简单随机抽样(Unrestricted Random Sampling);sys是指系统抽样(Systematic Sampling)。
seed用来指定随机种子数,为非负整数,取0则每次抽取的样本不同,若取大于0的整数,则下次抽样时若输入相同值即可得到相同的样本;
id是指定从源数据集复制到样本数据集的变量,若缺省,则复制所有变量。
例子:
a、简单无重复随机抽样举例:
/按30%的比例从test数据集中抽取样本,并把样本输出到results数据集中/
proc surveyselect data=test1 out=results1 method=srs samprate=0.3;
run;
b、分层等比例随机抽样举例;
proc sort data=test2;
by 分层变量;
run; /先用分层变量对总体样本进行排序/
proc surveyselect data=test2 out=results2 method=srs samprate=0.1;
strata 分层变量;
run; /根据分层变量等比例从总体中抽取样本/
c、分层不等比例抽样举例;
(1)手工设置抽样比例或者抽样数
proc sort data=test3;
by 分层变量;
run; /先用分层变量对总体样本进行排序/
proc surveyselect data=test3 out=results3 method=srs
samprate=(0.1,0.3,0.5,0.2); /根据分层情况设置每一层要抽取的比例/
strata 分层变量;
run; /根据分层变量不等比例从总体中抽取样本/
proc surveyselect data=test3 out=results3 method=srs
n=(30,20,50,40); /根据分层情况设置每一层要抽取的样本数/
strata 分层变量;
run;
(2)根据抽样表进行不等比例抽样
proc sort data=test3;
by 分层变量;
run; /先用分层变量对总体样本进行排序/
proc surveyselect data=test3 out=results3 method=SRS
samprate=samp_table; /通过抽样比例数据集进行抽样,samp_table数据集中要包括分层变量 以及每一分层对应的抽样比例或者数量,如果按比例抽样变量必须用rate来命名抽样比例,如果是按数量抽样必须用nsize来命名抽样数量/
strata 分层变量;
run;
11、输出由freq出的类别的频数和百分比构成的表
ods csv file="G:\EC\KIE\online datamart&date\datamart_对比.csv";
/输出datamart_对比表,总表中control和test包括以下6个量/
proc freq data=t_test;table cluster;run;
proc freq data=c_control;table cluster;run;
proc freq data=t_test;table auscat;run;
proc freq data=c_control;table auscat;run;
proc freq data=t_test;table Frequency_online;run;
proc freq data=c_control;table Frequency_online;run;
ods csv close;
12.官网datamart字段
最后一笔往前rolling一年时间段:
Frequency_online 、AnnualSpending_online 、AUS_online 、ipt_online
数据截止日期往前rolling一年时间段:
Frequency_online_r12 、AnnualSpending_online_r12 、ipt_r12 am=AUS_online_r12
status字段中:
new_r12:首笔购买在数据截止日到往前rolling一年的时间内;
newrepeat_r12:首笔购买在数据截止日到往前rolling一年的时间内,并且次数>1;
Winback_R12:最后一笔购买在数据截止日到往前rolling一年的时间内,并且最后一笔距离倒数第二笔超过365天;
Existing_r12:数据截止日期往前rolling一年时间段内有购买、早于数据截止日期往前rolling一年有过购买,并且不是Winback_R12的人;
Winback_YTD:最后一笔在今年购买,第一笔在去年之前,并且去年没有购买过;
new_ytd:第一笔购买在今年;
Existing_YTD:去年线上购买过,今年线上又购买;
Active:最后一笔距离数据截止日的时间在360天以内;sleeping:最后一笔距离数据截止日的时间在361天到720天之间;
Lost:最后一笔距离数据截止日的时间在721天到1080天之间;
Lapsed:最后一笔距离数据截止日的时间超过1081天;
cluster字段:
cluster:最后一笔往前rolling一年的人购买产品类别的cluster;
cluster_all:数据截止日往前rolling一年的人购买产品类别的cluster;