From ed8ee3077211cc227089f87929a70ac8b7c4593f Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Wed, 22 Dec 2021 09:29:11 +0300 Subject: Add API endpoint for partial correlations Issue: https://github.com/genenetwork/gn-gemtext-threads/blob/main/topics/gn1-migration-to-gn2/partial-correlations.gmi * Add an API endpoint for the partial correlation. * gn3/api/correlation.py: --- gn3/api/correlation.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'gn3/api') diff --git a/gn3/api/correlation.py b/gn3/api/correlation.py index e936eaf..f84228a 100644 --- a/gn3/api/correlation.py +++ b/gn3/api/correlation.py @@ -1,4 +1,6 @@ """Endpoints for running correlations""" +import json + from flask import jsonify from flask import Blueprint from flask import request @@ -87,9 +89,20 @@ def compute_tissue_corr(corr_method="pearson"): @correlation.route("/partial", methods=["POST"]) def partial_correlation(): + """API endpoint for partial correlations.""" def trait_fullname(trait): return f"{trait['dataset']}::{trait['name']}" + class OutputEncoder(json.JSONEncoder): + """ + Class to encode output into JSON, for objects which the default + json.JSONEncoder class does not have default encoding for. + """ + def default(self, obj): + if isinstance(obj, bytes): + return str(obj, encoding="utf-8") + return json.JSONEncoder.default(self, obj) + args = request.get_json() conn, _cursor_object = database_connector() corr_results = partial_correlations_entry( -- cgit 1.4.1 From c813dd68230a027b1b5acdbe9d3dba46f6bd1ad0 Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Wed, 22 Dec 2021 09:22:49 +0300 Subject: Encode the data to JSON and set the status code Issue: https://github.com/genenetwork/gn-gemtext-threads/blob/main/topics/gn1-migration-to-gn2/partial-correlations.gmi * Encode bytes objects to string * Encode NaN values to "null" * gn3/api/correlation.py: --- gn3/api/correlation.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'gn3/api') diff --git a/gn3/api/correlation.py b/gn3/api/correlation.py index f84228a..c0b5806 100644 --- a/gn3/api/correlation.py +++ b/gn3/api/correlation.py @@ -1,9 +1,9 @@ """Endpoints for running correlations""" import json - from flask import jsonify from flask import Blueprint from flask import request +from flask import make_response from gn3.computations.correlations import compute_all_sample_correlation from gn3.computations.correlations import compute_all_lit_correlation @@ -109,6 +109,8 @@ def partial_correlation(): conn, trait_fullname(args["primary_trait"]), tuple(trait_fullname(trait) for trait in args["control_traits"]), args["method"], int(args["criteria"]), args["target_db"]) - return make_response( - jsonify(corr_results), - 400) + response = make_response( + json.dumps(corr_results, cls=OutputEncoder), + 400 if "error" in corr_results.keys() else 200) + response.headers["Content-Type"] = "application/json" + return response -- cgit 1.4.1 From ac8528c5847f4a517c16b5283c06d3caeae8ef5e Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Mon, 20 Dec 2021 07:19:16 +0300 Subject: Replace `NaN` with `null` in JSON string Issue: https://github.com/genenetwork/gn-gemtext-threads/blob/main/topics/gn1-migration-to-gn2/partial-correlations.gmi * `NaN` is not a valid JSON value, and leads to errors in the code. This commit replaces all `NaN` values with `null`. --- gn3/api/correlation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gn3/api') diff --git a/gn3/api/correlation.py b/gn3/api/correlation.py index c0b5806..1caf31f 100644 --- a/gn3/api/correlation.py +++ b/gn3/api/correlation.py @@ -110,7 +110,7 @@ def partial_correlation(): tuple(trait_fullname(trait) for trait in args["control_traits"]), args["method"], int(args["criteria"]), args["target_db"]) response = make_response( - json.dumps(corr_results, cls=OutputEncoder), + json.dumps(corr_results, cls=OutputEncoder).replace(": NaN", ": null"), 400 if "error" in corr_results.keys() else 200) response.headers["Content-Type"] = "application/json" return response -- cgit 1.4.1