Dear Readers
I wonder if there is an equivalent in Stata to "itertools" in python? For a large number of cases I have a list of numbers of different length and I want to find all the combinations of those numbers that add to a given number. In Python this can be done for example, with the list of numbers [0.02, 0.01, 0.18, 0.04, 0.03] to add to 0.25) :
. python
----------------------------------------------- python (type end to exit) ---------------------------------------------------------------------------------------------------------------------------------------
>>> import itertools
... numbers = [0.02, 0.01, 0.18, 0.04, 0.03]
>>>
>>> result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == 0.25]
>>> print result
[(0.02, 0.01, 0.18, 0.04), (0.18, 0.04, 0.03)]
>>> end
As a way round this I have written a python script which I call from Stata
Script:
#python script combinations.py
import sys
import itertools
print sys.argv
arguments = len(sys.argv) - 1
arguments
position = 1
while (arguments >= position):
print ("parameter %i: %s" % (position, sys.argv[position]))
position = position + 1
numbers = str(sys.argv[1])
print numbers
# seems to be list of strings
length = len(numbers)
length
goal = float(sys.argv[2])
print goal
result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == goal]
print result
Call from Stata
local numbers `"[0.02, 0.01, 0.18, 0.04, 0.03]"'
local target = 0.25
python script [path]/combinations.py, args(`"`numbers'"' "`target'")
which gives:
. python script d:/india/banerjee&iyer/gis/dams/nrld/DoFiles/python/combinations.py, args(`"`numbers'"' "`target'")
['d:/india/banerjee&iyer/gis/dams/nrld/DoFiles/python/combinations.py', '[0.02, 0.01, 0.18, 0.04, 0.03]', '.25']
parameter 1: [0.02, 0.01, 0.18, 0.04, 0.03]
parameter 2: .25
[0.02, 0.01, 0.18, 0.04, 0.03]
0.25
Traceback (most recent call last):
File "d:/india/banerjee&iyer/gis/dams/nrld/DoFiles/python/combinations.py", line 24, in <module>
result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == goal]
TypeError: unsupported operand type(s) for +: 'int' and 'str'
failed to execute the specified Python script file
r(7103);
end of do-file
But running the following irectly in Stat gives the correct results
************************************************** ***********
local numbers `"[`0.02', `0.01', `0.18', `0.04', `0.03']"'
local target = 0.25
python
import sys
import itertools
numbers = `numbers'
print numbers
target = float(`target')
print target
result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == target]
print result
end
************************************************** **************
. local numbers `"[0.02, 0.01, 0.18, 0.04, 0.03]"'
. local target = 0.25
. python
----------------------------------------------- python (type end to exit) ---------------------------------------------------------------------------------------------------------------------------------------
>>> import sys
>>> import itertools
>>> numbers = `numbers'
>>> print numbers
[0.02, 0.01, 0.18, 0.04, 0.03]
>>> target = float(`target')
>>> print target
0.25
>>> result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == target]
>>> print result
[(0.02, 0.01, 0.18, 0.04), (0.18, 0.04, 0.03)]
>>> end
It is seemingly the way the argument "numbers" is treated as all string in the args() option to the "python script" call, but I cannot work out how to get around it.
Thanks for help
Richard
Related Posts with Passing arguments from Stata to Python (or Stata equivalent to "itertools" )
Extract values of TN, FP, TP and FN stataDear Stata exper, Wonder how to extract values of TN, FP, TP and FN into seperate variables in stata…
WHO Anthro Macro files error message in calculating anthropometric z scoresDear All, I tried using WHO Anthro files (from https://www.who.int/childgrowth/software/en/) with S…
IRHi all, I am new to stata, and have quite large data set I'm working on, I'd be grateful for some a…
Probit model explanationI have a dataset that contains information on applications to any job vacancy in an organization. I …
how to deal with two datasetsHi! I have a dataset with information on applicants to all job vacancies in an organization, for ea…
Subscribe to:
Post Comments (Atom)
0 Response to Passing arguments from Stata to Python (or Stata equivalent to "itertools" )
Post a Comment