File size: 3,822 Bytes
dd8bf84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
from fastapi import FastAPI
import pickle, uvicorn, os
from pydantic import BaseModel
import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.compose import make_column_selector as selector
from sklearn.metrics import accuracy_score

# Config & Setup
## Variables of environment
DIRPATH = os.path.dirname(__file__)
ASSETSDIRPATH = os.path.join(DIRPATH, "asset")
ml_component_pkl = os.path.join(ASSETSDIRPATH, "ml_component.pkl")

print(
    f" {'*'*10} Config {'*'*10}\n INFO: DIRPATH = {DIRPATH} \n INFO: ASSETSDIRPATH = {ASSETSDIRPATH} "
)


# API Basic config
app = FastAPI(
    title="Titanic Survivors API",
    version="0.0.1",
    description="Prediction of Titanic Survivors",
)

## Loading of assets
with open(ml_component_pkl, "rb") as f:
    loaded_items = pickle.load(f)
#print("INFO:    Loaded assets:", loaded_items)

pipeline_of_my_model = loaded_items["pipeline"]
num_cols = loaded_items['numeric_columns']
cat_cols = loaded_items['categorical_columns']

## BaseModel
class ModelInput(BaseModel):
    PeopleInTicket: int
    Age: float
    FarePerPerson: float
    SibSp: int
    Pclass: int
    Fare: float
    Parch: int
    TicketNumber: float
    Embarked: str
    Sex: str

## Utils
# def processing_FE(
#     dataset, scaler, encoder,imputer, FE=pipeline_of_my_model
# ):  # FE : ColumnTransfromer, Pipeline
#     "Cleaning, Processing and Feature Engineering of the input dataset."
#     """:dataset pandas.DataFrame"""

#     # if imputer is not None:
#     #     output_dataset = imputer.transform(dataset)
#     # else:
#     #     output_dataset = dataset.copy()

#     # output_dataset = scaler.transform(output_dataset)

#     # if encoder is not None:
#     #     output_dataset = encoder.transform(output_dataset)
#     if FE is not None:
#         output_dataset = FE.fit(output_dataset)

#     return output_dataset



def make_prediction(
     Pclass, Sex, Age, SibSp,Parch, Fare, Embarked, PeopleInTicket, FarePerPerson,TicketNumber
    
):

    df = pd.DataFrame(
        [
            [
                PeopleInTicket,
                Age,
                FarePerPerson,
                SibSp,
                Pclass,
                Fare,
                Parch,
                TicketNumber,
                Embarked,
                Sex,
                
            ]
        ],
        columns=num_cols + cat_cols,
        
    )
    print(num_cols + cat_cols)
    print( [
                PeopleInTicket,
                Age,
                FarePerPerson,
                SibSp,
                Pclass,
                Fare,
                Parch,
                TicketNumber,
                Embarked,
                Sex,
                
            ])
        
    X = df
    #df[cat_cols] = df[cat_cols].astype("object")
    output = pipeline_of_my_model.predict(X).tolist()
    return output
   
   


## Endpoints
@app.post("/Titanic")
async def predict(input: ModelInput):
    """__descr__
    --details---
    """
    output_pred = make_prediction(
        PeopleInTicket =input.PeopleInTicket,
        Age =input.Age,
        FarePerPerson =input.FarePerPerson,
        SibSp =input.SibSp,
        Pclass =input.Pclass,
        Fare =input.Fare,
        Parch =input.Parch,
        TicketNumber =input.TicketNumber,
        Embarked =input.Embarked,
        Sex=input.Sex,
    )
     # Labelling Model output
    if output_pred == 0:
        output_pred = "No,the person didn't survive"
    else:
        output_pred = "Yes,the person survived"
    #return output_pred
    return {
        "prediction": output_pred,
        "input": input
    }


# Execution

if __name__ == "__main__":
    uvicorn.run(
        "main:app",
        reload=True,
    )