SAS中文论坛

标题: 请教一个算法 [打印本页]

作者: muir    时间: 2014-6-17 22:29
标题: 请教一个算法
本帖最后由 muir 于 2014-6-17 22:31 编辑

大家好,我在工作中遇到一个问题,请教大家。
公司要我算一批账户的交易流水,规定24小时内,等额进出的交易全部剔除。
现有表格如下:
客户号(char),交易时间(datetime),交易类型(in/out),交易金额(正数),交易金额2(带正负号)

我想了一个算法,首先将数据拆成每个客户一张表,结构如下:
客户号(char),交易时间(datetime),交易类型(in/out),交易金额(正数),交易金额2(带正负号),序号(_N_)

然后将单个客户的交易时间,交易金额2,以及序号,转置成两张表,并计算出这个客户交易的总条数
proc transpose data=cust_trans out=tmp_time;
by cust_id;
var datetime;
run;
proc transpose data=cust_trans out=tmp_xh;
by cust_id;
var xh;
run;
proc transpose data=cust_trans out=tmp_fee;
by cust_id;
var fee;
run;

proc sql noprint;
select count(*) as cnt into:cnt from cust_trans;
quit;

接着把这三张表合并
data tmp_result;
merge tmp_time tmp_xh tmp_fee;
by cust_id;
%do i=1 %to %eval(&cnt.-1);
        %do j=2 %to &cnt.;
              if -86400<time&i.-time&j.<86400 and fee&i.+fee&j.=0 then do;
                   xh&i.=xh&i.*0;
                   xh&j.=xh&j.*0;
                   fee&i.=fee&i.*0;
                   fee&j.=fee&j.*0;
             end;
        %end;
%end;
%do i=1 %to &cnt.;
        if xh&i.>0 then do;
            xh=xh&i.;
            output;
        end;
%end;
keep cust_id xh;
run;

再下来,用tmp_result,去cust_trans内,配出需要留下的交易,最后append到一起。

但是这么做却有一个问题数据量较大,空间内存不足。
想请高手帮我看看,我该如何优化这段程序,谢谢!


作者: hopewell    时间: 2014-6-18 09:38
24小时的时间窗是怎么定义的?

作者: muir    时间: 2014-6-18 21:57
hopewell 发表于 2014-6-18 09:38
24小时的时间窗是怎么定义的?

-86400<time&i.-time&j.<86400

86400秒
作者: mono    时间: 2014-6-19 07:55
我用SAS算过超过100 millions 条数据也没出现内存不足的情况。你用output 命令会生成HTML 文件,这样就太费内存了,建议你用delete, 第二个do 循环不用了删掉。。
作者: muir    时间: 2014-6-21 10:38
mono 发表于 2014-6-19 07:55
我用SAS算过超过100 millions 条数据也没出现内存不足的情况。你用output 命令会生成HTML 文件,这样就太费 ...

output是不是数据到数据集的意思啊?会生成html文件吗?
第二个do是为了把横向排列的表,变为纵向啊,为啥不用呢?
如果电脑不给力,也别说100m了,1m的数据,大哥,你也跑不起来吧。。。

大哥,如果你有办法请赐教我啦,我比较愚钝了~~~
作者: mono    时间: 2014-6-21 22:13
muir 发表于 2014-6-21 10:38
output是不是数据到数据集的意思啊?会生成html文件吗?
第二个do是为了把横向排列的表,变为纵向啊,为 ...

哦,如果output 后没有跟out SAS 可能会默认生成一个HTML结果,或许我错了,你自己试试吧。如果你把一些数据发上来能帮助你的人可能会更多一些。
作者: muir    时间: 2014-6-22 08:01
mono 发表于 2014-6-21 22:13
哦,如果output 后没有跟out SAS 可能会默认生成一个HTML结果,或许我错了,你自己试试吧。如果你把一些 ...

大哥啊,数据结构已经有啦。。。
作者: gogotiger    时间: 2014-6-23 01:07
解释一下:
(1)‘规定24小时内,等额进出的交易全部剔除’, 是必须同一个客户的吗? 交易是全年365天每天24小时不间断的吗,24小时是不断的流动的动态的概念吗? 还是像股票一样每天有规定的交易时间?
(2)交易类型(in/out),交易金额(正数),交易金额2(带正负号) 之间的关系。
最好给个数据sample,初步感觉应该不难。

作者: muir    时间: 2014-6-24 21:47
gogotiger 发表于 2014-6-23 01:07
解释一下:
(1)‘规定24小时内,等额进出的交易全部剔除’, 是必须同一个客户的吗? 交易是全年365天每天 ...

1,同一客户,只要客户有交易,就不间断,就像银行卡一样,随时都可能产生交易
2,举例
客户号(char),交易时间(datetime),交易类型(in/out),交易金额(正数),交易金额2(正负号),序号(_N_)
000000001, 2010-01-01 00:01:12,in ,                   1000 ,             1000 ,                         1
000000001, 2010-01-01 00:01:22,out ,                 1000 ,            - 1000 ,                        2
000000001, 2010-01-01 00:05:22,in ,                 10000 ,             10000 ,                        3

每个客户的观测数,按照其交易数量来看,所以是不固定的。
谢谢~~~




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2