请选择 进入手机版 | 继续访问电脑版

SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2676|回复: 8

请教一个算法

[复制链接]

3

主题

8

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 2014-6-17 22:29:30 | 显示全部楼层 |阅读模式
本帖最后由 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到一起。

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

回复

使用道具 举报

2

主题

18

帖子

441

积分

中级会员

Rank: 3Rank: 3

积分
441
发表于 2014-6-18 09:38:35 | 显示全部楼层
24小时的时间窗是怎么定义的?
回复 支持 反对

使用道具 举报

3

主题

8

帖子

41

积分

新手上路

Rank: 1

积分
41
 楼主| 发表于 2014-6-18 21:57:27 | 显示全部楼层
hopewell 发表于 2014-6-18 09:38
24小时的时间窗是怎么定义的?

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

86400秒
回复 支持 反对

使用道具 举报

2

主题

41

帖子

318

积分

中级会员

Rank: 3Rank: 3

积分
318
发表于 2014-6-19 07:55:40 | 显示全部楼层
我用SAS算过超过100 millions 条数据也没出现内存不足的情况。你用output 命令会生成HTML 文件,这样就太费内存了,建议你用delete, 第二个do 循环不用了删掉。。
回复 支持 反对

使用道具 举报

3

主题

8

帖子

41

积分

新手上路

Rank: 1

积分
41
 楼主| 发表于 2014-6-21 10:38:09 | 显示全部楼层
mono 发表于 2014-6-19 07:55
我用SAS算过超过100 millions 条数据也没出现内存不足的情况。你用output 命令会生成HTML 文件,这样就太费 ...

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

大哥,如果你有办法请赐教我啦,我比较愚钝了~~~
回复 支持 反对

使用道具 举报

2

主题

41

帖子

318

积分

中级会员

Rank: 3Rank: 3

积分
318
发表于 2014-6-21 22:13:05 | 显示全部楼层
muir 发表于 2014-6-21 10:38
output是不是数据到数据集的意思啊?会生成html文件吗?
第二个do是为了把横向排列的表,变为纵向啊,为 ...

哦,如果output 后没有跟out SAS 可能会默认生成一个HTML结果,或许我错了,你自己试试吧。如果你把一些数据发上来能帮助你的人可能会更多一些。
回复 支持 反对

使用道具 举报

3

主题

8

帖子

41

积分

新手上路

Rank: 1

积分
41
 楼主| 发表于 2014-6-22 08:01:36 | 显示全部楼层
mono 发表于 2014-6-21 22:13
哦,如果output 后没有跟out SAS 可能会默认生成一个HTML结果,或许我错了,你自己试试吧。如果你把一些 ...

大哥啊,数据结构已经有啦。。。
回复 支持 反对

使用道具 举报

11

主题

49

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2014-6-23 01:07:32 | 显示全部楼层
解释一下:
(1)‘规定24小时内,等额进出的交易全部剔除’, 是必须同一个客户的吗? 交易是全年365天每天24小时不间断的吗,24小时是不断的流动的动态的概念吗? 还是像股票一样每天有规定的交易时间?
(2)交易类型(in/out),交易金额(正数),交易金额2(带正负号) 之间的关系。
最好给个数据sample,初步感觉应该不难。
回复 支持 反对

使用道具 举报

3

主题

8

帖子

41

积分

新手上路

Rank: 1

积分
41
 楼主| 发表于 2014-6-24 21:47:10 | 显示全部楼层
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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2024-4-19 03:17 , Processed in 0.169567 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表