Page tree
Skip to end of metadata
Go to start of metadata

Summary

Applies a python script on input data. Additional input data nodes may be specified.

Example: 

Situation


Settings

Result


Project-File

Simple Main

The simple_main method is available starting from version 6.0 of TIS. In older versions you need to provide a wrapper class. Write your code into the simple_main method.

simplemain.py
class SimpleMain:
    # Wrapper for simple_main(params, sponge_list, types, columns).
    types = {}
    columns = {}

    def __init__(self, user_script, params, inp):
        self.user_script = user_script
        self.params = params
        self.inp = inp

    async def sponge(self):
        # Async generator that yields results from user_script.
        for res in self.user_script(self.params,
                                    [row async for row in self.inp],
                                    self.types,
                                    self.columns):
            yield res

    def get_types_columns(self):
        # Return pair of types and columns.
        return self.types, self.columns

def simple_main(params, mylist, types, columns):

    #
    # do something
    #        

    return mylist
    
def main(params, inputs, outputs):    
    inp, out = inputs[0], outputs[0]
    simple = SimpleMain(simple_main, params, inp)
    
    return [(simple.sponge(), out)], {
        inp: simple.get_types_columns,
        out: simple.get_types_columns
        }



Want to learn more?

 Settings

Deletes columns or ranges of columns from the data table.

Columns of input table


ParameterValueOpt.DescriptionExample
Filename Python Script

System.Object

opt.Select File from Data Management containing the python script-
FILE2



Evaluation Timeout (msec)int

Operation abandoned at specified max. execution time.

  • minimum 1000 msec
  • maximum 2147483647 msec

Input Datanode 1System.Objectopt.additional input data node
Input Datanode 2System.Objectopt.additional input data node
Input Datanode 3System.Objectopt.additional input data node
Input Datanode 4System.Objectopt.additional input data node
Input Datanode 5System.Objectopt.additional input data node
Input Datanode 6System.Objectopt.additional input data node

 Troubleshooting
ProblemFrequent CauseSolutions
...

...

 Sample Scripts

Sample Project

Python Samples.gzip

Input data structure

input.py

By convention the first 2 rows define the types and captions of the input columns.

input.py
def main(params,inputs,outputs):

	columns = {}
	types = {}

	async def getcolfilter():
		nonlocal columns

		v = None
		while 1:
			v = yield v

	i0 = inputs[0]
	o0 = outputs[0]
	
	return [ (i0, getcolfilter(), o0) ], {i0: (lambda: (types, columns))}
	


Refer to columns by Caption

columnref.py

Use nonlocal to refer to variables in the main method's scope in order to be available in another nested method, such as inc in this sample.

Note: gen.__anext__() will be replaced by anext(gen) in Version 3.7, see https://www.python.org/dev/peps/pep-0525/#aiter-and-anext-builtins

columnref.py
# one input, one output
# duplicate input rows with row ids
def main(params,inputs,outputs):

	Birthday = None

    columns = {}
	types = {}

	async def getcolfilter(i):
		nonlocal Birthday
		nonlocal columns

		Birthday = columns['Birthday']
		
		async for v in i:
			yield v

	async def inc():
		nonlocal Birthday

		v = None
		while 1:
			v = yield v # produce v, then wait for next v
			v[Birthday] += datetime.timedelta(days=365)		

	i0 = inputs[0]
	o0 = outputs[0]
	
	return [ (getcolfilter(i0), inc(), o0) ], {i0: (lambda: (types, columns))}
	


Aggregate input into a list

sponge.py

Each yield internally calls asend then waits with anext.

Prime

Every generator must be initialized with a None, otherwise, following exception occurs:

await o.asend(v) File "user_script.py", line 18, in flush
TypeError: can't send non-None value to a just-started async generator


sponge.py
# aggregates complete input into a list 
# flushes list to output 
def main(params, inputs, outputs): 

	async def sponge(i): 
		mylist = [] 
		async for v in i: 
			mylist.append(v) 

		yield mylist 

	async def flush(o): 
		mylist = yield 
		await o.asend(None) # prime o 
		for v in mylist:
			await o.asend(v)

	i0 = inputs[0]
	o0 = outputs[0]
	
	return [ (sponge(i0), flush(o0)) ]


Add a new column to output

addcolumn.py

Input has a date column named "Birthday".

An output row v is a list, so appending creates an additional column.

birthday.py
# input has a date column named 'Birthday'
# add a new column 'age' to output
def main(params,inputs,outputs):
	 from datetime import date
	 columns = {}
	 types = {}

	 async def getcolfilter():
	 	nonlocal columns
 
	 	v = None
	 	while 1:
	 		v = yield v
 
	 async def addage():
		nonlocal columns, types
		types[len(columns)] = int
		columns['Age'] = len(columns)
 
		v = None
		while 1:
			v = yield v
			a = age(v[columns['Birthday']])
			v.append(a)
 
	def age(birthday):
		today = date.today()
		age = (today.year - birthday.year - \
			((today.month, today.day) < (birthday.month, birthday.day)))
		return age

	i0 = inputs[0]
	o0 = outputs[0]

	return [ (i0, getcolfilter(), addage(), o0) ], {i0:(lambda: (types,columns)), o0:(lambda: (types,columns))}



Related topics