Отображение Python для циклов через регрессию SPSS - PullRequest
1 голос
/ 21 сентября 2019

Мне нужно выполнить два цикла по моей регрессии, один из которых является независимой переменной, а другой - суффиксом для прогноза, который мне нужно сохранить с каждым раундом независимых переменных.Я могу сделать любой из этих циклов по отдельности, и он прекрасно работает, но не тогда, когда я объединяю их в одной регрессии.Я думаю, что это как-то связано с отображением цикла в конце моей регрессии после%.Я получаю код ошибки «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. 

Я получил код ошибки 'Ошибка типа: индексы списка должны быть целыми числами, не str 'с кодом выше.Как мне отобразить цикл, включая строку?

1 Ответ

0 голосов
/ 21 сентября 2019

В Python, когда вы выполняете цикл непосредственно через итерацию, переменная цикла становится текущим значением, поэтому нет необходимости индексировать исходные списки с помощью depList[dep] и varSuffix[var], но использовать переменные напрямую: dep и 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)])
...