首頁>技術>

【摘要】 集算器 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 為例來說明如何設定的。

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.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=[ 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 pinv2import numpy as npimport pandas as pdimport 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 中呼叫了。

15
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 效能最佳化技巧:有序分組