Python脚本

<< 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_,以便传递给后继节点。

param 用于读取实验的参数信息的字典,使用时用参数名作为key可以获取参数的值,如:a = param['a']

现存参数中没有该key的情况下会自动新建空参数,启动实验时会自动弹窗输入,也可以在编辑参数中自行编辑。

注意该字典为只读,只能取key对应的value,无法对key下的参数值进行赋值。

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)})  # 将预测结果输出,如果有后置节点将被后置节点接收

DepthAnalysis_pythonScriptCase1

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文本。

DepthAnalysis_pythonScriptCase2

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变量,图表就可以绘制到页面中

DepthAnalysis_pythonScriptCase3