通过 SPSS 回归映射 Python for 循环
Mapping Python for loops through an SPSS regression
我需要 运行 通过我的回归进行两个循环,其中一个是自变量,另一个是我需要在每一轮自变量中保存的预测的后缀。我可以单独执行这些循环中的任何一个并且它工作正常但是当我将它们组合在同一个回归中时就不行了。我认为这与 % 之后回归结束时的循环映射有关。我收到错误代码 "TypeError: list indices must be integers, not str." 但是,那是因为我的因变量被读取为字符串以从 SPSS 数据框中获取值。有什么方法可以在包含字符串变量的回归中映射 for 循环?
我试过使用map()函数,但是我得到的代码是不支持迭代。
begin program.
import spss,spssaux
dependent = ['dv1', 'dv2', 'dv3', 'dv4', 'dv5']
spssSyntax = ''
depList = spssaux.VariableDict(caseless = True).expand(dependent)
varSuffix = [1,2,3,4,5]
for dep in depList:
for var in varSuffix:
spssSyntax += '''
REGRESSION
/MISSING LISTWISE
/STATISTICS COEFF OUTS R
/CRITERIA=PIN(.05) POUT(.10)
/NOORIGIN
/DEPENDENT %(dep)s
/METHOD=FORWARD iv1 iv2 iv3
/SAVE PRED(PRE_%(var)d).
'''%(depList[dep],varSuffix[var])
end program.
我收到错误代码 'TypeError: list indices must be integers, not str'
使用上面的代码。如何在映射循环的同时包含字符串?
在Python中,当你直接循环遍历一个iterable时,循环变量变成当前值所以不需要用depList[dep]
和varSuffix[var]
索引原始列表但是使用直接变量:dep
和 var
。
此外,考虑 str.format
用于字符串插值,它是 Python 3 preferred method 而不是过时的、去强调的(不 尚未 弃用)字符串模 %
运算符:
for dep in depList:
for var in varSuffix:
spssSyntax += '''REGRESSION
/MISSING LISTWISE
/STATISTICS COEFF OUTS R
/CRITERIA=PIN(.05) POUT(.10)
/NOORIGIN
/DEPENDENT {0}
/METHOD=FORWARD iv1 iv2 iv3
/SAVE PRED(PRE_{1})
'''.format(dep, var)
或者,考虑使用 itertools.product
将两个列表合并为一个循环,然后使用列表推导式使用 join
构建字符串,而不是使用 +=
连接循环迭代:
from itertools import product
import spss,spssaux
dependent = ['dv1', 'dv2', 'dv3', 'dv4', 'dv5']
depList = spssaux.VariableDict(caseless = True).expand(dependent)
varSuffix = [1,2,3,4,5]
base_string = '''REGRESSION
/MISSING LISTWISE
/STATISTICS COEFF OUTS R
/CRITERIA=PIN(.05) POUT(.10)
/NOORIGIN
/DEPENDENT {0}
/METHOD=FORWARD iv1 iv2 iv3
/SAVE PRED(PRE_{1})
'''
# LIST COMPREHENSION UNPACKING TUPLES TO FORMAT BASE STRING
# JOIN RESULTING LIST WITH LINE BREAKS SEPARATING ITEMS
spssSyntax = "\n".join([base_string.format(*dep_var)
for dep_var in product(depList, varSuffix)])
现在,如果您需要在等长列表之间按元素并行迭代,请考虑使用 zip
而不是 product
:
spssSyntax = "\n".join([base_string.format(d,v)
for d,v in zip(depList, varSuffix)])
或enumerate
索引号:
spssSyntax = "\n".join([base_string.format(d,i+1)
for i,d in enumerate(depList)])
我需要 运行 通过我的回归进行两个循环,其中一个是自变量,另一个是我需要在每一轮自变量中保存的预测的后缀。我可以单独执行这些循环中的任何一个并且它工作正常但是当我将它们组合在同一个回归中时就不行了。我认为这与 % 之后回归结束时的循环映射有关。我收到错误代码 "TypeError: list indices must be integers, not str." 但是,那是因为我的因变量被读取为字符串以从 SPSS 数据框中获取值。有什么方法可以在包含字符串变量的回归中映射 for 循环?
我试过使用map()函数,但是我得到的代码是不支持迭代。
begin program.
import spss,spssaux
dependent = ['dv1', 'dv2', 'dv3', 'dv4', 'dv5']
spssSyntax = ''
depList = spssaux.VariableDict(caseless = True).expand(dependent)
varSuffix = [1,2,3,4,5]
for dep in depList:
for var in varSuffix:
spssSyntax += '''
REGRESSION
/MISSING LISTWISE
/STATISTICS COEFF OUTS R
/CRITERIA=PIN(.05) POUT(.10)
/NOORIGIN
/DEPENDENT %(dep)s
/METHOD=FORWARD iv1 iv2 iv3
/SAVE PRED(PRE_%(var)d).
'''%(depList[dep],varSuffix[var])
end program.
我收到错误代码 'TypeError: list indices must be integers, not str' 使用上面的代码。如何在映射循环的同时包含字符串?
在Python中,当你直接循环遍历一个iterable时,循环变量变成当前值所以不需要用depList[dep]
和varSuffix[var]
索引原始列表但是使用直接变量:dep
和 var
。
此外,考虑 str.format
用于字符串插值,它是 Python 3 preferred method 而不是过时的、去强调的(不 尚未 弃用)字符串模 %
运算符:
for dep in depList:
for var in varSuffix:
spssSyntax += '''REGRESSION
/MISSING LISTWISE
/STATISTICS COEFF OUTS R
/CRITERIA=PIN(.05) POUT(.10)
/NOORIGIN
/DEPENDENT {0}
/METHOD=FORWARD iv1 iv2 iv3
/SAVE PRED(PRE_{1})
'''.format(dep, var)
或者,考虑使用 itertools.product
将两个列表合并为一个循环,然后使用列表推导式使用 join
构建字符串,而不是使用 +=
连接循环迭代:
from itertools import product
import spss,spssaux
dependent = ['dv1', 'dv2', 'dv3', 'dv4', 'dv5']
depList = spssaux.VariableDict(caseless = True).expand(dependent)
varSuffix = [1,2,3,4,5]
base_string = '''REGRESSION
/MISSING LISTWISE
/STATISTICS COEFF OUTS R
/CRITERIA=PIN(.05) POUT(.10)
/NOORIGIN
/DEPENDENT {0}
/METHOD=FORWARD iv1 iv2 iv3
/SAVE PRED(PRE_{1})
'''
# LIST COMPREHENSION UNPACKING TUPLES TO FORMAT BASE STRING
# JOIN RESULTING LIST WITH LINE BREAKS SEPARATING ITEMS
spssSyntax = "\n".join([base_string.format(*dep_var)
for dep_var in product(depList, varSuffix)])
现在,如果您需要在等长列表之间按元素并行迭代,请考虑使用 zip
而不是 product
:
spssSyntax = "\n".join([base_string.format(d,v)
for d,v in zip(depList, varSuffix)])
或enumerate
索引号:
spssSyntax = "\n".join([base_string.format(d,i+1)
for i,d in enumerate(depList)])