【发布时间】:2020-11-17 23:50:54
【问题描述】:
我在 Jupyter Notebook 中编写了一个脚本,用于从 Excel 文件中读取模型规格(应该预测什么、从什么变量、使用什么过滤器逻辑),使用 xgboost 运行一系列模型,并将结果写入Excel。使用几个不同的数据集,它工作得很好,但是对于一个特定的数据集,每次我尝试运行它时,我都会收到消息:
The kernel appears to have died. It will restart automatically.
我尝试在 Spyder 中运行相同的脚本,但收到了以下消息:
Assertion failed!
File: pyreadstat/_readstat_parser.c, Line 12686 Expression:
!PyErr_Occurred()
pyreadstat 是我用来从 SPSS 数据文件中读取变量标签的模块,所以这让我相信使用 pyreadstat 可能存在问题。
回到 Jupyter Notebook 中的原始脚本,我注释掉了与 pyreadstat 相关的任何内容,但我仍然收到内核死亡消息。但是,我仍然可以运行我的脚本,而不会出现其他数据文件和模型规范的问题——无论是否注释掉 pyreadstat。
这段代码适用于大约 5 种不同的配置但不是这 1 种的事实让我认为这个文件有些不同,但我不确定如何识别它是什么,特别是因为 Spyder 警告让我认为它是 pyreadstat,但删除 pyreadstat 会导致问题在 Jupyter 和 Spyder 中继续存在(在 Spyder 中,一旦我注释掉 pyreadstat,它就会卡住连接到内核)。
编辑:我还尝试添加一些打印语句以查看内核死在哪里,但它在任何运行之前就死了——我正在调用的函数开头的打印语句甚至没有执行。
编辑:我刚刚发现问题与 pandas.read_spss 有关。我在我的函数中单独运行每个语句,而这一行是内核死亡的那一行:
df = pd.read_spss("C:/Users/me/Desktop/file.sav", convert_categoricals=False)
查看 SPSS 文件本身,其中一个变量是日期。我的其他数据文件中的变量都不是日期,所以我将它的格式更改为字符串,当我这样做时,我得到了一个错误,而不是内核死亡。有趣的是,看起来 pandas.read_spss 使用了 pyreadstat:
ReadstatError Traceback (most recent call last)
<ipython-input-3-e8f001d12898> in <module>
1 import pandas as pd
2
----> 3 df = pd.read_spss(fileloc, convert_categoricals=False)
~\Anaconda3\lib\site-packages\pandas\io\spss.py in read_spss(path, usecols, convert_categoricals)
41
42 df, _ = pyreadstat.read_sav(
---> 43 path, usecols=usecols, apply_value_formats=convert_categoricals
44 )
45 return df
pyreadstat\pyreadstat.pyx in pyreadstat.pyreadstat.read_sav()
pyreadstat\_readstat_parser.pyx in pyreadstat._readstat_parser.run_conversion()
pyreadstat\_readstat_parser.pyx in pyreadstat._readstat_parser.run_readstat_parser()
pyreadstat\_readstat_parser.pyx in pyreadstat._readstat_parser.check_exit_status()
ReadstatError: Unable to open file
但现在我有点不知所措,因为由于日期是一个字符串,所以我找不到这个文件与其他 SPSS 文件有什么不同。
【问题讨论】:
-
介意分享文件吗?我唯一的猜测是,可能有不同的大小和/或数据不应该是。
-
我希望我可以,但它们是用于工作的,因此无法与外部共享。导致内核死机的文件比我一直使用的文件小得多。
标签: python pandas jupyter-notebook kernel spss