當前位置:成語大全網 - 新華字典 - python代碼轉化為sas代碼

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