SAS中文论坛

标题: 高手看看如何提升这个数据处理的效率 [打印本页]

作者: shiyiming    时间: 2009-9-21 16:41
标题: 高手看看如何提升这个数据处理的效率
由于不知道怎么贴图:(,所以只好用文字描述了:
我现在有1000万个用户数据,我需要用树形结构先对用户进行细分,然后分别统计每个细分群体的一些数据。
树形结构细分大概如下:
全体用户先分为A1、A2,然后A1又分为A1.1、A1.2,然后A1.1又继续分...
-A1
  -A1.1
        -A1.1.1
        -A1.1.2
        -A1.1.3
    -A1.2
        -A1.2.1
        -A1.2.1
...

-A2   
  -A2.1
   -A2.2
...

我现在需要用如下代码统计每个群体的数据:
proc means data=test.total(where=(x>10 and y>10)) n mean sum std min max;  /*x>10 and y>10是A1用户群的条件*/
var x1 x2 x3;
run;

由于树形结构细分的群体很多,大概有20多个,就意味着上述代码要运行20多遍(只需要改变相应where条件),这样效率太低了,不知道有没有更好的办法来提高运算效率。我的想法是给用户加上若干个分组标签,例如L1_seg表示用户属于A1还是A2;L2_seg表示用户属于A1.1、A1.2等;L3_seg表示用户属于A1.1.1 A1.1.2等,然后用如下代码:
data test.total;
set test.total;
if x1>10 and y>10 then L1_seg="A1";
if...                     then L1_seg="A2";
if..........            then L2_seg="A1.1";
...
run;
proc means data=test.total n mean sum std min max;
class L1_seg L2_seg...;
var x1 x2 x3;
types L1_seg L2_seg...;
run;

不知道是否还有更好的办法可以显著提高代码和运算效率,上面那种办法给用户加标签的时候把条件全部写出来好长啊,而且容易出错。
作者: shiyiming    时间: 2009-9-21 17:04
标题: Re: 高手看看如何提升这个数据处理的效率
用宏试试
[code:20wblkhg]%macro test(inds,x,y);
        proc means data=&inds (where=(x>&x and y>&y)) n mean sum std min max;
                var x1 x2 x3;
        run;
%mend;

%test(test.total,10,10)
%test(test.total,10,5)
%test(test.total,5,5)[/code:20wblkhg]
作者: shiyiming    时间: 2009-9-21 17:09
标题: Re: 高手看看如何提升这个数据处理的效率
用宏的本质的也是要运算20多遍,速度没有提升,我比较关心速度的提升。
此外,每一个群体中的"条件"是不同的结构,A1.1的条件就是在A1的条件基础上又多了新的条件,写macro的时候实际上要把整个条件字符串作为一个宏变量处理。

我想设计一种计算方法能让整个运算时间最短:)哈哈。
作者: shiyiming    时间: 2009-9-21 18:36
标题: Re: 高手看看如何提升这个数据处理的效率
一个很基础的问题,无须用宏. <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2009-9-21 21:06
标题: Re: 高手看看如何提升这个数据处理的效率
to byes

是一个基础的问题,不知道你会怎么去做呢?
作者: shiyiming    时间: 2009-9-22 09:22
标题: Re: 高手看看如何提升这个数据处理的效率
这个树状结构的层数有多少?用层数来写标签,比直接用他们的名称写标签要简单吧?
作者: shiyiming    时间: 2009-9-22 11:47
标题: Re: 高手看看如何提升这个数据处理的效率
to tanzhen_mysas

层数一般在4-6层,所有节点数(含中间节点)在20-30个。你说的用层数来写标签如何写?我目前的想法是有多少层就要构造多少个标签变量。不知道能否更简化:)哈哈。
作者: shiyiming    时间: 2009-9-23 12:53
标题: Re: 高手看看如何提升这个数据处理的效率
[code:2am8y9xw]data test&#46;total;
  set test&#46;total;
  if x1&gt;10 and y&gt;10 then do;
     L1_seg=&quot;A1&quot;;
     if&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46; then L2_seg=&quot;1&quot;;
  end;
  else if&#46;&#46;&#46; then L1_seg=&quot;A2&quot;;
  &#46;&#46;&#46;
run;[/code:2am8y9xw]

其实主要思路和你的一样,只不过在加标签时和你的有点不一样。说不上简单,呵呵,只是另一个方法而已。
如果你的第一层的条件和第二层的条件是分开独立的话,那么各层标签的添加条件就不需要嵌套。分开写,也就最多6个而已。呵呵。
作者: shiyiming    时间: 2009-9-23 12:59
标题: Re: 高手看看如何提升这个数据处理的效率
to tanzhen_mysas

哈哈,那就是if嵌套if了,也很容易绕晕的:)
作者: shiyiming    时间: 2010-10-25 23:55
标题: Re: 高手看看如何提升这个数据处理的效率
to tomwalk
format + PROC MEANS ; CLASS.....
作者: shiyiming    时间: 2010-10-26 09:34
标题: Re: 高手看看如何提升这个数据处理的效率
规则到数据逻辑,我想无论用什么方法,if嵌套还是format都需要逐条编写,这个复杂度貌似避免不了,论执行效率的话,感觉上是format快一点。
我也觉得你有6层树结构的话,等于是在维度上有6层,还是给6个变量比较好,从最细粒度到各级汇总
汇总数据的实施,proc means,sql,或者data步都可以


个人建议给客户打标记还是给一个独立的data步来做,汇总分开做
也许效率不是最高的,但是代码比较清晰,呵呵,抛砖引玉




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