def handle_aws_lambda_event(self, event, func): if event["headers"].get("Content-Type", None) == "text/csv": df = pd.read_csv(event["body"]) else: # Optimistically assuming Content-Type to be "application/json" try: df = pd.read_json(event["body"], orient=self.orient, typ=self.typ) except ValueError: raise BadInput( "Failed parsing request data, only Content-Type application/json " "and text/csv are supported in BentoML DataframeInput" ) if self.typ == "frame" and self.input_dtypes is not None: check_dataframe_column_contains(self.input_dtypes, df) result = func(df) return self.output_adapter.to_aws_lambda_event(result, event)
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, 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 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)
def handle_request(self, request: flask.Request, func): if request.content_type == "text/csv": csv_string = StringIO(request.get_data(as_text=True)) df = pd.read_csv(csv_string) else: # Optimistically assuming Content-Type to be "application/json" try: df = pd.read_json( request.get_data(as_text=True), orient=self.orient, typ=self.typ, ) except ValueError: raise BadInput( "Failed parsing request data, only Content-Type application/json " "and text/csv are supported in BentoML DataframeInput" ) if self.typ == "frame" and self.input_dtypes is not None: check_dataframe_column_contains(self.input_dtypes, df) result = func(df) return self.output_adapter.to_response(result, request)