python代码转化为sas代码

作者&投稿:洪俗 (若有异议请与网页底部的电邮联系)
~ ,Python 和 SAS 是两个很常用的数据挖掘工具。Python 开源、免费、有丰富的三方库,一般在互联网公司广泛使用。而SAS需付费,且费用较高,一般互联网公司无法承担,更多的是在银行等传统金融机构中使用,不过这两年由于Python太火,原本使用SAS的也开始逐渐转向Python了。
拥抱开源,越来越多的爱好者造出优秀的Python轮子,比如当下比较流行的万金油模型Xgboost、LightGBM,在各种竞赛的top级方案中均有被使用。而SAS的脚步就比较慢了,对于一些比较新的东西都无法直接提供,所以对于那些使用SAS的朋友,就很难受了。

一直以来很多粉丝问过东哥这个问题:有没有一种可以将Python模型转成SAS的工具?

因为我本身是两个技能都具备的,实际工作中一般都是配合使用,也很少想过进行转换。但是,最近东哥逛技术论坛刚好发现了一个骚操作,借助Python的三方库m2cgen和Python脚本即可完成Python模型到SAS的转换。

m2cgen是什么?
m2cgen是一个Python的第三方库,主要功能就是将Python训练过的模型转换为其它语言,比如 R 和 VBA。遗憾的是,目前m2cgen尚不支持SAS,但这并不影响我们最终转换为SAS。

我们仍然使用m2cgen,需要借助它间接转换成SAS。具体的方案就是先将Python模型转换为VBA代码,然后再将VBA代码更改为 SAS脚本,曲线救国。

如何使用m2cgen?
我直接用一个例子说明下如何操作。

数据我们使用sklearn自带的iris dataset,链接如下:

The Iris Dataset — scikit-learn 1.1.1 documentation
下面,演示一下如何将Python的XGBoost模型转成SAS代码。

首先导入所需的库包和数据。

# 导入库
import pandas as pd
import numpy as np
import os
import re
from sklearn import datasets
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import m2cgen as m2c
# 导入数据
iris = datasets.load_iris()
X = iris.data
Y = iris.target
登录后复制

然后,我们划分数据集,直接扔进XGBoost里面,建立base模型。

# 划分数据为训练集和测试集
seed = 2020
test_size = 0.3
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)
# 训练数据
model = XGBClassifier()
model.fit(X_train, y_train)
登录后复制
然后,再将XGBoost模型转换为VBA。使用m2cgen的export_to_visual_basic方法就可以直接转成VBA了。转换成其他语言脚本也是同理,非常简单。

code = m2c.export_to_visual_basic(model, function_name = 'pred')
登录后复制
核心的骚操作来了!

m2cgen不支持SAS,但我们可以把VBA代码稍加改动,就能变成符合SAS标准的代码了。而这个改动也无需手动一个个改,写一段Python脚本即可实现VBA脚本转换为SAS脚本。

改动的地方不多,主要包括:删除在SAS环境中不能使用的代码,像上面结果中的Module xxx,Function yyy ,Dim var Z As Double,还有在语句结尾加上;,这些为的就是遵循SAS的语法规则。

下面就是转换的Python脚本,可以自动执行上面所说的转换操作。

# 1、移除SAS中不能使用的代码
code = re.sub('Dim var.* As Double', '', code)
code = re.sub('End If', '', code)
# 下面操作将修改成符合SAS的代码
# 2、修改起始
code = re.sub('Module Model\nFunction pred(ByRef inputVector() As Double) As Double()\n',
'DATA pred_result;\nSET dataset_name;', code)
# 3、修改结尾
code = re.sub('End Function\nEnd Module\n', 'RUN;', code)
# 4、在结尾加上分号';'
all_match_list = re.findall('[0-9]+\n', code)
for idx in range(len(all_match_list)):
original_str = all_match_list[idx]
new_str = all_match_list[idx][:-1]+';\n'
code = code.replace(original_str, new_str)
all_match_list = re.findall(')\n', code)
for idx in range(len(all_match_list)):
original_str = all_match_list[idx]
new_str = all_match_list[idx][:-1]+';\n'
code = code.replace(original_str, new_str)
# 用var来替代inputVector
dictionary = {'inputVector(0)':'sepal_length',
'inputVector(1)':'sepal_width',
'inputVector(2)':'petal_length',
'inputVector(3)':'petal_width'}
for key in dictionary.keys():
code = code.replace(key, dictionary[key])
# 修改预测标签
code = re.sub('Math.Exp', 'Exp', code)
code = re.sub('pred = .*\n', '', code)
temp_var_list = re.findall(r"var[0-9]+(\d)", code)
for var_idx in range(len(temp_var_list)):
code = re.sub(re.sub('\(', '\(', re.sub('\)', '\)', temp_var_list[var_idx])), iris.target_names[var_idx]+'_prob', code)
登录后复制

对以上脚本分步解释说明一下。

1、开头、结尾、输出名称

前三个部分非常简单。使用正则表达式删除多余的行,然后将脚本的开头更改为DATA pred_result; \ nSETdataset_name;。

使用过SAS的同学就很熟悉了,pred_result是运行SAS脚本后的输出表名称,dataset_name是我们需要预测的输入表名称。

最后再将脚本的结尾更改为RUN;。

# 移除SAS中不能使用的代码
code = re.sub('Dim var.* As Double', '', code)
code = re.sub('End If', '', code)
# 下面操作将修改成符合SAS的代码
# 修改起始
code = re.sub('Module Model\nFunction pred(ByRef inputVector() As Double) As Double()\n',
'DATA pred_result;\nSET dataset_name;', code)
# 修改结尾
code = re.sub('End Function\nEnd Module\n', 'RUN;', code)
登录后复制
2、语句末尾添加分号

为遵循SAS中的语法规则,还需将每个语句的结尾加上;。仍用正则表达式,然后for循环在每一行最后添加字符;即可。

# 在结尾加上分号';'
all_match_list = re.findall('[0-9]+\n', code)
for idx in range(len(all_match_list)):
original_str = all_match_list[idx]
new_str = all_match_list[idx][:-1]+';\n'
code = code.replace(original_str, new_str)
all_match_list = re.findall(')\n', code)
for idx in range(len(all_match_list)):
original_str = all_match_list[idx]
new_str = all_match_list[idx][:-1]+';\n'
code = code.replace(original_str, new_str)
登录后复制

3、映射变量名称

使用字典将InputVector与变量名称映射到输入数据集中,一次性更改所有InputVector。

# 用var来替代inputVector
dictionary = {'inputVector(0)':'sepal_length',
'inputVector(1)':'sepal_width',
'inputVector(2)':'petal_length',
'inputVector(3)':'petal_width'}
for key in dictionary.keys():
code = code.replace(key, dictionary[key])
登录后复制
4、映射变量名称

最后一步就是更改预测标签。

# 修改预测标签
code = re.sub('Math.Exp', 'Exp', code)
code = re.sub('pred = .*\n', '', code)
temp_var_list = re.findall(r"var[0-9]+(\d)", code)
for var_idx in range(len(temp_var_list)):
code = re.sub(re.sub('\(', '\(', re.sub('\)', '\)', temp_var_list[var_idx])), iris.target_names[var_idx]+'_prob', code)
登录后复制
然后保存sas模型文件。
#保存输出
vb = open('vb1.sas', 'w')
vb.write(code)
vb.close()
登录后复制
最后,为了验证sas脚本是否正确,我们将sas模型的预测结果和Python的结果进行一下对比。

# python 预测
python_pred = pd.DataFrame(model.predict_proba(X_test))
python_pred.columns = ['setosa_prob','versicolor_prob','virginica_prob']
python_pred
# sas 预测
sas_pred = pd.read_csv('pred_result.csv')
sas_pred = sas_pred.iloc[:,-3:]
sas_pred
(abs(python_pred - sas_pred) > 0.00001).sum()
登录后复制
可以看到,两个预测的结果基本上一样,基本没问题,我们就可以在sas中跑xgboost模型了。
总结
上面只是个最简单的示例,没有对特征处理。对于复杂的建模过程,比如很多特征工程,那就要对Python脚本进一步调整了。

以上就是本次分享的所有内容,如果你觉得文章还不错,欢迎关注公众号:Python编程学习圈,每日干货分享,发送“J”还可领取大量学习资料,内容覆盖Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是前往编程学习网,了解更多编程技术知识。
python
机器学习
数据挖掘
视频教程-完整的Python和SAS数据分析-大数据
422阅读·0评论·0点赞
2020年5月28日
python 访问sas 逻辑库,SAS | 逻辑库和SAS数据集
460阅读·0评论·0点赞
2021年4月26日
python学习笔记---linux/windows调用sas程序
875阅读·0评论·0点赞
2019年10月24日
python可以代替sas_Python、 R 语言、SAS、SPSS 优缺点比较?(转)
604阅读·0评论·1点赞
2020年12月17日
python 访问sas 逻辑库_SAS编程基础 - 逻辑库和数据集
138阅读·0评论·0点赞
2020年12月9日
服务器部署sas_如何在阿里云SAS上部署WordPress网站
1429阅读·0评论·0点赞
2020年8月29日
python和sas配合使用_太骚了!Python模型完美切换SAS,还能这么玩。。
1963阅读·0评论·2点赞
2021年1月14日
python导入sas数据集_将变量从SAS传递到Python
344阅读·0评论·0点赞
2021年2月3日
python 访问sas 逻辑库_SAS岩论 | 在Jupyter Notebook中使用SAS
429阅读·0评论·0点赞
2020年12月9日
#sas建模-建模入门介绍
2257阅读·0评论·2点赞
2019年9月18日
#sas建模-建模过程介绍
2805阅读·1评论·0点赞
2019年9月18日
python调用sas_SAS日常使用的语句预定的python表达
370阅读·0评论·0点赞
2020年12月8日
python读取sas数据集_SASpy模块,利用Python操作SAS
1432阅读·0评论·0点赞
2020年11月26日
python可以代替sas,像SAS一样转置的python数据帧
156阅读·0评论·0点赞
2021年4月27日
sas和python的区别 知乎_银行业为什么喜欢用 sas 而不是 python?
1559阅读·0评论·0点赞
2020年12月9日
python和sas代码编写_如何从SAS到python编写if语句
329阅读·0评论·0点赞
2021年1月29日
saspython知乎_pyt


python3.8代码如何变成软件?
python代码做成一个软件的方法是:1、利用“pipinstallPyinstaller”安装第三方库PyInstaller;2、利用“pyinstaller-F-w文件名.py”即可将python代码做成一个软件。

python代码转化为sas代码
下面就是转换的Python脚本,可以自动执行上面所说的转换操作。# 1、移除SAS中不能使用的代码code = re.sub('Dim var.* As Double', '', code)code = re.sub('End If', '', code)# 下面操作将修改成符合SAS的代码# 2、修改起始code = re.sub('Module Model\\nFunction pred(ByRef inputVector() As...

如何将python代码转化成matlab
matlab里有使用python的模块,给python在matlab里的应用提供方便.例如,调用当前目录下的abc.py中定义的cba函数对字符串进行处理,可以这么做(三行代码示范,将 Python 字符串转换为 MATLAB 字符串,通过在 textwrap.wrap 函数名称之前输入字符 py. 来调用该函数。请勿输入 import textwrap。也请勿只输入py...

python大小写字母转换代码
print(msg.capitalize()) #capitalize()函数,将首字母都转换成大写,其余小写 print(msg.title()) #title()函数,将每个单词的首字母都转换成大写,其余小写 结果:www.BAIDU.COM.123 www.baidu.com.123 www.baidu.com.123 www.Baidu.Com.123 利用循环语句进行字母的大小写转换 Python中每个...

计算机可以直接执行python语言代码吗?
首先,我们需要理解计算机如何执行指令。计算机硬件只能理解和执行机器语言代码,这是一种由0和1组成的二进制代码。然而,Python是一种高级编程语言,其代码结构对人类更加友好,易于理解和编写,但计算机无法直接理解。为了解决这个问题,我们需要一个翻译过程,将Python代码转化为计算机可以理解的机器语言代码。

python是通用编译器将程序编译成二进制代码再运行
不是。python是一种解释型语言,这就意味着python代码不需要编译成二进制代码,与其他编程语言不同,python代码运行时会逐步执行,python解释器会将代码逐渐解析并转化为文字节码,然后再将字节码解释为机器码。

python其他进制转换成十进制代码
代码为,print(int("x",y))。表示把y进制的x转换成十进制数并输出结果。Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

Python输入一个整数和进制转换成十进制输出。 如:45,8 37 怎么写代码...
s=input()a=s.split(',')print(int(a[0],int(a[1])))例如:import re s="+-p-xf4+-1!#"num = "".join([a.group(0) for a in re.finditer("[\\da-fA-F]+",s)])sign = -1 if "-" in s[:s.index(num[0])] else 1 print(int(num,16)*sign)...

python源代码程序编译后的文件扩展名为
1. "Python源代码程序编译后的文件扩展名为.pyc"。2. 在Python解释器运行源代码时,它会将源代码转换成字节码。3. 生成的字节码文件具有扩展名.pyc,即Python的字节码文件。4. 这些.pyc文件可以在Python解释器上直接执行,无需再次编译。

苹果python的代码变成网址
1、首先打开苹果python的软件,并登陆注册自己的账号。2、其次点击该软件主界面的服务中心选项,并在该选项中找到代码变成网址的选项。3、最后点击该选项进行变即可。

岱岳区13668557319: 有没有能把python代码转换为c语言代码的工具 -
敖甘清热: C++兼容C语言,但C语言不可能兼容C++ 所以,C++代码直接转是转不了C的. 只能从逻辑上,对C++的许多语法进行代码上的重新实现. 比如将对象转换为结构体,将对象封装的函数修改为独立函数,增加对象参数. 将重载去掉,而是根据需要调用非重载的不同名的函数. 总之来说,硬要将C++转为C实现的话,那代码重写的工作是避免不了的.

岱岳区13668557319: python ascii 编码 怎么转化为utf - 8编码 -
敖甘清热: python的默认的编码是ascii: 指的是你写代码默认是编码是ascii 编码的, 当然你也可以改成你想要的编码,比如在开头写个注释就用utf8编码 # -*-coding:UTF-8-*- 字符串在Python内部的表示是unicode编码: 这个是python 3 以后才是这样的吧,

岱岳区13668557319: 如何把Python2的代码转换为Python3的代码 -
敖甘清热: 首先把代码按照结构拆分: '&'.join(List) 将list里的元素以&为间隔连接为字符串.params.iteritems() 为迭代器lambda为匿名函数.cmp排序.排序后转为字符串.转为py3:python3中不再使用cmp函数,可以重写该函数.

岱岳区13668557319: 写好了PYTHON的代码后怎么在emacs里运行 -
敖甘清热: 确保你的python在PATH下,即,在cmd中输入python,能够进入python shell

岱岳区13668557319: python 编码转换 -
敖甘清热: 我用requests库做的,结果好使: import requests url = ' headers = {'user-agent': 'mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/45.0.2454.101 safari/537.36'} r = requests.get(url, headers=headers) print(r.content.decode('utf-8'))requests库不是python自带的,要用pip命令安装: pip install requests

岱岳区13668557319: python编码转换:ascii和GB2312的问题 -
敖甘清热: 供参考.gb312本来就是标准ascii的一种扩充,ascii可以视同为gb312的子集.所以,如果var的值全部是在ascii里面的话,转成gb312后也还是属于ascii,所以使用detect函数的时候,编码还是ascii(当然同时也属于gb312);如果var的值不是全部在ascii里面的话,语句var = var.decode('ascii')可能会出错.只要var的值是英文(内码0-127),转换不转换,都已经是gb2312编码.

岱岳区13668557319: 如何把java代码转换成smali代码 -
敖甘清热: 把java代码转成smali代码共需要以下三个步骤 1、编译java代码为class文件 javac smaliTest.java 这个比较简单,会生成smaliTest.class文件 2、把class文件转成dex文件 我们知道apk包里java代码最后生成的是class.dex文件,把class转化成dex文件就

岱岳区13668557319: python代码 -
敖甘清热: #! usr/bin/env python # -*- coding: utf-8 -*-import sysdef dispaly(ch) :for i in xrange(0,len(ch)-1) :if ch[i] == chr(127) :print chr(ord(ch[i])-1),'none'elif ch[i] == chr(0) :print 'none',chr(ord(ch[i])+1)else :print chr(ord(ch[i])-1),chr(ord(ch[i])+1)if __...

岱岳区13668557319: 怎么把Python代码 转为API -
敖甘清热: 如果是python内部临时改变就改 os.environ 这个字典就可以了,如果是要永久改设置就需要调系统API了

岱岳区13668557319: python3.x 的编码转换,import sys reload不行怎么办 -
敖甘清热: 到命令行下执行一下,看看结果.sys里面import之后的确是没有setdefaultencoding这个方法的,是因为被删除了,只有reload之后才会再出来.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网