【问题标题】:SPSS-Python Script stops with an Error when spss commands inside spss.Submit() would create a warning当 spss.Submit() 中的 spss 命令会创建警告时,SPSS-Python 脚本会因错误而停止
【发布时间】:2015-09-15 20:18:49
【问题描述】:

假设我有两个变量列表

list a: a1 a2 a3
list b: b1 b2 b3

我想以这样的方式处理:

TEMPORARY.
SELECT IF a1=b1.
FREQUENCY someVar.


TEMPORARY.
SELECT IF a2=b2.
FREQUENCY someVar.


TEMPORARY.
SELECT IF a2=b2.
FREQUENCY someVar.

我尝试在 python 循环中执行此操作:

BEGIN PROGRAM.
import spss

la = ['a1', 'a2', 'a3']
lb = ['b1', 'b2', 'b3']

for a, b in zip(la, lb):
    spss.Submit('''
TEMPORARY.
SELECT IF %s=%s.
FREQUENCY someVar.
    ''' % (a, b))
END PROGRAM.

到目前为止一切顺利。除非SELECT IF 命令会创建一个空数据集,否则此方法有效。在 Python 程序块之外,这将在输出查看器中导致以下警告消息:

此过程中没有输入任何病例。要么没有 工作数据文件或全部被过滤掉。执行 此命令停止。

但在 Python 块内,它会导致错误并且 Python 脚本停止。

回溯(最近一次通话最后一次):
文件“”,第 7 行,在
提交中的文件“C:\PROGRA~1\ibm\SPSS\STATIS~1\23\Python\Lib\site-packages\spss\spss.py”,第 1527 行 raise SpssError,error spss.errMsg.SpssError: [errLevel 3] 严重错误。

有没有办法在 python 内部运行这个循环(这可能会产生临时的空数据集并因此产生警告)?

【问题讨论】:

    标签: python spss


    【解决方案1】:

    是的,如果您将有问题的函数包装在 try-except 构造中:

    for a, b in zip(la, lb):
        try:
            spss.Submit('''
    TEMPORARY.
    SELECT IF %s=%s.
    FREQUENCY someVar.
            ''' % (a, b))
        except:
            pass
    

    【讨论】:

      【解决方案2】:

      您还可以使用 Python API 计算 ai=bi 的情况,并据此执行条件块。

      因此,例如,如果剩下的有效案例少于 5 个,您可能不想产生任何输出(或者某些输出表明由于基数较小而没有产生输出)。如果剩余的案例少于 50 个,那么您可能需要运行频率,如果超过 50 个案例,则运行描述性等。获取病例数的方法有很多种,哪种方法最好、最有效可能取决于您的数据集和最终目标。

      例如: spss.GetCaseCount

      Here's 另一种方法,您可以从活动数据集中获取案例计数(例如统计数据)以激发更多想法。

      【讨论】:

        【解决方案3】:

        添加一些解释:统计语法错误的相关严重级别介于 1(最低)和 5 之间。您可能永远不会看到 5,因为这意味着系统已经陷入困境。通过 Submit 从 Python 运行语法时,会正常执行 1 级和 2 级错误,即不会阻止语法运行的警告。 3 级及更高级别引发异常。您可以通过上面建议的 try/except 机制在 Python 代码中处理这些问题。

        【讨论】:

          【解决方案4】:

          我对@9​​87654321@ 进行了实验,但是将其设置为零或将其设置为非常高的值(例如 1000000)都不起作用。警告仍然转换为错误。所以我写了这个解决方法:

          import codecs
          import re
          import sys
          
          import spss
          from spssaux import getShow
          
          def submit_syntax(sps_filename):
              output_on = spss.IsOutputOn()
              spss.SetOutput("off")
              unicode_mode = getShow("unicode") == u"Yes"
              encoding = "utf-8-sig" if unicode_mode else getShow("locale").split(u".")[-1]
              if output_on:
                  spss.SetOutput("on")
          
              with codecs.open(sps_filename, encoding=encoding) as f:
                  syntax = f.read()
              statements = re.split(ur"\. *\r\n", syntax, flags=re.MULTILINE)
              for stmtno, statement in enumerate(statements, 1):
                  if statement.startswith(u"*"):
                      continue
                  try:
                      spss.Submit(statement)
                  except spss.SpssError:
                      # "no cases were input" warnings are translated into errors.
                      if not spss.GetCaseCount() and spss.GetLastErrorLevel() <= 3:
                          continue
                      msg = u"ERROR in statement #%d: %s [%s]"
                      raise RuntimeError(msg % (stmtno, statement, sys.exc_info()[1]))
          

          【讨论】:

            猜你喜欢
            • 2023-03-10
            • 2021-11-02
            • 2023-03-19
            • 1970-01-01
            • 1970-01-01
            • 2018-12-12
            • 1970-01-01
            • 1970-01-01
            • 2019-09-20
            相关资源
            最近更新 更多