chore: bump version to 1.0.15

This commit is contained in:
Jason Jafari 2024-06-15 20:17:21 -04:00
parent 825cf18e99
commit f0a5c3dc13
4 changed files with 134 additions and 74 deletions

View File

@ -77,6 +77,18 @@ 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):
files = os.listdir(self.modelsFolder)
pickelsList = [file for file in files if file.endswith('.pkl')]
return pickelsList
def listOfModels(self):
pickelsList = self.listOfPickels()
modelsList = []
for pickekFileName in pickelsList:
modelsList.append(pickekFileName.split(".pkl")[0])
return modelsList
def showSupportedModels(self): def showSupportedModels(self):
@ -102,3 +114,5 @@ class MlModelSaver:
loaded_model = pickle.load(open(filename, 'rb')) loaded_model = pickle.load(open(filename, 'rb'))
self.cachedModels[loaded_model.mlModelSaverConfig.get("modelName")] = loaded_model self.cachedModels[loaded_model.mlModelSaverConfig.get("modelName")] = loaded_model
return loaded_model return loaded_model

View File

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