aboutsummaryrefslogtreecommitdiff
path: root/backend/microservice/api/controller.py
blob: 437690ee40cf2e70d29ae58a35e5bb93ef71955c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
from dataclasses import dataclass
from gc import callbacks
from xmlrpc.client import DateTime
import flask
from flask import request, jsonify
import newmlservice
import tensorflow as tf
import pandas as pd
import json
import requests
import config
from datetime import datetime 

app = flask.Flask(__name__)
app.config["DEBUG"] = True
app.config["SERVER_NAME"] = config.hostIP

@dataclass
class Predictor:
    _id : str
    username: str
    inputs : list
    output : str
    isPublic: bool
    accessibleByLink: bool
    dateCreated: DateTime
    experimentId: str
    modelId: str
    h5FileId: str
    metrics: list


class train_callback(tf.keras.callbacks.Callback):
    def __init__(self, x_test, y_test):
        self.x_test = x_test
        self.y_test = y_test
    #
    def on_epoch_end(self, epoch, logs=None):
        print(epoch)
        #ml_socket.send(epoch)
        #file = request.files.get("file")
        url = config.api_url + "/Model/epoch"
        requests.post(url, epoch).text
        #print('Evaluation: ', self.model.evaluate(self.x_test,self.y_test),"\n") #broj parametara zavisi od izabranih metrika loss je default

@app.route('/train', methods = ['POST'])
def train():
    print("******************************TRAIN*************************************************")
    
    f = request.files.get("file")
    data = pd.read_csv(f)
    paramsModel = json.loads(request.form["model"])
    paramsExperiment = json.loads(request.form["experiment"])
    paramsDataset = json.loads(request.form["dataset"])
    #dataset, paramsModel, paramsExperiment, callback)
    filepath,result = newmlservice.train(data, paramsModel, paramsExperiment,paramsDataset, train_callback)
    """
    f = request.json['filepath']
    dataset = pd.read_csv(f)
    filepath,result=newmlservice.train(dataset,request.json['model'],train_callback)
    print(result)
    """

    url = config.api_url + "/file/h5"
    files = {'file': open(filepath, 'rb')}
    r=requests.post(url, files=files)
    fileId=r.text
    predictor = Predictor(
        _id = "",
        username = paramsModel["username"],
        inputs = paramsExperiment["inputColumns"],
        output = paramsExperiment["outputColumn"],
        isPublic = False,
        accessibleByLink = False,
        dateCreated = datetime.now(),
        experimentId = paramsExperiment["_id"],
        modelId = paramsModel["_id"],
        h5FileId = fileId,
        metrics=[]
    )

    print(result)
    print(predictor)
    return jsonify(result)

@app.route('/predict', methods = ['POST'])
def predict():
    h5 = request.files.get("h5file")
    model = tf.keras.models.load_model(h5)
    paramsExperiment = json.loads(request.form["experiment"])
    paramsPredictor = json.loads(request.form["predictor"])
    print("********************************model loaded*******************************")
    result = newmlservice.predict(paramsExperiment, paramsPredictor, model)
    return result

@app.route('/preprocess',methods=['POST'])
def returnColumnsInfo():
    print("********************************PREPROCESS*******************************")
    dataset = json.loads(request.form["dataset"])
    file = request.files.get("file")
    data=pd.read_csv(file)
    
    #dataset={}
    #f = request.json['filepath']
    #data=pd.read_csv(f)

    preprocess = newmlservice.returnColumnsInfo(data)
    #samo 10 jedinstvenih posto ih ima previse, bilo bi dobro da promenimo ovo da to budu 10 najzastupljenijih vrednosti
    for col in preprocess["columnInfo"]:
        col["uniqueValues"] = col["uniqueValues"][0:10]
        col["uniqueValuesCount"] = col["uniqueValuesCount"][0:10]
    dataset["columnInfo"] = preprocess["columnInfo"]
    dataset["nullCols"] = preprocess["allNullColl"]
    dataset["nullRows"] = preprocess["allNullRows"]
    dataset["colCount"] = preprocess["colCount"]
    dataset["rowCount"] = preprocess["rowCount"]
    dataset["isPreProcess"] = True
    print(dataset)
    return jsonify(dataset)
    
print("App loaded.")
app.run()