python - 模拟新行,Python比SAS慢很多,如何加速?
问题描述
这是问题所在,它是针对模型实现任务的。鉴于我有一些数据。我需要模拟一些新数据,一些变量值取决于前一行的值和一个随机数 r。
例如,说我有
AsOfDate Var1 Var2 r
6/4/2018 A 0.3 0.2
创建两行,输出将是
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
逻辑是,截至 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 数据步。我不是 Python 方面的专家,所以我想知道是否有更好的方法来做到这一点并让它运行得更快。在此先感谢您的帮助。
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)
耗时:7.54027533531189 秒
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;
耗时:0.01 秒
解决方案
最直接的答案是:因为您选择了最低效的方式:)
即这段代码(没有真正优化):
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 慢多少。
推荐阅读
- matlab - matlab中的转置
- php - 从 Xcode 12.2 dlopen libquic 调用 Php 代码时出错失败
- xslt - 在 xsl:if 中使用 XSL:sort
- python - tkinter 文本框没有正确打印列表?
- c# - [EFCore 5, SQLite3]:如何创建没有 ROWID 的表
- oracle - ItemPreparedStatementSetter 在 out 参数中无效
- python - 无法使用 Selenium 单击按钮
- c# - 如何将 MS_DESCRIPTION 属性添加到 M:N 连接表中的列?
- bash - 我可以使用 sed 替换最后一个 html 标记实例之前的所有内容吗?
- python - Python评估文件夹中文件的数据