Connect your Code
To more easily pipe results from your code into Snowman, you can make use of its REST API. The following guide will outline the necessary steps and give you a brief introduction.
Snowman API
Whenever a local Snowman instance is running, the API is listening at http://localhost:8123/api
(can be configured via command line arguments).
This interface is also used by the Snowman frontend.
Warning
Be advised: We have not yet implemented any security features or authorization. That means every process with access to the host is able to access the API. Progress is tracked in issue #107.
You can upload results in two steps:
- Create a new experiment.
- Upload data to it.
Use Case
In this example, we want to export our results from a python script running a ML matching solution. Consider the following code:
import io
import csv
...
# Results produced by the ML solution
candidate_pairs = ...
# Create a new string builder to write to
output = io.StringIO()
writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC)
# Write the CSV header
writer.writerow(['p1', 'p2', 'prediction'])
for candidate_pair in candidate_pairs:
# Write each row, prediction/label is either 0 (no duplicate) or 1 (duplicate)
writer.writerow([candidate_pair['id1'], candidate_pair['id2'], candidate_pair['label']])
# CSV string to upload to Snowman
csv_string = output.getvalue()
print(csv_string)
With this code, we are able to convert the results into a csv format
the API is able to understand - in this case, the pilot
format.
It remains to upload the csv data.
Upload Results
As outlined above, this procedure consists of two steps.
First, create a new experiment. Note: You will need a datasetId
and algorithmId
to assign the experiment to. We recommend creating (or selecting) a dataset and matching solution (algorithm) with the UI. The IDs are shown in brackets behind the header of all edit dialogs.
import requests
new_experiment_payload = {'datasetId': 5, 'algorithmId': 2, 'name':'my-example-run-01','description':'automatic-upload'}
create_experiment_response = requests.post('http://localhost:8123/api/v1/experiments', json=new_experiment_payload)
new_experiment_id = create_experiment_response.text
print(new_experiment_id)
This will return the new experiment's id which you will need in the next step.
Now upload the data we already exported to csv:
import requests
upload_pairs_response = requests.put(f'http://localhost:8123/api/v1/experiments/{new_experiment_id}/file?format=pilot', data=csv_string, headers={'Content-Type': 'text/csv'})
print(upload_pairs_response.status_code)
If both request return a 200er status code, the upload process is complete.