模拟新行,Python比SAS慢得多,如何加速?

时间:2018-06-04 19:18:54

标签: python pandas sas

这是问题,它是模型实现任务。鉴于我有一些数据。我需要模拟一些新数据,一些变量值取决于前一行的值和一个随机数r。

例如,说我有

AsOfDate    Var1    Var2    r
6/4/2018    A       0.3    0.2
6/5/2018    B       0.06   0.95
6/6/2018    A       0.057

创建两行,输出为

a=pd.DataFrame(data={'id':[1],'val':[2]})
tick=time.time()
n=0
b=pd.DataFrame()
for n in range(10000):
    a['id']=a['id']+1
    a['val']=a['val']+(n+1)
    b=pd.concat([b,a])
tock=time.time()
print(tock-tick)

逻辑是,从6/4 r = 0.2小于Var2,然后6/5 Var1 = B,Var2 = 0.3 * 0.2 = 0.06。截至6/5,r = 0.95大于Var2,则截至6/6 Var1 = A,Var = 0.06 * 0.95 = 0.057。

如果我迷惑你,我道歉。但我正在尽力描述这一点。如果不使用for循环,我无法想到一种可以做到这一点的方法。我运行以下简单的SAS和Python代码来比较速度。据我所知,python / Pandas远低于SAS datastep。我不是Python的专家,所以我想知道是否有更好的方法来做到这一点并让它运行得更快。在此先感谢您的帮助。

data test;
input id val;
datalines;
1 2
;
run;

%let _timer_start = %sysfunc(datetime());

data test(drop=i);
    set test;
    do i=1 to 10000;
        id=id+1;
        val=val+(i+1);
        output;
    end;
run;

data _null_;
  dur = datetime() - &_timer_start;
  put 30*'-' / ' TOTAL DURATION:' dur time13.2 / 30*'-';
run;

时间:7.54027533531189秒

User

时间:0.01秒

2 个答案:

答案 0 :(得分:0)

最直截了当的答案是:因为你选择了效率最低的方式:)

即。这段代码(没有真正优化):

import time
import pandas as pd
tick=time.time()
n=0
a = {
    'id': 1,
    'val': 2,
}
data = []
for n in range(10000):
    a['id'] = a['id']+1
    a['val'] = a['val']+(n+1)
    data.append([a['id'], a['val']])
df = pd.DataFrame(data, columns=['id', 'val'])
tock=time.time()
print(tock-tick)

同样(除非我犯了一些愚蠢的错误)快几百倍,可能不比sas慢很多。

答案 1 :(得分:0)

如果可以,请在pandas之外构建数据

from itertools import accumulate
a = list(range(2, 10002))
b = [2+i for i in accumulate(range(1,10001))]
df = pd.DataFrame(data={'id':a,'val':b})