This short tutorial shows how to store data into the prediction service with python and requests (see also Access to REST-Services in Python).
For IDL you can take a similar approach by adapting these instructions to Access to REST-Services in IDL.
The prediction service represents a web interface which allows to request, insert and modify prediction data from the database. Operations are performed by sending URL requests, whereas each operation is well defined as a so called route. The prediction service comes along with a graphical user interface at http://localhost:8004/ui/ which provides visual access to all available routes. Hereby, all routes involving the insertion or modification of data are enlisted under the Edit section.
For this tutorial we are using only two routes. One to add a new machine learning configuration and one to add the consequential predictions.
Each route can hold up to three different parameter types which are described in details by the following article: "Ingest property data in database (REST API)".
In our example we run a machine learning algorithm which produces a set of flare predictions to store within our database. Hereby, the algorithm consists of a training phase and a testing or prediction phase. Within the training phase the algorithm learns and tunes its parameters which then can be stored within the database as a configuration for later use. Afterwards, within the testing phase, we use this configuration to compute flare predictions which are also stored within the database. The following code shows the two corresponding functions.
def train_model(model, train_data, validation_data, max_epoches, batch_size, environment): # train model (e.g. until max_epoches are reached or validation loss increases) model.train(train_data, validation_data, max_epoches, batch_size) # store model parameters within database post_data = { "algorithm_run_id": environment['runtime']['run_id'], "config_data": model.get_parameters(), "description": "" } response = requests.post('http://localhost:8004/algoconfig/%s' % environment['algorithm']['cfg_name'], json=post_data).json() if response['has_error'] == True: raise ValueError('An error occurred while storing the algorithm\'s configuration:\n%s' % response['error']) return response['data'] def test_model(model, test_data, environment): # test model (e.g. predict the test_data) model.run(test_data) # store predictions within database prediction_data = [] for prediction in model.get_predictions(): prediction_data.append({ "time_start": prediction['time_start'], "time_duration": prediction['time_duration'], "probability": prediction['probability'], "intensity_min": prediction['intensity_min'], "intensity_max": prediction['intensity_max'], "meta": { "harp": prediction['harp'], "nar": prediction['nar'] }, "data": prediction['data'] }) post_data = { "algorithm_config": environment['algorithm']['cfg_name'], "algorithm_run_id": environment['runtime']['run_id'], "prediction_data": prediction_data, "source_data": [get_fc_id(row) for row in test_data] } response = requests.post('http://localhost:8004/predictionset', json=post_data).json() if response['has_error'] == True: raise ValueError('An error occurred while storing the algorithm\'s prediction set:\n%s' % response['error']) return response['data'] |
The post_data structure is equivalent to the algorithm_config_data or prediction_data definitions as given by the routes /algoconfig/{name} and /prediction/bulk:
![]() | |
---|---|
|
|
Here you can download the above code fragments as python code.
A more complete example using the above functions is given by the article 'Request prediction data from database (REST API)'.
ID | Description | Solution | ||
---|---|---|---|---|
1 | TypeError while calling requests.post() command, e.g.:
This error occurs with older versions of requests < 2.4.2. | [A] Update requests (recommended): pip install requests --upgrade [B] Manually set the header definitions while calling 'my_url' with 'my_json_data':
| ||
2 | Serialization of complex data structures: Simple data structures (e.g. a dictionary of dictionaries or arrays) are directly serializable by the json module and do not need any conversion (see code example above). However, with more complex structures the following errors may occur:
In both cases we try to serialize characters which are not supported either by the codec (e.g. utf-8) or the database. | [A] Using the bas64 codec we can 'transform' each character into a simple ASCII representation (escaping all special characters):
|
This page was adopted from Ingest property data in database (REST API). |