# 新興MM
```python
import os
import sys
import configparser
from sasctl.services import model_repository as mr
from sasctl import Session
class SASModelManager():
def __init__(self, config_path=None, host='', username='', password='', ca_path=''):
if config_path:
config = configparser.ConfigParser()
config.read(config_path)
self.host = config['Session']['host']
self.username = config['Session']['username']
self.password = config['Session']['password']
else:
self.host = host
self.username = username
self.password = password
os.environ['CAS_CLIENT_SSL_CA_LIST'] = config['Env']['capath'] if config_path else ca_path
def check_repository(self, repo_name):
repo = mr.get_repository(repo_name)
# if not building repository yet, exit
if not repo:
print("You have not build this repository ({}) yet. Please go to MM then build {} repository.".format(repo_name, repo_name))
sys.exit(0)
return repo
def check_project(self, project_name, repo_name):
repo = self.check_repository(repo_name)
project_list = self.get_project_list()
if project_name in project_list:
print(f"{project_name} exists. Get the project.")
return mr.get_project(project_name)
print(f"{project_name} does not exist, creating the project")
return mr.create_project({'name': project_name}, repo)
def upload_model(self, repo_name, project_name, model_name, modeler, function, algorithm, tool, location, properties):
with Session(self.host, self.username, self.password):
project = self.check_project(project_name, repo_name)
model_list = self.get_model_list()
if model_name not in model_list:
mr.create_model(
model={'name': model_name},
project=project,
modeler=modeler,
function=function,
algorithm=algorithm,
tool=tool,
location=location,
properties=properties
)
else:
print(f"Model[{model_name}] exists, creating new version...")
model = mr.create_model_version(model_name)
model['modeler']=modeler
model['function']=function
model['algorithm']=algorithm
model['location']=location
for i in range(len(model['properties'])):
if model['properties'][i]['name'] in properties.keys():
model['properties'][i]['value']=properties[model['properties'][i]['name']]
mr.update_model(model)
def get_project_list(self):
return [p['name'] for p in mr.list_projects()]
def get_model_list(self):
return [m['name'] for m in mr.list_models()]
```
```
sasmm.upload_model(repo_name="Public",
project_name="Iris2",
model_name="Iris Regression",
modeler="Jason",
function="Classification",
algorithm="Logistic Regression",
tool="Python 3",
location="/jupyter_workspace/Unimicron/Jason/model_train.pt",
properties={'Accuracy': model.score(X_test, y_test)})
```
```
kubectl get pods | grep launcher
kubectl exec -it <launcher-pod> --bash
ls -l /nfsshare01/sas_data_access
```
```
import pymssql
import pandas as pd
import functools
def connect(factory):
if factory=="YM":
host='10.22.65.120'
db='dc'
user='dc'
pwd='dc'
elif factory=="SY":
host="10.30.40.110"
db="dc"
user="s3pc"
pwd="pc12345"
elif factory=="HF":
host="10.44.66.47"
db="SFIBDI"
user="sfibdi"
pwd="pc12345"
cnxn = pymssql.connect(
host=host,
user=user,
password=pwd,
database=db)
return cnxn
def check_lot(factory, cnxn, hours=24):
if factory=="YM":
sql = """
SELECT A.ProcCode, 'tot_cnt_{day}' as daycnt,COUNT(DISTINCT A.lotnum) as 'cnt'
FROM acme.dbo.pdl_ckhistory AS A(NOLOCK)
WHERE A.Line = 55
AND A.ProcCode in ('FVI06','AOI02')
AND A.AftStatus = 'CheckIn'
AND A.BefStatus <> 'CheckIn'
AND A.isCancel IS NULL
AND A.Changetime BETWEEN DATEADD(HOUR, -{hours}, GETDATE()) AND GETDATE()
GROUP BY A.ProcCode
""".format(day=int(hours/24),hours=hours)
elif factory =="SY":
sql = """
SELECT CASE WHEN A.Line=5 THEN 'S1'
WHEN A.Line=6 THEN 'S2'
WHEN A.Line=7 THEN 'S3'
WHEN A.Line=54 THEN 'S2A' END AS Factory,
A.ProcCode, 'tot_cnt_{day}' as daycnt,COUNT(DISTINCT A.lotnum) as 'cnt'
FROM acme.dbo.pdl_ckhistory AS A(NOLOCK)
WHERE A.Line in (5,6,7,54)
AND A.ProcCode in ('FVI06','AOI02')
AND A.AftStatus = 'CheckIn'
AND A.BefStatus <> 'CheckIn'
AND A.isCancel IS NULL
AND A.Changetime BETWEEN DATEADD(HOUR, -{hours}, GETDATE()) AND GETDATE()
GROUP BY A.Line, A.ProcCode
""".format(day=int(hours/24),hours=hours)
elif factory=="HF":
sql = """
SELECT CASE WHEN A.Line=28 THEN 'H1'
WHEN A.Line=29 THEN 'H3' END AS Factory,
A.ProcCode, 'tot_cnt_{day}' as daycnt,COUNT(DISTINCT A.lotnum) as 'cnt'
FROM dbo.view_PDL_CKHistory AS A(NOLOCK)
WHERE A.Line in (28, 29)
AND A.ProcCode in ('FVI06','AOI02')
AND A.AftStatus = 'CheckIn'
AND A.BefStatus <> 'CheckIn'
AND A.isCancel IS NULL
AND A.Changetime BETWEEN DATEADD(HOUR, -{hours}, GETDATE()) AND GETDATE()
GROUP BY A.Line, A.ProcCode
""".format(day=int(hours/24),hours=hours)
df = pd.read_sql(sql, cnxn)
"""
cursor = cnxn.cursor(as_dict=True)
cursor.execute(sql)
row = cursor.fetchone()
cnt_val = row['cnt'] if row else -1
cursor.close()
"""
return df
"""
ym_cnxn=connect(factory="YM")
total_cnt_1day = check_lot(ym_cnxn, hours=24)
total_cnt_7day = check_lot(ym_cnxn, hours=24*7)
total_cnt_30day = check_lot(ym_cnxn, hours=24*30)
print(total_cnt_1day, total_cnt_7day, total_cnt_30day)
ym=functools.reduce(lambda left, right: pd.merge(left, right, on='ProcCode'),
[total_cnt_1day,total_cnt_7day,total_cnt_30day])
ym["Factory"]="YM"
ym_cnxn.close()
"""
def factory_pipeline(factory):
# Build SQL connection
cnxn = connect(factory=factory)
total_cnt_1day = check_lot(factory, cnxn, hours=24)
total_cnt_7day = check_lot(factory, cnxn, hours=24*7)
total_cnt_30day = check_lot(factory, cnxn, hours=24*30)
df_concat=pd.concat([total_cnt_1day, total_cnt_7day, total_cnt_30day])
if factory=="SY" or factory=="HF":
df_all = pd.pivot(df_concat, index=['Factory','ProcCode'], columns='daycnt', values='cnt')
else:
df_all = pd.pivot(df_concat, index='ProcCode', columns='daycnt', values='cnt')
df_all['Factory'] = factory
df_all = df_all.reset_index()
return df_all
ym = factory_pipeline("YM")
SAS.df2sd(ym,'msym')
sy = factory_pipeline("SY")
SAS.df2sd(sy,'mssy')
hf = factory_pipeline("HF")
SAS.df2sd(hf, 'mshf')
```