Skip to content

Commit 82a1832

Browse files
committed
wip
1 parent 9cd3a6b commit 82a1832

File tree

2 files changed

+98
-2
lines changed

2 files changed

+98
-2
lines changed

src/sasctl/tasks.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ def register_model(model, name, project, repository=None, input=None,
101101
Version number of the project in which the model should be created.
102102
Defaults to 'new'.
103103
files : list
104+
A list of dictionaries of the form {'name': filename, 'file': filecontent}.
105+
An optional 'role' key is supported for designating a file as score code,
106+
astore, etc.
104107
force : bool, optional
105108
Create dependencies such as projects and repositories if they do not
106109
already exist.
@@ -125,8 +128,6 @@ def register_model(model, name, project, repository=None, input=None,
125128
126129
"""
127130
# TODO: Create new version if model already exists
128-
# TODO: Allow file info to be specified
129-
# TODO: Performance stats
130131

131132
# If version not specified, default to creating a new version
132133
version = version or 'new'
@@ -269,6 +270,30 @@ def get_version(x):
269270
vars = model.get('inputVariables', [])[:]
270271
vars += model.get('outputVariables', [])
271272

273+
# Project Functions:
274+
# Analytical
275+
# Classification
276+
# Clustering
277+
# Forecasting
278+
# Prediction
279+
# Text Analytics
280+
# Transformation
281+
282+
# Target Levels:
283+
# Binary
284+
# Nominal
285+
# Ordinal
286+
# Interval
287+
288+
# project = mr.get_project(model.projectId)
289+
# # Update project properties
290+
# project['function'] = 'prediction'
291+
# project['targetLevel'] = 'interval'
292+
# project['targetVariable'] = 'Price'
293+
# project['predictionVariable'] = 'var1'
294+
# project = mr.update_project(project)
295+
296+
272297
if model.get('function') == 'Regression':
273298
target_level = 'Interval'
274299
else:
@@ -439,6 +464,8 @@ def update_performance(data, model, label, refresh=True):
439464
--------
440465
:meth:`model_management.create_performance_definition <.ModelManagement.create_performance_definition>`
441466
467+
.. versionadded:: v1.3
468+
442469
"""
443470
from .services import model_management as mm
444471
try:

src/sasctl/utils/astore.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,75 @@ def create_package_from_astore(table):
160160
return zip_file
161161

162162

163+
164+
def _create_files_from_astore(table):
165+
"""Generate files for
166+
167+
Parameters
168+
----------
169+
table
170+
171+
Returns
172+
-------
173+
174+
"""
175+
if swat is None:
176+
raise RuntimeError("The 'swat' package is required to work with "
177+
"ASTORE models.")
178+
179+
assert isinstance(table, swat.CASTable)
180+
181+
sess = table.session.get_connection()
182+
sess.loadactionset('astore')
183+
184+
result = sess.astore.describe(rstore=table, epcode=True)
185+
astore = sess.astore.download(rstore=table)
186+
if not hasattr(astore, "blob"):
187+
raise ValueError("Failed to download binary data for ASTORE '%s'."
188+
% astore)
189+
astore = astore.blob
190+
191+
astore = bytes(astore) # Convert from SWAT blob type
192+
193+
# Raise error if describe action fails
194+
if result.status_code != 0:
195+
raise RuntimeError(result)
196+
197+
astore_key = result.Key.Key[0].strip()
198+
ep_ds2 = result.epcode
199+
package_ds2 = _generate_package_code(result)
200+
model_properties = _get_model_properties(result)
201+
input_vars = [get_variable_properties(var)
202+
for var in result.InputVariables.itertuples()]
203+
output_vars = [get_variable_properties(var)
204+
for var in result.OutputVariables.itertuples()]
205+
astore_filename = '_' + uuid.uuid4().hex[:25].upper()
206+
207+
# Copy the ASTORE table to the ModelStore.
208+
# Raise an error if the action fails
209+
with swat.options(exception_on_severity=2):
210+
table.save(name=astore_filename, caslib='ModelStore', replace=True)
211+
212+
file_metadata = [{'role': 'analyticStore', 'name': ''},
213+
{'role': 'score', 'name': 'dmcas_packagescorecode.sas'}]
214+
215+
astore_metadata = [{'name': astore_filename,
216+
'caslib': 'ModelStore',
217+
'uri': '/dataTables/dataSources/cas~fs~cas-shared-default~fs~ModelStore/tables/{}'.format(astore_filename),
218+
'key': astore_key}]
219+
220+
return {
221+
'dmcas_packagescorecode.sas': '\n'.join(package_ds2),
222+
'dmcas_epscorecode.sas': ep_ds2,
223+
astore_filename: astore,
224+
'ModelProperties.json': model_properties,
225+
'fileMetadata.json': file_metadata,
226+
'AstoreMetadata.json': astore_metadata,
227+
'inputVar.json': input_vars,
228+
'outputVar.json': output_vars
229+
}
230+
231+
163232
def _build_zip_from_files(files):
164233
"""Create a ZIP file containing the provided files.
165234

0 commit comments

Comments
 (0)