[Python] Python - Scipy Optimize And Return Value In Flask-Restful

Discussão em 'Python' iniciado por Stack, Julho 23, 2025.

  1. Stack

    Stack Membro Participativo

    I'm trying to build a REST API using Flask which returns value from Scipy's minimize function. I am able to get a result but I want to expose it in an API call and this code is erroring:

    import scipy.stats as sp
    from scipy.optimize import minimize
    from flask import Flask, g, Response
    from flask_restful import Resource, Api, reqparse
    import numpy as np

    app = Flask(__name__)

    api = Api(app)


    class Minimize(Resource):
    result = None

    def _calculate_probability(self, spread, std_dev):
    return sp.norm.sf(0.5, spread, scale=std_dev)

    def _calculate_mse(self, std_dev):
    spread_inputs = np.array(self.spreads)
    model_probabilities = self._calculate_probability(spread_inputs, std_dev)
    mse = np.sum((model_probabilities - self.expected_probabilities)**2) / len(spread_inputs)
    return mse

    def __init__(self, expected_probabilities, spreads, std_dev_guess):
    self.std_dev_guess = std_dev_guess
    self.spreads = spreads
    self.expected_probabilities = expected_probabilities

    def solve(self):
    self.result = minimize(self._calculate_mse, self.std_dev_guess, method='BFGS')

    def get(self):
    return {'data': self.result}, 200

    api.add_resource(Minimize, '/minimize')


    I'm able to print an answer to the console:

    spreads = [10.5, 9.5, 10, 8.5]
    expected_probabilities = [0.8091, 0.7785, 0.7708, 0.7692]
    minimizer = Minimize(expected_probabilities, spreads, 12.0)
    minimizer.solve()
    print(minimizer.get())


    I get this:

    probability-calculator_1 | ({'data': fun: 0.00018173060393236452
    probability-calculator_1 | hess_inv: array([[1381.37379663]])
    probability-calculator_1 | jac: array([-1.56055103e-06])
    probability-calculator_1 | message: 'Optimization terminated successfully.'
    probability-calculator_1 | nfev: 24
    probability-calculator_1 | nit: 3
    probability-calculator_1 | njev: 8
    probability-calculator_1 | status: 0
    probability-calculator_1 | success: True
    probability-calculator_1 | x: array([11.70822653])}, 200)


    But, when I do a GET request to localhost:5000/minimize, this is the error response:

    TypeError: __init__() missing 3 required positional arguments: 'expected_probabilities', 'spreads', and
    'std_dev_guess'


    How do I define the API call so it returns the printed answer?

    EDIT: So I have added another class to try and get a response to a POST request.

    class MinimisedError(Resource):

    def post(self):

    parser = reqparse.RequestParser()
    parser.add_argument('spread_inputs', action='append', required=True)
    parser.add_argument('expected_probabilities',
    action='append', required=True)
    parser.add_argument('std_dev', required=True)

    args = parser.parse_args()

    minimizer = Minimize(args.spread_inputs,
    args.expected_probabilities, float(args.std_dev))
    minimizer.solve()

    return {minimizer.get()}, 200

    api.add_resource(MinimisedError, '/minimize')


    When I try a POST with body

    {
    "expected_probabilities":[0.8091, 0.7785, 0.7708, 0.7692],
    "spread_inputs":[10.5, 9.5, 10, 8.5],
    "std_dev":12.0
    }


    I get this response:

    numpy.core._exceptions.UFuncTypeError: ufunc 'subtract' did not contain a loop with signature matching types (dtype('<U32'), dtype('<U32')) -> dtype('<U32')

    Continue reading...

Compartilhe esta Página