Tworzę sobie dla treningu prostą apkę webową w Javie (Spring Boot), która przyjmować ma dane finansowe wprowadzane przez wyimaginowane przedsiębiorstwa (zwykły formularz), potem przerabiać je na wskaźniki finansowe, dalej przesyłać je do serwisu napisanego w Pythonie, gdzie model regresji logistycznej ma oceniać to, czy dać kredyt, czy nie dać kredytu. Niestety już w trakcie odpytywania API przez Postmana pojawiają się u mnie problemy.

Poniżej kod tworzący model:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
from sklearn.externals import joblib


df = pd.read_csv('Indicators_Data.csv')
df = df.drop(columns = 'Id')
logReg = LogisticRegression()

X = df.iloc[:,0:4]
y = df.iloc[:,-1]


model = logReg.fit(X, y)
model_columns = list(X.columns)


joblib.dump(model_columns, 'PickledModelColumns.pkl')
joblib.dump(model, 'PickledModel.pkl')

Poniżej kod serwisu:

from flask import Flask, jsonify, request
import pandas as pd
from sklearn.externals import joblib


app = Flask(__name__)

@app.route('/predict', methods=['POST'])
def predict():
    json_ = request.json
    query = pd.DataFrame(json_)
    query = query.reindex(columns=model_columns)
    print(query)
    prediction = list(lr.predict(query))
    return jsonify({'prediction': str(prediction)})

port=33333   
lr = joblib.load("PickledModel.pkl")
model_columns = joblib.load("PickledModelColumns.pkl")
app.run(port=port, debug=True)

W odpowiedzi na zapytanie chciałbym otrzymać listę zawierającą zera i jedynki (dać kredyt czy nie) odpytując lokalny adres localhost:33333/predict przy pomocy metody POST.

Przykładowe zapytanie:

[
    {"CR" : 1, "CRFR" : 2", "DR" : 1, ROA" : 1},
    {"CR" : 1, "CRFR" : 2", "DR" : 1, ROA" : 1}
]

Niestety w czasie odpytania API Postmanem pojawia się u mnie błąd. Log dostępny pod linkiem poniżej, tutaj jeszcze główny pojawiający się error wrzucam w cytacie:

ValueError: Found array with 0 sample(s) (shape=(0, 4)) while a minimum of 1 is required.

Przykładowe dane do podglądu

Id CR ROA DR CRFR Default
0000001 1.168224299 0.309421478 0.09498829 0.753739019 0
0000002 1.936108422 0.311411939 0.554296875 1.466840949 0
0000003 2.06185567 0.48144933 0.70237581 1.252589278 1
0000004 2.176278564 0.467439709 0.535483871 1.490656801 0
0000005 1.901140684 0.4932112 0.626625387 0.86784981 1
0000006 2.083333333 0.441488442 0.578110384 1.501665 0
0000007 2.055498458 0.414311829 0.598285714 1.227867934 0
0000008 2.014098691 0.730232775 0.657542458 1.356928097 0
0000009 1.84501845 0.520918615 0.663868987 1.133868635 0
0000010 1.958863859 0.365323047 0.712052117 1.570091087 0

Podejrzewałem, że X i y nie są takiej samej długości, ale to nie o to chodzi. Prosta sprawa, ale i tak nie jestem w stanie namierzyć problemu. Ktoś jest w stanie pomóc? ;)