datamart

作者: 寒微123 | 来源:发表于2018-04-26 15:18 被阅读0次

    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;

    相关文章

      网友评论

          本文标题:datamart

          本文链接:https://www.haomeiwen.com/subject/ojhvkftx.html