NZFunTApply

Conozca la función ' NZFunTApply '.

Esto corresponde al caso de uso " 2. Construyendo un modelo ML contra todas las filas disponibles.. Esto da lugar a dos variantes: construir un modelo a partir de los datos del corte o construir un modelo a partir de los datos de toda la tabla.

Aplicar funciones a todos y cada uno de los segmentos de los datos
Una porción de datos es un fragmento de los datos de la tabla. Netezza distribuye los datos en distintos segmentos en función de la columna especificada en el momento de la creación de la tabla. Si no se especifica ninguna columna, se considerará la primera columna como columna de distribución. Por lo tanto, es importante identificar primero cómo se distribuyeron los datos antes de utilizar " NZFunTApply. De lo contrario, podría tener resultados no deseados con la función que se aplica a las rebanadas que no era su intención.
Ejemplo de escenario: transformar los datos, construir un modelo ML y medir la precisión del modelo.
Definamos una función que realice todos estos pasos. La función recibe dos parámetros por defecto, ' self (que representa el contexto AE) y ' df (dataframe para los datos de slice entrantes). Primero imputa las columnas (asignando algunos valores por defecto para los valores nulos), luego construye un clasificador de árbol de decisión y mide una precisión de CV de 3 veces. Y el resultado (tamaño del conjunto de datos, ubicación del primer registro, precisión) se imprime con ' 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))
Como desea aplicar la función a todos y cada uno de los segmentos de datos, elija ' parallel=True en la invocación del módulo.
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()
Observe que tiene varias filas en el resultado (correspondientes al número de rebanadas de datos generadas en el momento de la creación de la tabla). La primera columna es el tamaño del conjunto de datos, la segunda es la ubicación del primer registro en el conjunto de datos y la tercera es la precisión del clasificador construido.

     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
Aplicación de funciones al conjunto de datos completo
Es posible que desee aplicar una función a todo el conjunto de datos y no por trozos. Esto significa que los datos deben agregarse en un único lugar antes de poder aplicar la función. No se trata de un escenario óptimo, pero esta opción (parallel=False) se ofrece en aras de la exhaustividad.
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()
Como ha elegido " parallel=False " (lo que significa que desea realizar la función en el conjunto de datos completo), sólo puede ver una fila en la salida. La primera columna es el tamaño del conjunto de datos, la segunda es la ubicación del primer registro en el conjunto de datos y la tercera es la precisión del clasificador construido.

DATASET_SIZE        LOCATION           CLASSIFIER_ACCURACY
  142193            Albury             0.827115
Nota: Para funciones complejas, es mejor probarlas primero en el cliente antes de ejecutarlas en el servidor. Puede descargar un pequeño subconjunto (por ejemplo, 1.000 registros) con una consulta de selección (select * from weather limit 1000), probar la función en el marco de datos del cliente y, a continuación, enviar la función al servidor para ejecutarla con el conjunto de datos completo.