import sys import json import requests class DataRobotPredictionError(Exception): """Raised if there are issues getting predictions from DataRobot""" def make_datarobot_deployment_predictions(data, deployment_id): """ Make predictions on data provided using DataRobot deployment_id provided. See docs for details: https://app.datarobot.com/docs-jp/predictions/api/dr-predapi.html Parameters ---------- data : str If using CSV as input: Feature1,Feature2 numeric_value,string Or if using JSON as input: [{"Feature1":numeric_value,"Feature2":"string"}] deployment_id : str The ID of the deployment to make predictions with. Returns ------- Response schema: https://app.datarobot.com/docs-jp/predictions/api/dr-predapi.html#response-schema Raises ------ DataRobotPredictionError if there are issues getting predictions from DataRobot """ # Set HTTP headers. The charset should match the contents of the file. headers = { # As default, we expect CSV as input data. # Should you wish to supply JSON instead, # comment out the line below and use the line after that instead: 'Content-Type': 'text/plain; charset=UTF-8', # 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer {}'.format('NjQwMDVmNGI0ZDQzZDFhYzI2YThmZDJiOnVZejljTXFNTXNoUnlKMStoUFhXSFdYMEZRck9lY3dobnEvRFZ1aVBHbVE9'), 'DataRobot-Key': '84f96e49-d400-ec9c-92fc-30fc6e9329d1', } API_URL = 'https://jppdemo.orm.datarobot.com/predApi/v1.0/deployments/{deployment_id}/predictions' url = API_URL.format(deployment_id=deployment_id) # Prediction Explanations: # See the documentation for more information: # https://app.datarobot.com/docs-jp/predictions/api/dr-predapi.html#request-pred-explanations # Should you wish to include Prediction Explanations or Prediction Warnings in the result, # Change the parameters below accordingly, and remove the comment from the params field below: params = { # If explanations are required, uncomment the line below # 'maxExplanations': 3, # 'thresholdHigh': 0.5, # 'thresholdLow': 0.15, # If text explanations are required, uncomment the line below. # 'maxNgramExplanations': 'all', # Uncomment this for Prediction Warnings, if enabled for your deployment. # 'predictionWarningEnabled': 'true', } # Make API request for predictions predictions_response = requests.post( url, data=data, headers=headers, # Prediction Explanations: # Uncomment this to include explanations in your prediction # params=params, ) _raise_dataroboterror_for_status(predictions_response) # Return a Python dict following the schema in the documentation return predictions_response.json() def _raise_dataroboterror_for_status(response): """Raise DataRobotPredictionError if the request fails along with the response returned""" try: response.raise_for_status() except requests.exceptions.HTTPError: err_msg = '{code} Error: {msg}'.format( code=response.status_code, msg=response.text) raise DataRobotPredictionError(err_msg) def main(filename, deployment_id): """ Return an exit code on script completion or error. Codes > 0 are errors to the shell. Also useful as a usage demonstration of `make_datarobot_deployment_predictions(data, deployment_id)` """ MAX_PREDICTION_FILE_SIZE_BYTES = 52428800 # 50 MB if not filename: print( 'Input file is required argument. ' 'Usage: python datarobot-predict.py ') return 1 data = open(filename, 'rb').read() data_size = sys.getsizeof(data) if data_size >= MAX_PREDICTION_FILE_SIZE_BYTES: print(( 'Input file is too large: {} bytes. ' 'Max allowed size is: {} bytes.' ).format(data_size, MAX_PREDICTION_FILE_SIZE_BYTES)) return 1 try: predictions = make_datarobot_deployment_predictions(data, deployment_id) except DataRobotPredictionError as exc: print(exc) return 1 return predictions # def prediction_formatting_to_dataframe(prediction_json): # prediction_df = pd.jason_normalize(prediction_json)[['rowId'