python - 通过 SPSS 回归映射 Python for 循环

标签 python spss

我需要通过回归运行两个循环,其中一个是自变量,另一个是我需要在每轮自变量中保存的预测的后缀。我可以单独执行这些循环中的任何一个,它工作得很好,但当我将它们组合在同一个回归中时就不行了。我认为这与 % 之后回归结束时的循环映射有关。我收到错误代码“TypeError:列表索引必须是整数,而不是 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:列表索引必须是整数,而不是 str” 与上面的代码。如何在包含字符串的同时映射循环?

最佳答案

在 Python 中,当直接循环遍历可迭代对象时,循环变量将变为当前值,因此无需使用 depList[dep]varSuffix[var] 为原始列表建立索引 但直接使用变量:depvar

此外,请考虑使用 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)])

或者枚举作为索引号:

spssSyntax = "\n".join([base_string.format(d,i+1) 
                           for i,d in enumerate(depList)])

关于python - 通过 SPSS 回归映射 Python for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58035918/

相关文章:

python - 获取python应用程序内存使用情况

spss - 在 SPSS 中将所有变量的所有负值标记为缺失

if-statement - SPSS - DO IF 函数缺少值和多个计算语句

python - 连接字符串和变量值

python - 使用 elementtree Python 从 XML 中删除元素和子元素

python - 在网站中嵌入简单的交互式数据可视化(Bokeh?其他平台?)

statistics - SPSS : syntax error involving RECODE command

string - SPSS 宏 - DEFINE 中的字符串操作 - !ENDDEFINE

spss - 使用 SYSMIS 计算变量

python - 检测噪声非常大的图像中的 Blob