Skip to content

Instantly share code, notes, and snippets.

View cosmic-cortex's full-sized avatar
😎

Tivadar Danka cosmic-cortex

😎
View GitHub Profile
@cosmic-cortex
cosmic-cortex / model_abstract.py
Created January 27, 2020 12:48
Abstract interface for the machine learning model
class Model:
def train(self, X, y):
pass
def predict(self, X):
pass
def save(self):
pass
@cosmic-cortex
cosmic-cortex / main_skeleton.py
Last active January 27, 2020 13:55
FastAPI application skeleton
from typing import List
from fastapi import FastAPI
from pydantic import BaseModel
class PredictRequest(BaseModel):
data: List[List[float]]
@cosmic-cortex
cosmic-cortex / model.py
Last active January 27, 2020 14:43
Implementation of the machine learning model for the API
import joblib
import numpy as np
from pathlib import Path
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_boston
class Model:
def __init__(self, model_path: str = None):
@cosmic-cortex
cosmic-cortex / predict_final.py
Last active January 27, 2020 15:37
predict endpoint
import numpy as np
from fastapi import Depends
from .ml.model import get_model
@app.post("/predict", response_model=PredictResponse)
def predict(input: PredictRequest, model: Model = Depends(get_model)):
X = np.array(input.data)
y_pred = model.predict(X)
@cosmic-cortex
cosmic-cortex / predictrequest_final.py
Created January 27, 2020 16:26
Additional validation for the PredictRequest model
from pydantic import BaseModel, ValidationError, validator
from .ml.model import n_features
class PredictRequest(BaseModel):
data: List[List[float]]
@validator("data")
def check_dimensionality(cls, v):
@cosmic-cortex
cosmic-cortex / mocks.py
Created January 27, 2020 17:27
Mock for unit testing the API
import numpy as np
class MockModel:
def __init__(self, model_path: str = None):
self._model_path = None
self._model = None
def predict(self, X: np.ndarray) -> np.ndarray:
n_instances = len(X)
@cosmic-cortex
cosmic-cortex / conftest.py
Created January 27, 2020 17:36
Configurations and fixtures for API testing
import pytest
from starlette.testclient import TestClient
from ..main import app
from ..ml.model import get_model
from .mocks import MockModel
def get_model_override():
@cosmic-cortex
cosmic-cortex / test_predict.py
Created January 27, 2020 18:00
Testing the API endpoint
import pytest
import random
from starlette.testclient import TestClient
from starlette.status import HTTP_200_OK
from api.ml.model import n_features
@pytest.mark.parametrize("n_instances", range(1, 10))
@cosmic-cortex
cosmic-cortex / test_predict_with_wrong_input.py
Created January 27, 2020 18:02
Testing the API endpoint with invalid user data
from itertools import product
from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
@pytest.mark.parametrize(
"n_instances, test_data_n_features",
product(range(1, 10), [n for n in range(1, 20) if n != n_features]),
)
def test_predict_with_wrong_input(
@cosmic-cortex
cosmic-cortex / predict_csv.py
Last active January 28, 2020 10:47
predict_csv endpoint
import pandas as pd
from fastapi import File, UploadFile, HTTPException
from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
@app.post("/predict_csv")
def predict_csv(csv_file: UploadFile = File(...), model: Model = Depends(get_model)):
try:
df = pd.read_csv(csv_file.file).astype(float)