# this script runs an Isolation Forest model and writes anomaly labels to the JMP data table


# import packages
# use jmputils.jpip() to install new packages; see Help > Scripting Index for example
import jmp
import numpy
import pandas as pd
from sklearn.ensemble import IsolationForest


# assign currently active JMP data table to dt
# dt is a JMP data table object
dt = jmp.current()


# convert dt to Pandas dataframe to input into isoforest algorithm
def jmpdt_to_pandasdf(jmpdt):
    pandasdf = pd.DataFrame()
    for col in jmpdt[:len(jmpdt)]:
    	pandasdf[ col.name ] = list( col )
    return pandasdf
X = jmpdt_to_pandasdf(dt)


# fit isoforest model and obtain anomaly labels
clf = IsolationForest(max_samples=100, random_state=0)
clf.fit(X)
labels = clf.fit_predict(X)


# save anomaly labels to new column in dt
dt.new_column('Anom Label')
labelsList = labels.tolist()
dt['Anom Label'] = labelsList