Skip to content

Instantly share code, notes, and snippets.

@ano
Created April 2, 2023 01:24
Show Gist options
  • Save ano/0f329d52b2994e4b833d2034127169b4 to your computer and use it in GitHub Desktop.
Save ano/0f329d52b2994e4b833d2034127169b4 to your computer and use it in GitHub Desktop.
Gordon-Schaffer model as an API service

Sure, here's an example of a Python function that implements the Gordon-Schaffer model for sensitivity analysis and exposes it as a REST API using Flask:

from flask import Flask, jsonify, request
import numpy as np

app = Flask(__name__)

@app.route('/gordon-schaffer', methods=['POST'])
def gordon_schaffer_sensitivity():
    """
    Implementation of Gordon-Schaffer model for sensitivity analysis.
    
    Expects a JSON payload in the format:
    {
        "X": [[...], [...], ...],
        "y": [...]
    }
    
    Returns a JSON response in the format:
    {
        "sensitivities": [...]
    }
    """
    data = request.get_json()
    X, y = np.array(data['X']), np.array(data['y'])
    n_samples, n_features = X.shape
    y_hat = model.predict(X)  # Model's prediction on original input
    sensitivities = np.zeros(n_features)
    
    for i in range(n_features):
        X_perturbed = X.copy()  # Copy original input
        delta = np.max(X[:, i]) * 1e-6  # Small perturbation
        X_perturbed[:, i] += delta  # Add delta to the i-th feature
        y_perturbed = model.predict(X_perturbed)  # Model's prediction after perturbation
        sensitivities[i] = (y_perturbed - y_hat) / delta  # Sensitivity of i-th feature
    
    return jsonify({'sensitivities': sensitivities})

if __name__ == '__main__':
    # Load your regression model object here
    model = ...
    app.run(debug=True)

This code defines a Flask API that listens for POST requests on the /gordon-schaffer endpoint. The JSON payload is expected to contain an input matrix (X) and a target vector (y). The API then computes the sensitivities using the Gordon-Schaffer model and returns a JSON response containing the sensitivities.

Note that you will need to replace ... with the appropriate code to load your regression model object. You will also need to replace debug=True with host='0.0.0.0' and a suitable port number to make the API available externally.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment