当前位置: 首页 > 后端技术 > Python

在SPL中调用Python程序

时间:2023-03-26 18:40:32 Python

【摘要】esProcSPL集成了对Python程序的调用,同时也提供了对建模算法接口的支持。具体的开发需求和使用方法请参考钱学院:在SPL中调用Python程序!集算器是一个强大的数据计算引擎,但目前它并没有提供足够的机器学习算法。而python中有很多这样的算法。借助YM外部库,集算器SPL可以调用python编写的代码,弥补了这一不足。具体说明如下:1.SPL和python环境配置2.Python模块开发规范要求3.ym_exec接口调用4.使用SPL、python、接口的建模算法模块示意图:SPL调用ym_exec接口,将参数传递给python下的apply()接口,apply调用python程序处理后返回结果给SPL。1、SPL和python环境配置为了让SPL和python进行通信,实现互访,需要进行相关设置。下面以win10下python3.7+SPL为例说明如何设置。该接口依赖于esProcSPL的外部库易铭。一鸣通过userconfig.xml与python关联。A、安装Python软件:下载python3软件安装包,安装位置为c:ProgramFilesraqsoftyimmingPython37。B:外部库安装:默认安装在esProcSPL软件的esProcetlibYimming路径下。勾选集算器外部库设置中的Yimming项,使其生效。(可以通过外部库指南找到易明jar依赖包)C.配置文件:在外部库目录下的esProcextlibYimminguserconfig.xml文件中设置参数。参数如下:D.服务器程序应用程序是指提供的python服务器程序:以上配置完成后,重启集算器即可使用ym_exec()接口。2、python模块开发规范要求A,defapply(ls)接口,python程序的对外接口,实现与SPL的交互处理。B、参数ls为列表数据类型,类似于java中入口函数voidmain(stringargv[])中的argv参数。C、返回值,返回的dataframe结构数据保存在一个list类型的变量中,可以在SPL中显示。D.示例描述:demo.pyimportpandasaspdimportsysdefapply(lists):cols=[_“value”_]ls=[]forxinlists:ls.append(“{}”.format(x))df=pd.DataFrame(ls,columns=cols)lls=[]lls.append(df)returnllsifname==_“__main__”_:res=apply(sys.argv[1:])打印(_'res={}'_.format(res))run:pythondemo.py“AAA”“BBB”1000Output:res=[value00AA1BBB21000]这个程序apply()接口实现传递的参数到变量列表ls,然后ls放入dataframe结构中,dataframe放入变量列表lls中返回。开发时先在python下测试apply()接口是否正常,然后在SPL中就可以调用了。需要注意的是,由于dataframe是msgpack编码后返回的数据,所以dataframe中同一列的数据类型必须一致,否则msgpack编码时会出错,无法在SPL中接收到dataframe数据.3.ym_exec接口调用格式:ym_exec(pyfile,p1,p2,…)。调用pyfile文件并运行,后面会传入参数p1、p2等,参数个数不定,只要对应接口apply()即可。具体用法如demo.py:运行结果:4.建模算法模块使用下面演示如何在集算器中调用python实现偏最小二乘算法(PLS,目前集算器本身没有提供)。运行前需要安装一鸣外部库,配置设置参考《SPL 实现自动建模和预测》。由于PLS算法的参数比较复杂,我们约定调用格式为:ym_exec(pyfile,data,jsonstr)SPL调用pyfile文件并运行,data是要建模的数据(表序列),很多PLS算法的参数写成json字符串。同样,需要对应pyfile中的apply()处理,才能正确解析参数值。data:data是预定义文件或头文件的数据文件名。数据包括目标变量目标的列。jsonstr:json字符串,例如:{target:0,n_components:3,default_mode:'regression',mode:'a',norm_y_weights:false,scale:false,algorithm:'nipals',max_iter:5,:max_iter::max_iter::max_iter::max_iter:5,:max_iter::max_iter::max_iter::max_iter::max_iter::max_iter::max_iter::max_iter::max.:5.,copy:True}其中,target指定目标变量所在的列,不可缺少。SPL脚本pls_demo.dfx:第一行是目标data_test.csv的数据:pls_demo.py文件,参考python模块algorithmfromscipy.linalgimportpinv2importnumpyasnpimportpandasaspdimportdemjsonalgorithmclasspls_demo:classpls_demo():…………pass#接口实现defapply(lists):iflen(lists)<2:returnNonedata=lists[0]#dataparameterval=lists[1]#jsonstrstringparameterif(type(data).__name__=="str"):data=pd.read_csv(data)#1.处理json字符串中的具体值#print(val)val=val.lower().replace("false","'False'")val=val.replace("true","'True'")val=val.replace("none","'None'")dic=demjson.decode(val)如果dic.__contains__('target')==false:print("paramtargetisnotset")return#2.target参数的处理,可以是列数也可以是名字targ=dic['target']iftype(targ).__name__==“int”:col=data.columnscolname=col.tolist()[targ]其他:colname=targY=data[colname]X=data.drop(colname,axis=1)#3.模型参数处理,未传递的参数需要设置默认值。如果dic.__contains__('n_components'):n_components=dic['n_components']否则:n_components=15如果dic。__contains__('de??flation_mode'):deflation_mode=dic['deflation_mode']else:deflation_mode="regression"ifdic.__contains__('mode'):mode=dic['mode']else:mode="A"....#4.模型算法加载#print("n_components={}".Format(n_components))PLS_MODEL=PLS_DEMO(n_components,Deflation_mode,Mode,...)#训练数据PLS_MOL.FIT(x,y)预测y_preddpredict(X)#5.填充返回值f=["value"]df=pd.DataFrame(y_pred,columns=f)#print(y_pred)lls=[]lls.append(df)returnlls6.测试__name__=='__main__':ls=[]ls.append("a2ef764c53ec1fbc_X.new.csv")val="{target:0,n_components:3,deflation_mode:'regression',""mode:'a',norm_y_weights:False,""scale:False,algorithm:'nipals',""max_iter:500,tol:0.000001,copy:True}”ls.append(val)apply(ls)在开发过程中,先通过python下的main函数测试apply()接口,然后在SPL中调用