-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathapp.py
More file actions
123 lines (109 loc) · 4.12 KB
/
app.py
File metadata and controls
123 lines (109 loc) · 4.12 KB
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
123
import numpy as np
import pandas as pd
import json
import datetime
from flask import Flask, \
render_template, \
request, \
jsonify
from flask_cors import CORS
from joblib import load
import category_encoders as ce
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
app = Flask(__name__)
CORS(app)
pipeline = load('assets/pipeline.joblib')
############################################################
# Predict with model
############################################################
def Predictor(list_values):
# take one row of feature values
columns = ['LATITUDE', 'LONGITUD', 'DAY', 'MONTH',
'YEAR', 'DAY_WEEK', 'HOUR', 'FUNC_SYS',
'RELJCT1', 'WEATHER', 'ROUTE', 'TWAY_ID',
'TWAY_ID2']
X = pd.DataFrame(list_values, columns=columns)
y = pipeline.predict(X)
# convert numpy arrapy to list
predictions = y.tolist()
return predictions
############################################################
# index page
############################################################
# @app.route('/')
# @app.route('/index')
# def index():
# return render_template('index.html')
############################################################
# result page
############################################################
# @app.route('/result', methods=['POST'])
# def result():
# if request.method == 'POST':
# data_in = request.form.to_dict()
# # CAUTION: It is not the same with form element sequence
# # list_values = list(list_values.values())
# # {'PetalWidthCm': '1.4', 'SepalWidthCm': '3.5',
# # 'SepalLengthCm': '7', 'PetalLengthCm': '4.7'}
# list_values = [data_in['SepalLengthCm'],
# data_in['SepalWidthCm'],
# data_in['PetalLengthCm'],
# data_in['PetalWidthCm']]
# # convert from text to float
# list_values = list(map(float, list_values))
# result = IrisPredictor(list_values)
# return render_template("result.html",
# prediction=result)
############################################################
# API
############################################################
@app.route("/api", methods=['POST'])
def api():
# get input data
data_in = request.get_json(force=True)
today = datetime.datetime.today()
try:
# parse JSON and transform values to list
# for prediction:
# LATITUDE, LONGITUD, DAY, MONTH, YEAR, DAY_WEEK, HOUR,
# FUNC_SYS, RELJCT1, WEATHER, ROUTE, TWAY_ID, TWAY_ID2,
# prediction output:
# (ACCIDENT) LIKELYHOOD
list_values, data_out = [], {}
for id, values in data_in.items():
record = [values['LATITUDE'],
values['LONGITUD'],
today.day, # DAY
today.month, # MONTH
today.year, # YEAR
today.weekday(), # DAY_WEEK
today.hour, # HOUR
values['FUNC_SYS'],
values['RELJCT1'],
'NaN', # WEATHER
'NaN', # ROUTE
values['TWAY_ID'],
values['TWAY_ID2'],
]
for i, r in enumerate(record):
if r=="" or r==None:
record[i] = 'NaN'
list_values.append(record)
data_out[id] = {
'LATITUDE': values['LATITUDE'],
'LONGITUD': values['LONGITUD'],
'LIKELIHOOD': 0
}
# get output data
preds = Predictor(list_values)
for values, pred in zip(data_out.values(), preds):
values['LIKELIHOOD'] = pred
return data_out
except:
return jsonify('Invalid parameters!')
if __name__ == '__main__':
app.run(port=5000, debug=True)