Try to use Watson’s Tradeoff Analytics API

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-20-12-20-57

Overview

  • Tradeoff Analytics is Helps users make better choices to best meet multiple conflicting goals.
  • You do only POST json at once
  • This API returns better choices

Tradeoff Analytics | IBM Watson Developer Cloud

How to call the API

$ curl -X POST --user YOUR_USERNAME:YOUR_PASSWORD --header "Content-Type: application/json" --data @problem.json "https://gateway.watsonplatform.net/tradeoff-analytics/api/v1/dilemmas?generate_visualization=false" | jq .

Request body(JSON)

subject
Subject of your choices
columns
Condition of your choice
options
Search target

Example

{
  "subject": "phones",
  "columns": [
    {
      "key": "price",
      "type": "numeric",
      "goal": "min",
      "is_objective": true,
      "full_name": "Price",
      "range": {
        "low": 0,
        "high": 400
      },
      "format": "number:2"
    },
    {
      "key": "weight",
      "type": "numeric",
      "goal": "min",
      "is_objective": true,
      "full_name": "Weight",
      "format": "number:0"
    },
    {
      "key": "brand",
      "type": "categorical",
      "goal": "min",
      "is_objective": true,
      "full_name": "Brand",
      "range": [
        "Apple",
        "HTC",
        "Samsung",
        "Sony"
      ],
      "preference": [
        "Samsung",
        "Apple",
        "HTC"
      ]
    },
    {
      "key": "rDate",
      "type": "datetime",
      "goal": "max",
      "full_name": "Release Date",
      "format": "date: 'MMM dd, yyyy'"
    }
  ],
  "options": [
    {
      "key": "1",
      "name": "Samsung Galaxy S4",
      "values": {
        "price": 249,
        "weight": 130,
        "brand": "Samsung",
        "rDate": "2013-04-29T00:00:00Z"
      }
    },
    {
      "key": "2",
      "name": "Apple iPhone 5",
      "values": {
        "price": 349,
        "weight": 112,
        "brand": "Apple",
        "rDate": "2012-09-21T00:00:00Z"
      }
    },
    {
      "key": "3",
      "name": "HTC One",
      "values": {
        "price": 299,
        "weight": 112,
        "brand": "HTC",
        "rDate": "2013-03-01T00:00:00Z"
      }
    },
    {
      "key": "4",
      "name": "Samsung Galaxy S5",
      "values": {
        "price": 349,
        "weight": 135,
        "brand": "Samsung",
        "rDate": "2014-04-29T00:00:00Z"
      }
    },
    {
      "key": "5",
      "name": "Apple iPhone 6",
      "values": {
        "price": 399,
        "weight": 118,
        "brand": "Apple",
        "rDate": "2013-09-21T00:00:00Z"
      }
    },
    {
      "key": "6",
      "name": "Apple iPhone 7",
      "values": {
        "price": 499,
        "weight": 118,
        "brand": "Apple",
        "rDate": "2014-09-21T00:00:00Z"
      }
    },
    {
      "key": "7",
      "name": "Sony Xperia",
      "values": {
        "price": 199,
        "weight": 120,
        "brand": "Sony",
        "rDate": "2014-08-21T00:00:00Z"
      }
    }
  ]
}

If you see..

If you see following returns, some request parameter is wrong.

Invalid UserId and/or Password

{
  "code": 401,
  "error": "Not Authorized",
  "description": "2016-11-19T21:39:28-06:00, Error ERCDPLTFRM-DNLKUPERR occurred when accessing https://158.85.132.88:443/tradeoff-analytics/api/v1/dilemmas, Invalid UserId and/or Password. Please confirm that your credentials match the end-point you are trying to access. A common error is trying to use credentials from an experimental or beta release against a GA release or vice versa"
}

Missing parameters

Following response if you see, please check your request body.

“subject” not found

{
  "error": "Data supplied is missing critical information. error_arg_check=\"subject cannot be null or empty\"",
  "code": 400
}

“columns” not found

{
  "error": "Data supplied is missing critical information. No columns defined",
  "code": 400
}

“options” not found

{
  "error": "Data supplied is missing critical information. no options found",
  "code": 400
}

Returns

If your request succeed.You can see following JSON.

{
  "problem": {
    "columns": [
      {
        "type": "numeric",
        "key": "price",
        "full_name": "Price",
        "range": {
          "low": 0,
          "high": 400
        },
        "format": "number:2",
        "goal": "min",
        "is_objective": true
      },
      {
        "type": "numeric",
        "key": "weight",
        "full_name": "Weight",
        "format": "number:0",
        "goal": "min",
        "is_objective": true
      },
      {
        "type": "categorical",
        "key": "brand",
        "full_name": "Brand",
        "range": [
          "Apple",
          "HTC",
          "Samsung",
          "Sony"
        ],
        "goal": "min",
        "preference": [
          "Samsung",
          "Apple",
          "HTC"
        ],
        "is_objective": true
      },
      {
        "type": "datetime",
        "key": "rDate",
        "full_name": "Release Date",
        "format": "date: 'MMM dd, yyyy'",
        "goal": "max",
        "is_objective": false
      }
    ],
    "subject": "phones",
    "options": [
      {
        "key": "1",
        "name": "Samsung Galaxy S4",
        "values": {
          "price": 249,
          "weight": 130,
          "brand": "Samsung",
          "rDate": "2013-04-29T00:00:00Z"
        }
      },
      {
        "key": "2",
        "name": "Apple iPhone 5",
        "values": {
          "price": 349,
          "weight": 112,
          "brand": "Apple",
          "rDate": "2012-09-21T00:00:00Z"
        }
      },
      {
        "key": "3",
        "name": "HTC One",
        "values": {
          "price": 299,
          "weight": 112,
          "brand": "HTC",
          "rDate": "2013-03-01T00:00:00Z"
        }
      },
      {
        "key": "4",
        "name": "Samsung Galaxy S5",
        "values": {
          "price": 349,
          "weight": 135,
          "brand": "Samsung",
          "rDate": "2014-04-29T00:00:00Z"
        }
      },
      {
        "key": "5",
        "name": "Apple iPhone 6",
        "values": {
          "price": 399,
          "weight": 118,
          "brand": "Apple",
          "rDate": "2013-09-21T00:00:00Z"
        }
      },
      {
        "key": "6",
        "name": "Apple iPhone 7",
        "values": {
          "price": 499,
          "weight": 118,
          "brand": "Apple",
          "rDate": "2014-09-21T00:00:00Z"
        }
      },
      {
        "key": "7",
        "name": "Sony Xperia",
        "values": {
          "price": 199,
          "weight": 120,
          "brand": "Sony",
          "rDate": "2014-08-21T00:00:00Z"
        }
      }
    ]
  },
  "resolution": {
    "solutions": [
      {
        "solution_ref": "1",
        "status": "FRONT"
      },
      {
        "solution_ref": "2",
        "status": "FRONT"
      },
      {
        "solution_ref": "3",
        "status": "FRONT"
      },
      {
        "solution_ref": "4",
        "status": "EXCLUDED"
      },
      {
        "solution_ref": "5",
        "status": "EXCLUDED"
      },
      {
        "solution_ref": "6",
        "status": "INCOMPLETE",
        "status_cause": {
          "message": "A column of a option is out of range. Option \"6\" has a value in column \"price\" which is:\"499\" while the column range\" is: [0.0,400.0]",
          "error_code": "RANGE_MISMATCH",
          "tokens": [
            "price",
            "499",
            "[0.0,400.0]"
          ]
        }
      },
      {
        "solution_ref": "7",
        "status": "DOES_NOT_MEET_PREFERENCE",
        "status_cause": {
          "message": "Option \"7\" has a value that does not meet preference for column \"brand\"",
          "error_code": "DOES_NOT_MEET_PREFERENCE",
          "tokens": [
            "brand"
          ]
        }
      }
    ]
  }
}

Where is better choise?

The api’s choice is included in resolution parameters.

$ curl -X POST --user YOUR_USERNAME:YOUR_PASSWORD --header "Content-Type: application/json" --data @problem.json "https://gateway.watsonplatform.net/tradeoff-analytics/api/v1/dilemmas?generate_visualization=false | jq ".resolution"
{
  "solutions": [
    {
      "solution_ref": "1",
      "status": "FRONT"
    },
    {
      "solution_ref": "2",
      "status": "FRONT"
    },
    {
      "solution_ref": "3",
      "status": "FRONT"
    },
    {
      "solution_ref": "4",
      "status": "EXCLUDED"
    },
    {
      "solution_ref": "5",
      "status": "EXCLUDED"
    },
    {
      "solution_ref": "6",
      "status": "INCOMPLETE",
      "status_cause": {
        "message": "A column of a option is out of range. Option \"6\" has a value in column \"price\" which is:\"499\" while the column range\" is: [0.0,400.0]",
        "error_code": "RANGE_MISMATCH",
        "tokens": [
          "price",
          "499",
          "[0.0,400.0]"
        ]
      }
    },
    {
      "solution_ref": "7",
      "status": "DOES_NOT_MEET_PREFERENCE",
      "status_cause": {
        "message": "Option \"7\" has a value that does not meet preference for column \"brand\"",
        "error_code": "DOES_NOT_MEET_PREFERENCE",
        "tokens": [
          "brand"
        ]
      }
    }
  ]
}

If you check status parameters, you can check is the item is better choice.

Front
Once of your better choice.
Excluded
Excluded choices
Incomplete / DOES_NOT_MEET_PREFERENCE
Missing or incomplete parameters

In this example, better choices is following items.

  • ID:1 – Samsung Galaxy S4
  • ID:2 – Apple iPhone 5
  • ID:3 – HTC One

Follow me!

Leave a Reply

Your email address will not be published. Required fields are marked *