From a87ac0df40f60f71fd0daa430d669f8a8aec107d Mon Sep 17 00:00:00 2001 From: Jason Jafari Date: Fri, 14 Jun 2024 01:48:32 -0400 Subject: [PATCH] chore: bump version to 1.0.11 --- .gitignore | 4 +- .vscode/settings.json | 3 +- datasets/Salary_MIS.xlsx | Bin 0 -> 12318 bytes mlModelSaver/__init__.py | 2 + mlModelSaver/mlModelSaver.py | 69 +++++++++++++++++++++++++++++++- package.json | 2 +- pytests/test_mlModelSaver.py | 73 ++++++++++++++++++++++++++++++++++ releaseNewVersionAndAddTag.sh | 2 + requirements.txt | 17 ++++++++ setup.py | 2 +- 10 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 datasets/Salary_MIS.xlsx create mode 100644 pytests/test_mlModelSaver.py diff --git a/.gitignore b/.gitignore index 4e2a953..298ccf1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ __pycache__ dist/ build/ -node_modules \ No newline at end of file +node_modules + +~~ diff --git a/.vscode/settings.json b/.vscode/settings.json index fd1a328..16567b2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "cSpell.words": [ - "Jafari" + "Jafari", + "statsmodels" ] } \ No newline at end of file diff --git a/datasets/Salary_MIS.xlsx b/datasets/Salary_MIS.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0b2c584bf5912cde7974a5b99e496812a6c49105 GIT binary patch literal 12318 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όYXN2>_*x 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 literal 0 HcmV?d00001 diff --git a/mlModelSaver/__init__.py b/mlModelSaver/__init__.py index e69de29..7ab76cb 100644 --- a/mlModelSaver/__init__.py +++ b/mlModelSaver/__init__.py @@ -0,0 +1,2 @@ +from mlModelSaver.mlModelSaver import MlModelSaver + diff --git a/mlModelSaver/mlModelSaver.py b/mlModelSaver/mlModelSaver.py index f90b91d..fd455ee 100644 --- a/mlModelSaver/mlModelSaver.py +++ b/mlModelSaver/mlModelSaver.py @@ -1,2 +1,67 @@ -def mlModelSaver(): - print("mlModelSaver") \ No newline at end of file +import pickle +import json + +supportedModels = { + "sm.OLS": { + "supported": True + } +} + +supportedDataType = { + "int": { + "supported": True + }, + "float": { + "supported": True + }, + "binary":{ + "supported": True + } +} + +class MlModelSaver: + + def __init__(self, config): + self.baseRelativePath = config.get('baseRelativePath', '.') + self.modelsFolder = config.get('modelsFolder', '~~modelsFolder') + + def showSupportedModels(self): + supported_keys = [key for key, value in supportedModels.items() if value.get('supported')] + return supported_keys + + def exportModel(self, model, config): + model.mlModelSaverConfig = config + isModelSupporter = supportedModels.get( + config.get("modelType", ''), + {} + ).get("supported", False) + if not isModelSupporter: + raise ValueError(f'only {self.showSupportedModels()} are supported and {config.get("modelType", '')} is not supported') + print(model.mlModelSaverConfig) + # modelName = config['modelName'] + # modelsConfig[modelName] = {} + # modelsConfig[modelName]['name'] = modelName + # model = config['model'] + # inputs = config['inputs'] + # output = config['output'] + # transformers = config.get('transformers', []) + # description = config['description'] + # modelsConfig[modelName]['description'] = description + # modelsConfig[modelName]['inputs'] = inputs + # if len(transformers) > 0: + # modelsConfig[modelName]['transformers'] = transformers + # modelsConfig[modelName]['output'] = output + # modelType = config.get('modelType', '') + # modelsConfig[modelName]['modelType'] = modelType + # if hasattr(model, 'customMetrics'): + # customMetrics = model.customMetrics + # modelsConfig[modelName]['customMetrics'] = customMetrics + # else: + # pass + # filename = f'{baseRelativePath}/models/{modelName}' + # pickle.dump(model, open(filename, 'wb')) + # with open(f'{baseRelativePath}/models/configs.json', "w") as outputFile: + # json.dump(modelsConfig, outputFile, indent = 4) + + # loaded_model = pickle.load(open(filename, 'rb')) + # return loaded_model \ No newline at end of file diff --git a/package.json b/package.json index 519d5df..b44d4e4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mlModelSaver", - "version": "1.0.10", + "version": "1.0.11", "description": "Make life easier for save and serving ml models", "main": "index.js", "repository": "git@github.com:smartdev-ca/mlModelSaver.git", diff --git a/pytests/test_mlModelSaver.py b/pytests/test_mlModelSaver.py new file mode 100644 index 0000000..8493047 --- /dev/null +++ b/pytests/test_mlModelSaver.py @@ -0,0 +1,73 @@ +# test_mlModelSaver.py + +import sys +import os + +sys.path.insert( + 0, + os.path.abspath( + os.path.join( + os.path.dirname(__file__), + '../mlModelSaver' + ) + ) +) + + +def test_ensureCLassInstance(): + from mlModelSaver import MlModelSaver + mlModelSaverInstance1 = MlModelSaver({ + "baseRelativePath": "test_baseRelativePath", + "modelsFolder": "test_modelsFolder" + }) + assert mlModelSaverInstance1.baseRelativePath == "test_baseRelativePath" + assert mlModelSaverInstance1.modelsFolder == "test_modelsFolder" + tesSupportedModels = mlModelSaverInstance1.showSupportedModels() + assert tesSupportedModels == ['sm.OLS'] + + +def test_OLS_LinearRegression(): + from mlModelSaver import MlModelSaver + import numpy as np + import pandas as pd + import statsmodels.api as sm + salaryMisDf = pd.read_excel("./datasets/Salary_MIS.xlsx") + salaryBasedOnGpaMisStatistics = sm.OLS( + salaryMisDf["Salary"], + sm.add_constant(salaryMisDf[["GPA", "MIS", "Statistics"]]) + ) + salaryBasedOnGpaMisStatisticsFit = salaryBasedOnGpaMisStatistics.fit() + mlModelSaverInstance2 = MlModelSaver({ + "baseRelativePath": ".", + "modelsFolder": "~~tmp/models" + }) + + mlModelSaverInstance2.exportModel( + salaryBasedOnGpaMisStatisticsFit, + { + "modelName": "salaryBasedOnGpaMisStatisticsFit", + "description": "Predict Salary based on GPA MIS Statistics for sallaryMisDf", + "modelType": "sm.OLS", + "inputs": [ + { + "name": "GPA", + "type": "float", + }, + { + "name": "MIS", + "type": "binary" + }, + { + "name": "Statistics", + "type": "binary" + } + ], + "output": [ + { + "name": "Salary", + "type": "int" + } + ] + } + ) + assert 2 == 2 diff --git a/releaseNewVersionAndAddTag.sh b/releaseNewVersionAndAddTag.sh index 525d66c..cdf3b9b 100755 --- a/releaseNewVersionAndAddTag.sh +++ b/releaseNewVersionAndAddTag.sh @@ -8,6 +8,8 @@ new_version=$(node -p "require('./package.json').version") rm -rf build rm -rf dist +pytest -s -v + python setup.py sdist bdist_wheel twine upload dist/* diff --git a/requirements.txt b/requirements.txt index 1a876e6..43ec90f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,11 @@ +autopep8==2.2.0 certifi==2024.6.2 charset-normalizer==3.3.2 docutils==0.21.2 +et-xmlfile==1.1.0 idna==3.7 importlib_metadata==7.1.0 +iniconfig==2.0.0 jaraco.classes==3.4.0 jaraco.context==5.3.0 jaraco.functools==4.0.1 @@ -11,15 +14,29 @@ markdown-it-py==3.0.0 mdurl==0.1.2 more-itertools==10.3.0 nh3==0.2.17 +numpy==1.26.4 +openpyxl==3.1.4 +packaging==24.1 +pandas==2.2.2 +patsy==0.5.6 pkginfo==1.11.1 +pluggy==1.5.0 +pycodestyle==2.11.1 Pygments==2.18.0 +pytest==8.2.2 +python-dateutil==2.9.0.post0 +pytz==2024.1 readme_renderer==43.0 requests==2.32.3 requests-toolbelt==1.0.0 rfc3986==2.0.0 rich==13.7.1 +scipy==1.13.1 setuptools==70.0.0 +six==1.16.0 +statsmodels==0.14.2 twine==5.1.0 +tzdata==2024.1 urllib3==2.2.1 wheel==0.43.0 zipp==3.19.2 diff --git a/setup.py b/setup.py index 830d633..8f0396d 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name='mlModelSaver', - version='1.0.10', + version='1.0.11', packages=find_packages(), description='Make life easier for saving and serving ML models', long_description=open('DOCS.md').read(), # Assumes you have a README.md file