<< Click to Display Table of Contents >> Python脚本复制链接 |
1.概述
支持用Python语言编程实现数据处理、数据分析、图表展示等功能。
•前置节点可以连接多个数据集。
•系统接口变量及API已经在脚本编辑区的注释中标明了详细含义,其用法可参考深度分析首页案例中的“信用卡交易欺诈检测”和“电力窃漏电用户识别”案例。
•Python脚本节点之间虽然支持级联使用,但为了数据传输的性能强烈建议将自定义脚本写在同一个Python脚本中。
输入:一个或多个数据集或python脚本节点。
输出:根据脚本具体定义进行输出,如:数据集模型。
Python脚本提供了脚本校验的功能,输入脚本后会校验输入脚本的正确性。
2.配置方法
2.1 8.5-9.0的接口
Python脚本内置输入、输出变量和系统函数。
•输入变量
_input_table_ :pandas.DataFrame类型,为前驱数据集节点的输出数据。
_input_model_ :前驱Python脚本节点向本节点输入的数据,可以使模型对象、list、dict等可序列化任意类型。
•输出变量
_output_table_ :pandas.DataFrame类型或dict类型,用于输出数据到表格;
_output_model_ :本节点向所有直接后继Python脚本节点输出的数据,可以是模型对象、list、dict等可序列化任意类型。
_pmml_ :为训练模型的PMML文本内容,作为该模型节点的输出值,与函数to_pmml()配合使用。
_plot_ :matplotlib.pyplot类型,用于输出图片。
•系统函数
to_pmml(model,features,target):用于导出训练模型的PMML文本文件,其中model为训练出的模型,features为含有训练集所有特征(自变量)的list,这些特征顺序必须与训练模型时的特征顺序保持一致,target为含有训练集标签字段(因变量)的字符串,该系统函数返回的PMML文本可以赋值给_pmml_,以便传递给后继节点。
2.2 9.1新接口
Python脚本节点的变更:
•8.5-9.0的接口仍然兼容,仅能使老版本创建的实验导入到9.1时仍然可以正常运行,但由于不能支持多数据集输入,所以不要在9.1版本新创建的实验中使用9.0及以前的接口。
•新API从产品9.1搭配DM-Engine_v1.2使用,脚本可使用python SDK v0.2进行离线编写。
yonghong.script.port编写自定义python脚本的子工具包,包含两个工具类。
EntryPoint:当前脚本节点的输入输出端口。
input:本节点的数据输入,访问某个前置节点的某种数据可以这样写:entry.input['数据集节点1'][ResourceType.DATAFRAME],表示获取“数据集节点1”的输出数据集。
output:本节点的数据输出。
dataset:待输出的数据集。
model:待输出的模型。
pmml:待输出的pmml。
images:待输出的png图片数据,使用方法: images.put_image_from_plot("图片名字1",plot)。
ResourceType:输入输出数据的枚举类型,DATAFRAME表示数据集,MODEL表示模型。
3.新API使用案例
3.1案例1
前置节点为一个数据集节点、一个训练模型节点(Python脚本导出的训练模型),节点输出为一个数据集。
# EntryPoint:当前脚本节点的输入输出端口
# ResourceType:输入输出数据的枚举类型,DATAFRAME表示数据集,MODEL表示模型
from yonghong.script.port import EntryPoint, ResourceType
entry = EntryPoint() # 持有本节点的输入输出
input_df = entry.input['样例数据集'][ResourceType.DATAFRAME] # 获取指定的前置节点‘样例数据集’的输出数据
input_model = entry.input['决策树模型'][ResourceType.MODEL] # 获取指定的前置节点‘决策树模型’输出的训练模型
import pandas as pd
entry.output.dataset = pd.DataFrame({'字段名':input_model.predict(input_df)}) # 将预测结果输出,如果有后置节点将被后置节点接收
3.2案例2
前置节点为一个数据集节点、一个插件节点(有输出数据集),节点输出为一个训练模型。
# EntryPoint:当前脚本节点的输入输出端口
# ResourceType:输入输出数据的枚举类型,DATAFRAME表示数据集,MODEL表示模型
from yonghong.script.port import EntryPoint, ResourceType
from xgboost import XGBClassifier
entry = EntryPoint() # 持有本节点的输入输出
input_dataset1 = entry.input['样例数据集'][ResourceType.DATAFRAME] # 获取指定的前置节点‘样例数据集’的输出数据
input_dataset2 = entry.input['标准化'][ResourceType.DATAFRAME] # 获取指定的前置节点‘标准化’的输出数据集
features = ['V' + str(i) for i in range(1, 29)] + ['Amount'] # 指定特征字段。
target = 'Class'
train_X = input_dataset1[features] # 读入训练集特征数据。
train_y = input_dataset1[target] # 读入训练集分类值。
clf = XGBClassifier(n_jobs=3)
clf.fit(X=train_X, y=train_y)
import pandas as pd
entry.output.dataset = pd.DataFrame({'字段名':clf.predict(input_dataset2[features])}) # 将预测结果输出,如果有后置节点将被后置节点接收
entry.output.model = clf # 如果需要将分类器clf传递给下一个节点使用,则将clf赋值给model。
entry.output.pmml = to_pmml(clf, features, target) # 生成模型的PMML文本。
3.3案例3
前置节点为一个数据集节点、一个插件节点(有输出数据集),节点输出为一个png图片。
# EntryPoint:当前脚本节点的输入输出端口
# ResourceType:输入输出数据的枚举类型,DATAFRAME表示数据集,MODEL表示模型
from yonghong.script.port import EntryPoint, ResourceType
from xgboost import XGBClassifier
entry = EntryPoint() # 持有本节点的输入输出
input_dataset1 = entry.input['样例数据集'][ResourceType.DATAFRAME] # 获取指定的前置节点'样例数据集'的输出数据
input_dataset2 = entry.input['标准化'][ResourceType.DATAFRAME] # 获取指定的前置节点‘标准化’的输出数据集
# 绘图部分
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import manifold
df= input_dataset1
df_lle, _ = manifold.locally_linear_embedding(df.drop(columns='ElectricLeakage'), n_neighbors=30, n_components=2) # 对数据进行降维操作
fig = plt.figure()
ax = fig.add_subplot(211, projection='3d')
ax.scatter(df['LineLoss(%)'], df['ElectricQuantityDowntrend'], df['AlarmNumber'], c=df['ElectricLeakage'], cmap=plt.cm.Spectral)
ax.set_xlabel('LineLoss(%)')
ax.set_ylabel('EQD')
ax.set_zlabel('AlarmNumber')
ax.set_title('Original data')
ax = fig.add_subplot(212)
ax.scatter(df_lle[:, 0], df_lle[:, 1], c=df['ElectricLeakage'], cmap=plt.cm.Spectral)
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_title('Projected data')
plt.axis('tight')
#绘图参数配置完毕后,不要使用plt.show()显示图片,该函数是无效的
entry.output.images.put_image_from_plot("案例图片名字1",plt) # 配置好绘图参数后将plt传递给images变量,图表就可以绘制到页面中