SPL 中調用 Python 程序

【摘要】
      集算器 SPL 集成了對 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 爲例來說明如何設置的。

本接口依賴集算器 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
def apply(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() 處理對應起來,才能正確解析各參數值。

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:

首行爲 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 中調用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章