[ 
https://issues.apache.org/jira/browse/MADLIB-1240?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16533991#comment-16533991
 ] 

ASF GitHub Bot commented on MADLIB-1240:
----------------------------------------

Github user njayaram2 commented on a diff in the pull request:

    https://github.com/apache/madlib/pull/288#discussion_r200444598
  
    --- Diff: src/ports/postgres/modules/cols_vec/cols2vec.py_in ---
    @@ -0,0 +1,110 @@
    +"""
    +@file cols2vec.py_in
    +
    +@brief Utility to convert Columns to array
    +
    +"""
    +
    +import plpy
    +from utilities.control import MinWarning
    +from utilities.utilities import split_quoted_delimited_str
    +from utilities.utilities import _string_to_array
    +from utilities.validate_args import columns_exist_in_table
    +from utilities.validate_args import is_var_valid
    +from utilities.validate_args import get_cols
    +from utilities.validate_args import quote_ident
    +from utilities.utilities import py_list_to_sql_string
    +
    +
    +m4_changequote(`<!', `!>')
    +
    +
    +def validate_cols2vec_args(source_table, output_table,
    +                           list_of_features, list_of_features_to_exclude, 
cols_to_output, **kwargs):
    +    """
    +        Function to validate input parameters
    +    """
    +    if list_of_features.strip() != '*':
    +        if not (list_of_features and list_of_features.strip()):
    +            plpy.error("Features to include is empty")
    +
    +    if list_of_features.strip() != '*':
    +        if not columns_exist_in_table(
    +                source_table, 
split_quoted_delimited_str(list_of_features)):
    +            plpy.error(
    +                "Invalid columns to list_of_features 
({0})".format(list_of_features))
    +
    +    if cols_to_output and cols_to_output.strip() != '*':
    +        if not columns_exist_in_table(
    +                source_table, _string_to_array(cols_to_output)):
    +            plpy.error("Invalid columns to output list ({0})".
    +                       format(cols_to_output))
    +
    +
    +def cols2vec(schema_madlib, source_table, output_table, list_of_features,
    +             list_of_features_to_exclude=None, cols_to_output=None, 
**kwargs):
    +    """
    +    Args:
    +        @param schema_madlib:               Name of MADlib schema
    +        @param model:                       Name of table containing the 
tree model
    +        @param source_table:                Name of table containing 
prediction data
    +        @param output_table:                Name of table to output the 
results
    +        @param list_of_features:            Comma-separated string of 
column names or
    +                                            expressions to put into 
feature array.
    +                                            Can also be a '*' implying all 
columns
    +                                            are to be put into feature 
array.
    +        @param list_of_features_to_exclude: Comma-separated string of 
column names
    +                                            to exclude from the feature 
array
    +        @param cols_to_output:              Comma-separated string of 
column names
    +                                            from the source table to keep 
in the output table,
    +                                            in addition to the feature 
array.
    +
    +    Returns:
    +        None
    +
    +    """
    +
    +    with MinWarning('warning'):
    +        validate_cols2vec_args(source_table, output_table, 
list_of_features,
    +                               list_of_features_to_exclude, 
cols_to_output, **kwargs)
    +
    +        all_cols = ''
    +        feature_cols = ''
    +        if list_of_features.strip() == '*':
    +            all_cols = get_cols(source_table, schema_madlib)
    +            all_col_set = set(list(all_cols))
    +            exclude_set = set(split_quoted_delimited_str(
    +                list_of_features_to_exclude))
    +            feature_set = all_col_set - exclude_set
    +            feature_cols = py_list_to_sql_string(
    +                list(feature_set), "text", False)
    +            filtered_list_of_features = ",".join(
    +                feat for feat in list(feature_set))
    +        else:
    +            feature_list = split_quoted_delimited_str(list_of_features)
    +            feature_exclude = split_quoted_delimited_str(
    +                list_of_features_to_exclude)
    +            return_set = set(feature_list) - set(feature_exclude)
    +            feature_cols = py_list_to_sql_string(
    +                list(return_set), "text", False)
    +            filtered_list_of_features = ",".join(
    +                feat for feat in feature_list if feat in return_set)
    +
    +        output_cols = ''
    +        if cols_to_output:
    +            output_cols_list = [', '.join(get_cols(source_table, 
schema_madlib)) if col == '*' else col
    +                                for col in 
split_quoted_delimited_str(cols_to_output)]
    +            output_cols = ', '.join(output_cols_list) + ","
    +
    +        plpy.execute("""
    +                   CREATE TABLE {output_table} AS
    +                   select {output_cols}
    +            array[{filtered_list_of_features}] as feature_vector
    +                   from {source_table}
    +                   """.format(**locals()))
    +
    +        plpy.execute("""
    --- End diff --
    
    @iyerr3  The vec2cols story 
(https://issues.apache.org/jira/browse/MADLIB-1240) might consume this summary 
table if provided as the `dictionary` param in that module. 


> Vector to Columns
> -----------------
>
>                 Key: MADLIB-1240
>                 URL: https://issues.apache.org/jira/browse/MADLIB-1240
>             Project: Apache MADlib
>          Issue Type: New Feature
>          Components: Module: Utilities
>            Reporter: Frank McQuillan
>            Assignee: Nandish Jayaram
>            Priority: Major
>             Fix For: v1.15
>
>
> related to https://issues.apache.org/jira/browse/MADLIB-1239
> Vector to Columns
> Converts a feature array in a single column of an output table into multiple 
> columns.  This process can be used to reverse the function cols2vec.
> {code}
> vec2cols(
>     source_table,
>     out_table,
>     vector_col,
>     dictionary,
>     cols_to_output
>     )
> source_table
> TEXT. Name of the table containing the source data.
> out_table
> TEXT. Name of the generated table containing the output. If a table with the 
> same name already exists, an error will be returned. 
> vector_col
> TEXT.  Name of the column containing the feature array.  Must be a 
> one-dimensional array.
> dictionary (optional)
> TEXT. Name of the table containing the array of names associated with the 
> feature array.  This table is created by the function 'cols2vec'.  If the 
> dictionary table is not specified, column names will be automatically 
> generated of the form 'feature_1, feature_2, ...feature_n'
> cols_to_output (optional)
> TEXT, default NULL. Comma-separated string of column names from the source 
> table to keep in the output table, in addition to the feature columns.  To 
> keep all columns from the source table, use '*'.
> Output
> The output table produced by the vec2cols function contains the following 
> columns:
> <...>
> Columns from source table, depending on which ones are kept (if any).
> feature columns
> Columns for each of the features in 'vector_col'.  Column type will depend on 
> the feature array type in the source table.  Column naming will depend on 
> whether the parameter 'dictionary' is used.
> {code}
> Notes
> (1)
> The function
> http://pivotalsoftware.github.io/PDLTools/group__ArrayUtilities.html
> is similar but the proposed MADlib one has more options.  To do the 
> equivalent of the PDL Tools one in MADlib, you would do:
> {code}
> vec2cols(
>     table_name,
>     output_table,
>     vector_column,
>     NULL,
>     '*'
>     )
> {code}
> (2)
> Please put the generated feature columns on the right side of the output 
> table, i.e., they will be the last column on the right.  Maintain the order 
> of the array.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to