예제 #1
0
    def handle_cli(self, args, func):
        parser = argparse.ArgumentParser()
        parser.add_argument("--input", required=True)
        parser.add_argument("-o",
                            "--output",
                            default="str",
                            choices=["str", "json"])
        parser.add_argument(
            "--orient",
            default=self.orient,
            choices=PANDAS_DATAFRAME_TO_DICT_ORIENT_OPTIONS,
        )
        parser.add_argument(
            "--output_orient",
            default=self.output_orient,
            choices=PANDAS_DATAFRAME_TO_DICT_ORIENT_OPTIONS,
        )
        parsed_args = parser.parse_args(args)

        orient = parsed_args.orient
        output_orient = parsed_args.output_orient
        cli_input = parsed_args.input

        if os.path.isfile(cli_input) or is_s3_url(cli_input) or is_url(
                cli_input):
            if cli_input.endswith(".csv"):
                df = pd.read_csv(cli_input)
            elif cli_input.endswith(".json"):
                df = pd.read_json(cli_input,
                                  orient=orient,
                                  typ=self.typ,
                                  dtype=False)
            else:
                raise BadInput(
                    "Input file format not supported, BentoML cli only accepts .json "
                    "and .csv file")
        else:
            # Assuming input string is JSON format
            try:
                df = pd.read_json(cli_input,
                                  orient=orient,
                                  typ=self.typ,
                                  dtype=False)
            except ValueError as e:
                raise BadInput(
                    "Unexpected input format, BentoML DataframeHandler expects json "
                    "string as input: {}".format(e))

        if self.typ == "frame" and self.input_dtypes is not None:
            _check_dataframe_column_contains(self.input_dtypes, df)

        result = func(df)
        if parsed_args.output == 'json':
            result = api_func_result_to_json(
                result, pandas_dataframe_orient=output_orient)
        else:
            result = str(result)
        print(result)
예제 #2
0
    def handle_cli(self, args, func):
        parser = argparse.ArgumentParser()
        parser.add_argument('--input', required=True)
        parser.add_argument('-o',
                            '--output',
                            default="str",
                            choices=['str', 'json', 'yaml'])
        parser.add_argument('--orient', default=self.orient)
        parser.add_argument('--output_orient', default=self.output_orient)
        parsed_args = parser.parse_args(args)

        orient = parsed_args.orient
        output_orient = parsed_args.output_orient
        cli_input = parsed_args.input

        if os.path.isfile(cli_input) or is_s3_url(cli_input) or is_url(
                cli_input):
            if cli_input.endswith('.csv'):
                df = pd.read_csv(cli_input)
            elif cli_input.endswith('.json'):
                df = pd.read_json(cli_input,
                                  orient=orient,
                                  typ=self.typ,
                                  dtype=False)
            else:
                raise ValueError(
                    "Input file format not supported, BentoML cli only accepts .json and .csv file"
                )
        else:
            # Assuming input string is JSON format
            try:
                df = pd.read_json(cli_input,
                                  orient=orient,
                                  typ=self.typ,
                                  dtype=False)
            except ValueError as e:
                raise ValueError(
                    "Unexpected input format, BentoML DataframeHandler expects json string as"
                    "input: {}".format(e))

        if self.typ == 'frame' and self.input_columns is not None:
            check_dataframe_column_contains(self.input_columns, df)

        result = func(df)
        result = get_output_str(result, parsed_args.output, output_orient)
        print(result)
예제 #3
0
    def handle_cli(self, args, func):
        parser = argparse.ArgumentParser()
        parser.add_argument("--input", required=True)
        parser.add_argument(
            "--orient",
            default=self.orient,
            choices=PANDAS_DATAFRAME_TO_JSON_ORIENT_OPTIONS,
        )
        parsed_args, unknown_args = parser.parse_known_args(args)

        orient = parsed_args.orient
        cli_input = parsed_args.input

        if os.path.isfile(cli_input) or is_s3_url(cli_input) or is_url(cli_input):
            if cli_input.endswith(".csv"):
                df = pd.read_csv(cli_input)
            elif cli_input.endswith(".json"):
                df = pd.read_json(cli_input, orient=orient, typ=self.typ)
            else:
                raise BadInput(
                    "Input file format not supported, BentoML cli only accepts .json "
                    "and .csv file"
                )
        else:
            # Assuming input string is JSON format
            try:
                df = pd.read_json(cli_input, orient=orient, typ=self.typ)
            except ValueError as e:
                raise BadInput(
                    "Unexpected input format, BentoML DataframeInput expects json "
                    "string as input: {}".format(e)
                )

        if self.typ == "frame" and self.input_dtypes is not None:
            check_dataframe_column_contains(self.input_dtypes, df)

        result = func(df)
        self.output_adapter.to_cli(result, unknown_args)