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 为例来说明如何设置的。本接口依赖集算器 SPL 外部库 Yimming。 Yimming 与 python 通过 userconfig.xml 关联。A、安装 Python 软件:下载 python3 软件安装包,安装位置如 c:\Program Files\raqsoft\yimming\Python37。B:外部库安装:缺省安装在集算器 SPL 软件的 esProc\extlib\Yimming 路径下,在集算器的外部库设置中勾选 Yimming 项让其生效。( 通过外部库指南能找到 Yimming jar 依赖包 )

C、 配置文件: 在外部库目录 esProc\extlib\Yimming\userconfig.xml 文件中设置参数,参数如下:选项名称说明sAppHomeC:\Program Files\raqsoft\yimming应用程序目录sPythonHomec:\Program Files\raqsoft\yimming\Python37\python.exePython文件sPythonHostlocalhost网络 IPiPythonScriptPort8512网络端口D、服务端程序应用程序指提供的 python 服务端程序:

以上配置完成之后,重启集算器后就可以使用 ym_exec() 接口。2.  python 模块开发规范要求A、def apply(ls) 接口,python 程序的对外接口,实现与 SPL 交互处理。B、参数 ls 为 list 数据类型,它类似于 java 中的入口函数 void main(string argv[]) 中的 argv 参数。C、返回值,返回 dataframe 结构数据存放在 list 类型的变量中, 可在 SPL 中显示。D、样例说明:demo.pyimport pandas as pdimport sysdef apply(lists):cols = ["value"]ls = []for x in lists:ls.append("{}".format(x))df = pd.DataFrame(ls, columns=cols)lls=[]lls.append(df)return llsif __name__ == "__main__":res = apply(sys.argv[1:])print('res={}'.format(res))运行:python demo.py "AAA" "BBB" 1000输出:res=[  value0    AA1    BBB2    1000]本程序 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:A1=ym_env()2=ym_exec("d:/demo.py",    false, 12345, 10737418240, 123.45, decimal(1234567890123456),   "aaa 123")3>ym_close(A1)运行结果:value1False2123453107374182404123.45512345678901234566aaa 1234. 建模算法模块使用下面再演示一下如何在集算器调用 python 实现偏最小二乘算法(PLS,目前集算器本身未提供)。在运行它之前,需要安装易明外部库,配置设置参考《SPL实现自动建模和预测》。由于 PLS 算法的参数较为复杂,我们将调用格式约定为:ym_exec(pyfile, data, jsonstr)SPL中调用pyfile文件并运行它,data 为需要建模的数据(序表),将 PLS 算法众多参数写成 json 串。同样地,需要与 pyfile 中 apply() 处理对应起来,才能正确解析各参数值。data:data为预表或带头文件的数据文件名。数据中包括目标变量 target 所在的列。jsonstr: json字符串,例如:{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}其中 target 指定目标变量所在的列,不可缺少。SPL脚本pls_demo.dfx:AB1=ym_env()2="d:/script/pls_demo.py"3=file("d:/script/data_test.csv").import@cqt()// 数据4{target:0,n_components:3,deflation_mode:'regression',                mode:'A',norm_y_weights:False}// 首列为目标变量, 使用 json 字符串为参数5=ym_exec(A2, A3, A4)6>ym_close(A2)首行为target的数据data_test.csv:012345678181.6-0.00182-0.00796-0.00748-0.002860.0048460.0162450.0281040.039865154.5-0.00102-0.00789-0.00795-0.003610.0037650.0150620.0283210.0410631950.001206-0.00464-0.003740.0006810.0087940.0208340.0363210.051656150.8-0.00154-0.00802-0.00768-0.00280.006240.017120.037720.043453…pls_demo.py文件,针对python模块算法使用参考from scipy.linalg import pinv2import numpy as npimport pandas as pdimport demjson#算法类 pls_demo:class pls_demo():. . . . . . .Pass# 接口实现def apply(lists):if len(lists)<2:return Nonedata = lists[0]  # 数据参数val =  lists[1] #jsonstr 串参数if (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)if dic.__contains__('target') ==False:print("param target is not set")return# 2. 对 target 参数的处理,它可能为列数,也可能为名称targ = dic['target']if type(targ).__name__ == "int":col = data.columnscolname = col.tolist()[targ]else:colname = targY = data[colname]X = data.drop(colname, axis=1)# 3. 模型参数处理,没有传递的参数需要设定缺省值.if dic.__contains__('n_components') :n_components=dic['n_components']else: n_components=15if dic.__contains__('deflation_mode') :deflation_mode=dic['deflation_mode']else: deflation_mode="regression"if dic.__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_model.fit(X, Y)# 预测y_pred = pls_model.predict(X)# 5. 填充返回值f = ["value"]df = pd.DataFrame(y_pred, columns=f)#print(y_pred)lls=[]lls.append(df)return lls#6. 测试if __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 中调用了。

(0)

相关推荐

  • python测试开发django-59.restful接口开发

    前言 REST 不是什么具体的软件或者代码,而是一种思想.现在流行前后端分离开发项目,一般用 json 来交换数据. 相信写过模板的同学都知道,只要哪怕页面中的数据有一丝丝变动,那整个页面都需要重新渲 ...

  • 【Python基础】Python字典详解-超级完整版

    本文的目录: 一.字典概述 01 字典的格式 Python字典是一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 字典的每个键值key=>value对用冒号 : 分割 ...

  • 4.Python列表/元组/集合/字典

    碧茂大数据 前天 4.1 Python列表 · 列表用 [ ] 标识,是Python 最通用的复合数据类型. · 列表用 [ ] 表示,列表具有可嵌套性 4.1.1 Python列表截取 · 列表可以 ...

  • Python之文件

    文件 打开文件 函数open的参数mode的最常见取值 打开方式 读写文件 文件write调用返回了写入的字符数. 文件的读取 随机存取 关闭文件 迭代文件内容 文件路径 用 os.makedirs( ...

  • Python字典的11个方法超级详解

    Python字典是一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. print(dir(dict))['clear', 'copy', 'fromkeys', 'get', ...

  • [638]python os.popen() 方法

    概述 os.popen() 方法用于从一个命令打开一个管道. 在Unix,Windows中有效 语法 popen()方法语法格式如下: os.popen(command[, mode[, bufsiz ...

  • python——函数

    一.定义函数 # 定义函数def say_hello(): print('hello') print('hi') # 调用函数,函数被调用之后才会生效say_hello()1234567 二.求和函数 ...

  • 在QT C++中调用 Python并将软件打包发布(裸机可运行)

    为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件.最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中 ...

  • reticulate包 | 在Rmarkdown中调用Python代码

    Python和R是一对数据科学两大语言,在互联互通的路上,我感觉R更加的积极.还记得之前 Python中调用R的库-rpy2, 在Python使用R语言语法还是有些不自然.在R中调用Python体验十 ...

  • 'Python替代Excel Vba'系列(终):vba中调用Python

    系列文章 '替代Excel Vba'系列(一):用Python的pandas快速汇总 'Python替代Excel Vba'系列(二):pandas分组统计与操作Excel 'Python替代Exce ...

  • 如何在Excel中调用Python脚本,实现数据自动化处理

    这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5 ...

  • 如何在 Excel 中调用 Python 脚本,实现数据自动化处理

    这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5 ...

  • 如何在C 程序中调用Matlab函数(二十八)

    C++调用Matlab主要有两种方式,一种是调用Matlab的计算引擎,即调用Matlab本身:另一种是调用matlab中由mcc编译生成的dll文件,这种方法是Matlab利用C++ Complie ...

  • 侦查机关在取证过程中常见的程序违法问题

    作者:曹春风律师 之前,我曾经撰文写过侦查机关在言词证据取证过程中,出现的种种违法情形做了列举,并就如何审查判断进行了刨析,通过近期的办案又有一些新的发现,行文如下,供大家学习和交流. 一.同时讯问情 ...

  • (1条消息) Android Studio在Gradle中调用cmd脚本

    Gradle中调用cmd 需要在Gradle编译时,调用某些脚本进行文件操作,比如:头文件更新,或者动态链接库文件的更新等,需要借助脚本文件,并且不需要手动运行,那么如何使用Gradle呢? 如下代码 ...

  • 如何在Servlet中调用RESTfulAPIWeb服务

    假设我们需要搜索并显示指定城市的天气情况.互联网上有很多第三种Web服务.我正在使用百度天气Web服务进行演示.现在,让我们开始以下步骤. 使用代码转到您选择使用Web服务的网站,然后注册一个帐户并为 ...