chore: bump version to 1.0.16

This commit is contained in:
Jason Jafari 2024-06-15 20:18:58 -04:00
parent f0a5c3dc13
commit 88cd2d9fd1
4 changed files with 93 additions and 129 deletions

View File

@ -77,16 +77,16 @@ class MlModelSaver:
self.modelsFolder = f'{self.baseRelativePath}/{config.get('modelsFolder', '~~modelsFolder')}' self.modelsFolder = f'{self.baseRelativePath}/{config.get('modelsFolder', '~~modelsFolder')}'
ensure_directory_exists(self.modelsFolder) ensure_directory_exists(self.modelsFolder)
def listOfPickels(self): def listOfPickles(self):
files = os.listdir(self.modelsFolder) files = os.listdir(self.modelsFolder)
pickelsList = [file for file in files if file.endswith('.pkl')] picklesList = [file for file in files if file.endswith('.pkl')]
return pickelsList return picklesList
def listOfModels(self): def listOfModels(self):
pickelsList = self.listOfPickels() picklesList = self.listOfPickles()
modelsList = [] modelsList = []
for pickekFileName in pickelsList: for pickleFileName in picklesList:
modelsList.append(pickekFileName.split(".pkl")[0]) modelsList.append(pickleFileName.split(".pkl")[0])
return modelsList return modelsList
@ -95,6 +95,12 @@ class MlModelSaver:
supported_keys = [key for key, value in supportedModels.items() if value.get('supported')] supported_keys = [key for key, value in supportedModels.items() if value.get('supported')]
return supported_keys return supported_keys
def loadModelByName(self, modelName):
filename = f'{self.modelsFolder}/{modelName}.pkl'
loaded_model = pickle.load(open(filename, 'rb'))
self.cachedModels[loaded_model.mlModelSaverConfig.get("modelName")] = loaded_model
return loaded_model
def exportModel(self, model, config): def exportModel(self, model, config):
transformer = config.get("transformer", default_transformer) transformer = config.get("transformer", default_transformer)
model.mlModelSaverTransformer = transformer model.mlModelSaverTransformer = transformer
@ -111,8 +117,12 @@ class MlModelSaver:
model.mlModelSavePredict = partial(mlModelSavePredict, model) model.mlModelSavePredict = partial(mlModelSavePredict, model)
filename = f'{self.modelsFolder}/{modelName}.pkl' filename = f'{self.modelsFolder}/{modelName}.pkl'
pickle.dump(model, open(filename, 'wb')) pickle.dump(model, open(filename, 'wb'))
loaded_model = pickle.load(open(filename, 'rb')) return self.loadModelByName(modelName)
self.cachedModels[loaded_model.mlModelSaverConfig.get("modelName")] = loaded_model
return loaded_model def getModel(self, modelName):
model = self.cachedModels.get(modelName, None)
if model != None:
return model
return self.loadModelByName(modelName)

View File

@ -1,6 +1,6 @@
{ {
"name": "mlModelSaver", "name": "mlModelSaver",
"version": "1.0.15", "version": "1.0.16",
"description": "Make life easier for save and serving ml models", "description": "Make life easier for save and serving ml models",
"main": "index.js", "main": "index.js",
"repository": "git@github.com:smartdev-ca/mlModelSaver.git", "repository": "git@github.com:smartdev-ca/mlModelSaver.git",

View File

@ -1,128 +1,82 @@
import pickle # test_mlModelSaver.py
import json
import sys
import os import os
from functools import partial sys.path.insert(
0,
def ensure_directory_exists(directory_path): os.path.abspath(
""" os.path.join(
Ensure that the specified directory exists. If it doesn't, create it. os.path.dirname(__file__),
'..'
Parameters: )
directory_path (str): The path of the directory to ensure exists. )
""" )
os.makedirs(directory_path, exist_ok=True)
def check_file_exists(file_path): def test_ensureCLassInstance():
""" from mlModelSaver import MlModelSaver
Check if the specified file exists. mlModelSaverInstance1 = MlModelSaver({
"baseRelativePath": "test_baseRelativePath",
Parameters: "modelsFolder": "test_modelsFolder"
file_path (str): The path of the file to check.
Returns:
bool: True if the file exists, False otherwise.
"""
if os.path.isfile(file_path):
print(f"File '{file_path}' exists.")
return True
else:
print(f"File '{file_path}' does not exist.")
return False
supportedModels = {
"sm.OLS": {
"supported": True
}
}
supportedDataType = {
"int": {
"supported": True
},
"float": {
"supported": True
},
"binary":{
"supported": True
}
}
def default_transformer(x):
return x
def mlModelSavePredict(self, df, typeOfPredict = 'normal'):
dfAfterTransformation = self.mlModelSaverTransformer(df)
output = []
outputsName = self.mlModelSaverConfig.get("outputs", [{"name": "result"}])
outputsName = [item["name"] for item in outputsName]
if typeOfPredict == 'normal':
results = self.predict(dfAfterTransformation)
for value in results:
output.append({
outputsName[0]: value,
}) })
return output assert mlModelSaverInstance1.baseRelativePath == "test_baseRelativePath"
assert mlModelSaverInstance1.modelsFolder == "test_baseRelativePath/test_modelsFolder"
tesSupportedModels = mlModelSaverInstance1.showSupportedModels()
assert tesSupportedModels == ['sm.OLS']
class MlModelSaver:
cachedModels = {} def test_OLS_LinearRegression():
from mlModelSaver import MlModelSaver
def __init__(self, config): import numpy as np
self.baseRelativePath = config.get('baseRelativePath', '.') import pandas as pd
self.modelsFolder = f'{self.baseRelativePath}/{config.get('modelsFolder', '~~modelsFolder')}' import statsmodels.api as sm
ensure_directory_exists(self.modelsFolder) from helpers import add_constant_column
salaryMisDf = pd.read_excel("./datasets/Salary_MIS.xlsx")
def listOfPickles(self): salaryBasedOnGpaMisStatistics = sm.OLS(
files = os.listdir(self.modelsFolder) salaryMisDf["Salary"],
picklesList = [file for file in files if file.endswith('.pkl')] add_constant_column(salaryMisDf[["GPA", "MIS", "Statistics"]])
return picklesList )
salaryBasedOnGpaMisStatisticsFit = salaryBasedOnGpaMisStatistics.fit()
def listOfModels(self): mlModelSaverInstance2 = MlModelSaver({
picklesList = self.listOfPickles() "baseRelativePath": ".",
modelsList = [] "modelsFolder": "~~tmp/testModels"
for pickleFileName in picklesList: })
modelsList.append(pickleFileName.split(".pkl")[0])
return modelsList
def showSupportedModels(self): loadedModel = mlModelSaverInstance2.exportModel(
supported_keys = [key for key, value in supportedModels.items() if value.get('supported')] salaryBasedOnGpaMisStatisticsFit,
return supported_keys {
"modelName": "salaryBasedOnGpaMisStatistics",
def loadModelByName(self, modelName): "description": "Predict Salary based on GPA MIS Statistics for salaryMisDf",
filename = f'{self.modelsFolder}/{modelName}.pkl' "modelType": "sm.OLS",
loaded_model = pickle.load(open(filename, 'rb')) "inputs": [
self.cachedModels[loaded_model.mlModelSaverConfig.get("modelName")] = loaded_model {
return loaded_model "name": "GPA",
"type": "float",
def exportModel(self, model, config): },
transformer = config.get("transformer", default_transformer) {
model.mlModelSaverTransformer = transformer "name": "MIS",
if "transformer" in config: "type": "binary"
del config["transformer"] },
model.mlModelSaverConfig = config {
isModelSupporter = supportedModels.get( "name": "Statistics",
config.get("modelType", ''), "type": "binary"
{} }
).get("supported", False) ],
if not isModelSupporter: "transformer": add_constant_column,
raise ValueError(f'only {self.showSupportedModels()} are supported and {config.get("modelType", '')} is not supported') "outputs": [
modelName = model.mlModelSaverConfig['modelName'] {
model.mlModelSavePredict = partial(mlModelSavePredict, model) "name": "Salary",
filename = f'{self.modelsFolder}/{modelName}.pkl' "type": "int"
pickle.dump(model, open(filename, 'wb')) }
return self.loadModelByName(modelName) ]
}
def getModel(self, modelName): )
model = self.cachedModels.get(modelName, None) from mlModelSaver import check_file_exists
if model != None: assert check_file_exists("./~~tmp/testModels/salaryBasedOnGpaMisStatistics.pkl") == True
return model testData = salaryMisDf[["GPA", "MIS", "Statistics"]].iloc[0:2]
return self.loadModelByName(modelName) predictedValueWithLoadedModel = loadedModel.mlModelSavePredict(testData, 'normal')
assert predictedValueWithLoadedModel == [{'Salary': 73.9924679451542}, {'Salary': 69.55525482441558}]
assert list(mlModelSaverInstance2.cachedModels.keys()) == ['salaryBasedOnGpaMisStatistics']

View File

@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup( setup(
name='mlModelSaver', name='mlModelSaver',
version='1.0.15', version='1.0.16',
packages=find_packages(), packages=find_packages(),
description='Make life easier for saving and serving ML models', description='Make life easier for saving and serving ML models',
long_description=open('DOCS.md').read(), # Assumes you have a README.md file long_description=open('DOCS.md').read(), # Assumes you have a README.md file