ag added service API using docker and fastAPI

This commit is contained in:
2024-03-20 16:30:30 +01:00
parent 759f4c50d0
commit 08c5f672be
16 changed files with 3450 additions and 264 deletions

0
service/app/__init__.py Normal file
View File

27
service/app/main.py Normal file
View File

@@ -0,0 +1,27 @@
from typing import Union
from .predict import predict
from fastapi import FastAPI
import numpy as np
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/predict/{data}")
def read_item(data: str):
final_json = {'probabilities':{}}
try:
res = predict(data)
for i in range(5):
final_json['probabilities'][f"india_{i}"] = round(float(res[i]),2)
final_json['success'] = True
except Exception as e:
final_json['success'] = False
final_json['error'] = repr(e)
return final_json

BIN
service/app/metadata.pkl Normal file

Binary file not shown.

1
service/app/model.json Normal file

File diff suppressed because one or more lines are too long

60
service/app/predict.py Normal file
View File

@@ -0,0 +1,60 @@
import json
import xgboost as xgb
import pickle
import pandas as pd
import numpy as np
def predict(json_input:str):
with open('app/metadata.pkl','rb') as f:
to_remove,use_small,evacuations,encoders = pickle.load(f)
data = pd.DataFrame(json.loads(json_input[1:-1]),index=[0])
data.drop(columns=['dateandtime','skiarea_id','day_of_year','minute_of_day','year'], inplace=True, errors='ignore')
##evacuation_vehicles must be explicitated and workaround for other!
evacuation = data.evacuation_vehicles.values[0]
if isinstance(evacuation,str):
evacuation = [evacuation]
for c in evacuations:
data[c] = False
for c in evacuation:
data[c] = True
for c in evacuation:
if c not in evacuations:
data['other'] = True
break
data.drop(columns=['town','province','evacuation_vehicles'],inplace=True, errors='ignore')
data['age'] = data['age'].astype(np.float32)
for c in data.columns:
if c not in ['india','age','season','skiarea_name','destination']:
data[c] = data[c].astype('str')
if use_small:
for c in to_remove.keys():
for k in to_remove[c]:
data.loc[data[c]==k,c] = 'other'
for c in data.columns:
if c not in ['age','season','skiarea_name','india']:
data[c] = data[c].fillna('None')
if use_small:
data[c] = pd.Categorical( encoders['small'][c].transform(data[c]), categories=list(range(len(encoders['small'][c].classes_))), ordered=False)
else:
data[c] = pd.Categorical( encoders['normal'][c].transform(data[c]), categories=list(range(len(encoders['normal'][c].classes_))), ordered=False)
bst_FS = xgb.Booster()
bst_FS.load_model("app/model.json")
dtest_FS = xgb.DMatrix(data[bst_FS.feature_names],enable_categorical=True)
preds = bst_FS.predict(dtest_FS)
return preds[0]*100