SASpy模块打通了Python与SAS之间的连接。有了SASpy模块,我们就能够在Python中操控SAS。本文将首先介绍SASpy模块的一些基本方法,最后通过一个聚类分析的例子,来展示如何在Python中调用SAS的机器学习过程,以及对聚类结果的可视化。
SASpy模块特点
1、需要Python3.X及以上,SAS9.4及以上,需要Java环境;
2、无论是本地SAS还是远程服务器上的SAS,都可以使用SASpy调用SAS进程;
3、可以在Python和SAS之间传递数据(也就是Pandas数据框与SAS数据集可以相互转换);
4、某些Pandas方法可以直接在SAS数据集上使用(实际背后进行了转化);
5、可以调用SAS的各种模块,比如统计stat、质量控制qc、预测ets、机器学习(EM模块)等。
SASpy模块的安装
关于安装的介绍,请参考如下文章:
1、SAS中文论坛,https://www.sohu.com/a/218339423_278472
2、SASpy的官网,https://sassoftware.github.io/saspy/install.html
上篇:SASpy模块的基本方法
假使我们已经安装好了SASpy模块,现在我们只需要导入该模块,并通过saspy.SASsession()来建立一个SAS进程(可能会花费数十秒),当看到提示:SAS Connection established时,这说明我们已经成功创建。如果有任何报错,可以参考如上两篇安装文章中的提示。直接输入sas,可以看到有关该进程的一些接口、基本参数信息。此外,可以通过dir(sas)查看有关方法,通过help(sas)查看更详细的帮助信息。
1、SASpy基本操作
在接下来的程序中,体现了SASpy的一些基本用法,如建立SAS逻辑库、判断数据集是否存在、sas数据集与pandas数据框的转换,以及CSV文件的导出与导入。有了这些方法之后,在数据的交互层面,基本已经没有问题了。对应于下面代码中的每一行,分别表示:
显示sas日志-1
建立一个sas逻辑库-2
判断class数据集是否存在(存在为1,否则为0)-3
判断sashelp.class数据集是否存在-4
获取sashelp逻辑库的cars数据集(sas数据集)-5
获取sashelp逻辑库的iris数据集(sas数据集)-6
获取sashelp逻辑库class数据集(pandas数据框)-7
获取sashelp逻辑库ari数据集(pandas数据框)-8
将Python的air数据框转为sas的myair数据集-9
将Python的air数据框转为sas数据集-10
将sashelp.class导出到CSV文件-11
CSV文件导入到SAS数据集-12
判断所导入的数据是否存在(结果为1)-13
cars对象的类型为sas数据集-14
air对象的类型为pandas数据框-15
2、提交SAS代码
可以在Python中直接提交“原汁原味”的SAS代码吗?当然可以,使用sas.submit()方法,将所有代码都放入submit()中,像'''SAS code'''这样,将SAS代码包裹起来。请看下面一个例子:
3、获取宏变量
宏变量、宏程序可以说是SAS编程的精华,可以极大地提升程序开发的效率,是任何一个优秀的SAS programmer都应该的必备技能。如果不太了解SAS Macro,可以暂且将它理解为一段可进行“文本替换”的代码,经常会结合循环使用,以提高代码的复用性、易于维护性,同时减少代码量。
下面的代码中,使用sas.symput()方法,定义了一个宏变量dataname,并在sas.submit()中进行了引用。同时,在sas.submit()中通过%let方法,定义了一个宏变量mydate,并通过sas.symget()方法获取。mydate是自定义宏变量,sysdate9是SAS系统宏变量,显示当前系统日期。
4、一个好玩的功能
在SASpy模块中,有一个好玩的方法,sas.teach_me_SAS()。当参数设置为True时(默认为False),不真正执行代码,而是给出SASpy方法对应的SAS代码。可以大概知道,这些SASpy方法的背后,对应的是SAS宏程序“模板”,执行时只需要提供参数即可(或者叫代码文本替换),例如数据集名称等。为了说明这一点,在下篇的聚类分析例子中,将会看到这种“替换”。
下篇:利用SASpy模块进行机器学习
SASpy接口十分丰富,利用dir()方法,可以查看各模块的各种方法。对于SAS中的机器学习过程,可以参考SAShelp的帮助文档。虽然SAS的语法和Python有所不同,但是建模理论却是相通的。
1、聚类模型的建立
下面的例子中以iris鸢尾花数据集为例,进行简单的聚类分析。通过proc hpclus聚类过程的NOC选项设置,模型告诉我们最佳的聚类数目是4类(注意ITERSTATS中的IterationNum是模型的迭代次数,不是最佳聚类数目)。最终的聚类特征,在WITHINCLUSSTATS中体现,关于模型的评估、解释,这里不做讨论。
此外,也可以通过sum of squared error (SSE)组内平方误差和来确定最佳聚类数目(如下图所示)。随着聚类数目增多,组内样本数就减少,从而WSS也减小。但WSS减小的速度是在下降的,也就是斜率越来越平缓了。从1类下降到3类速度较快,从3类下降到4类已经不那么明显了。因此将聚类数目确定为3类也是可以的。
2、聚类结果的可视化
为了便于对聚类结果的可视化,我们通过主成分PCA进行降维处理,将原来的4个特征减少为2维。结果就是如下的iris2数据框。
在SAS中如何对聚类结果作图呢?让我们再次开启SAS教学模式,teach_me_SAS设置为True。在如下scatter作图代码中,y后面的这一堆参数设置,显然不太符合Python的语言风格。y参数是一个文本,既然是文本,就可以进行文本替换,无论是简单的文本,还是复杂一点的文本,反正只要扔在SAS代码中可以执行就没有问题。这再次说明了SASpy方法的背后,是通过对SAS代码“模板”进行“文本替换”,交由SAS执行并返回结果。
总结
本文分为上下两篇,分别介绍了SASpy模块的基本功能(可能会比较常用的一部分,并非全部),以及利用SASpy模块调用SAS进行机器学习的一个例子(聚类分析)。
借助SASpy接口,我们可以在Python中对SAS进行各种操控,仿佛是扔掉了SAS的“壳”,留下了SAS的“魂”。但随着Python在数据分析、机器学习、大规模数据处理方面的日益强大(比如pyspark),加上开源免费的特点,相信越来越多的人会选择拥抱Python。
领取专属 10元无门槛券
私享最新 技术干货