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 文件中设置参数,参数如下:

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.py

import pandas as pd

import sys

defapply(lists):

cols = ["value"]

ls = []

for x in lists:

ls.append("{}".format(x))

df = pd.DataFrame(ls, columns=cols)

lls=[]

lls.append(df)

return lls

if __name__ =="__main__":

res = apply(sys.argv[1:])

print('res={}'.format(res))

运行:python demo.py "AAA" "BBB" 1000

输出:res=[  value

0    AA

1    BBB

2    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:

运行结果:

4. 建模算法模块使用

下面再演示一下如何在集算器调用 python 实现偏最小二乘算法(PLS,目前集算器本身未提供)。在运行它之前,需要安装易明外部库,配置设置参考《SPL实现自动建模和预测》。

由于 PLS 算法的参数较为复杂,我们将调用格式约定为:

ym_exec(pyfile, data, jsonstr)

SPL中调用pyfile文件并运行它,data 为需要建模的数据(序表),将 PLS 算法众多参数写成 json 串。同样地,需要与 pyfile 中 apply() 处理对应起来,才能正确解析各参数值。

datadata为预表或带头文件的数据文件名。数据中包括目标变量 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

首行为target的数据data_test.csv:

pls_demo.py文件针对python模块算法使用参考

from scipy.linalg import pinv2

import numpy as np

import pandas as pd

import demjson

#算法类 pls_demo:

class pls_demo():

. . . . . . .

Pass

#接口实现

def apply(lists):

if len(lists)<2:

return None

data = 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.columns

colname = col.tolist()[targ]

else:

colname = targ

Y = data[colname]

X = data.drop(colname, axis=1)

#3. 模型参数处理,没有传递的参数需要设定缺省值.

if dic.__contains__('n_components') :n_components=dic['n_components']

else: n_components=15

if 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 中调用了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容