为了账号安全,请及时绑定邮箱和手机立即绑定

通过 SPSS 回归映射 Python for 循环

通过 SPSS 回归映射 Python for 循环

慕斯709654 2022-06-02 18:06:58
我需要通过我的回归运行两个循环,其中一个是自变量,另一个是我需要在每一轮自变量中保存的预测的后缀。我可以单独执行这些循环中的任何一个,它工作正常,但当我将它们组合在同一个回归中时就不行了。我认为这与我的回归结束时的循环映射有关。我收到错误代码“TypeError:列表索引必须是整数,而不是 str。” 但是,这是因为我的因变量被读取为字符串以从 SPSS 数据框中获取值。有什么方法可以在包含字符串变量的回归中映射 for 循环?我曾尝试使用 map() 函数,但我得到了不支持迭代的代码。begin program.import spss,spssauxdependent = ['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”,上面的代码。如何在包含字符串的同时映射循环?
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

在 Python 中,当您直接遍历一个可迭代对象时,循环变量将成为当前值,因此无需使用 and 来索引原始列表,depList[dep]而是varSuffix[var]直接使用变量:depand var.


此外,考虑str.format字符串插值,这是Python 3 的首选方法,而不是过时的、不再强调(尚未弃用)的字符串模%运算符:


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)])


查看完整回答
反对 回复 2022-06-02
  • 1 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信