NZFunTApply

了解 "NZFunTApply函数。

这与用例 "相对应 2. 根据所有可用记录建立 ML 模型。. 这就导致了两种变化:针对切片数据建立模型或针对整个表数据建立模型。

在每个数据片上应用函数
数据片是表数据的一部分。 Netezza会根据创建表时指定的列将数据分发到不同的切片。 如果没有指定列,第一列将被视为分布列。 因此,在使用 "NZFunTApply之前,必须首先确定数据的分布情况。 否则,可能会产生意想不到的结果,即函数被应用到了你并不打算应用的切片上。
示例场景:转换数据、建立 ML 模型并测量模型的准确性。
让我们定义一个函数来完成所有这些步骤。 该函数默认获取两个参数:"self(代表 AE 上下文)和 "df(输入切片数据的数据帧)。 它首先对列进行估算(为空值分配一些默认值),然后建立一个决策树分类器,并测量 3 倍的 CV 精度。 结果(数据集大小、第一条记录的位置、准确性)用 "self.output打印出来。
from nzpyida import IdaDataBase, IdaDataFrame
from nzpyida.ae import  NZFunTApply

idadb = IdaDataBase('weather', 'admin', 'password', verbose=True)

idadf = IdaDataFrame(idadb, 'WEATHER')

code_str_host_spus="""def decision_tree_ml(self, df):
    from sklearn.model_selection import cross_val_score
    from sklearn.impute import SimpleImputer
    from sklearn.tree import DecisionTreeClassifier

    from sklearn.preprocessing import LabelEncoder
    import numpy as np

    location = df.LOCATION[0]

    # data preparation
    imputed_df = df.copy()
    ds_size = len(imputed_df)
    imputed_df['CLOUD9AM'] = imputed_df.CLOUD9AM.astype('str')
    imputed_df['CLOUD3PM'] = imputed_df.CLOUD3PM.astype('str')
    imputed_df['SUNSHINE'] = imputed_df.SUNSHINE.astype('float')
    imputed_df['EVAPORATION'] = imputed_df.EVAPORATION.astype('float')


    #remove columns which have only null values
    columns = imputed_df.columns
    for column in columns:
        if imputed_df[column].isnull().sum()==len(imputed_df):
            imputed_df=imputed_df.drop(column, 1)
        for column in columns:

        if (imputed_df[column].dtype == 'float64' or imputed_df[column].dtype == 'int64'):
            imp = SimpleImputer(missing_values=np.nan, strategy='mean')
            imputed_df[column] = imp.fit_transform(imputed_df[column].values.reshape(-1, 1))

        if (imputed_df[column].dtype == 'object'):
            # impute missing values for categorical variables
            imp = SimpleImputer(missing_values=None, strategy='constant', fill_value='missing')
            imputed_df[column] = imp.fit_transform(imputed_df[column].values.reshape(-1, 1))
            imputed_df[column] = imputed_df[column].astype('str')
            le = LabelEncoder()
            #print(imputed_df[column].unique())

            le.fit(imputed_df[column].unique())
            # print(le.classes_)
            imputed_df[column] = le.transform(imputed_df[column])



    X = imputed_df.drop(['RISK_MM', 'RAINTOMORROW'], axis=1)
    y = imputed_df['RAINTOMORROW']

    # Create a decision tree
    dt = DecisionTreeClassifier(max_depth=5)

    cvscores_3 = cross_val_score(dt, X, y, cv=3)

    self.output(ds_size, location, np.mean(cvscores_3))
由于要对每个数据片应用函数,因此在模块调用中选择 "parallel=True
output_signature = {'DATASET_SIZE': 'int', 'LOCATION':'str', 'CLASSIFIER_ACCURACY':'double'}

nz_fun_tapply = NZFunTApply(df=idadf, code_str=code_str_host_spus, fun_name ="decision_tree_ml", parallel=True, output_signature=output_signature)
result = nz_fun_tapply.get_result()
请注意,结果中有多行(与创建表格时生成的数据片的数量相对应)。 第一列是数据集的大小,第二列是数据集中第一条记录的位置,第三列是建立的分类器的准确率。

     DATASET_SIZE LOCATION  CLASSIFIER_ACCURACY
0         23673   Albury             0.824822
1         23734   Albury             0.827126
2         23686   Albury             0.813898
3         23706   Albury             0.818485
4         23739   Albury             0.832175
5         23655   Albury             0.826168
在完整数据集上应用函数
您可能希望对整个数据集而不是切片应用函数。 这意味着,在应用函数之前,需要在一个地方汇总数据。 这并不是一个最佳方案,但为了完整起见,还是提供了这个选项(parallel=False)。
output_signature = {'DATASET_SIZE': 'int', 'LOCATION':'str', 'CLASSIFIER_ACCURACY':'double'}
nz_fun_tapply = NZFunTApply(df=idadf, code_str=code_str_host_spus, fun_name ="decision_tree_ml", parallel=False, output_signature=output_signature)
result = nz_fun_tapply.get_result()
由于您选择了 "parallel=False(意味着您想在完整的数据集上执行函数),因此在输出中只能看到一行。 第一列是数据集的大小,第二列是数据集中第一条记录的位置,第三列是建立的分类器的准确率。

DATASET_SIZE        LOCATION           CLASSIFIER_ACCURACY
  142193            Albury             0.827115
注意:对于复杂的功能,最好先在客户端测试,然后再在服务器上运行。 您可以使用选择查询(select * from weather limit 1000)下载一小部分子集(例如 1000 条记录),在客户端数据帧上测试函数,然后将函数推送到服务器,在整个数据集上运行。