chore: bump version to 1.0.16
This commit is contained in:
parent
f0a5c3dc13
commit
88cd2d9fd1
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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']
|
||||||
|
|||||||
2
setup.py
2
setup.py
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user