ImportError: cannot import name 'factorial'

ImportError: cannot import name 'factorial'

我想使用 logit 模型并尝试导入 statsmodels 库。 我的版本:Python 3.6.8

我得到的最好建议是降级 scipy 但不清楚如何降级以及应该降级到哪个版本。请帮忙如何解决。 https://github.com/statsmodels/statsmodels/issues/5747

import statsmodels.formula.api as smf

ImportError                               Traceback (most recent call last)
<ipython-input-52-f897a2d817de> in <module>
----> 1 import statsmodels.formula.api as smf

~/anaconda3/envs/py36/lib/python3.6/site-packages/statsmodels/formula/api.py in <module>
     13 from statsmodels.robust.robust_linear_model import RLM
     14 rlm = RLM.from_formula
---> 15 from statsmodels.discrete.discrete_model import MNLogit
     16 mnlogit = MNLogit.from_formula
     17 from statsmodels.discrete.discrete_model import Logit

~/anaconda3/envs/py36/lib/python3.6/site-packages/statsmodels/discrete/discrete_model.py in <module>
     43 
     44 from statsmodels.base.l1_slsqp import fit_l1_slsqp
---> 45 from statsmodels.distributions import genpoisson_p
     46 
     47 try:

~/anaconda3/envs/py36/lib/python3.6/site-packages/statsmodels/distributions/__init__.py in <module>
      1 from .empirical_distribution import ECDF, monotone_fn_inverter, StepFunction
----> 2 from .edgeworth import ExpandedNormal
      3 from .discrete import genpoisson_p, zipoisson, zigenpoisson, zinegbin

~/anaconda3/envs/py36/lib/python3.6/site-packages/statsmodels/distributions/edgeworth.py in <module>
      5 import numpy as np
      6 from numpy.polynomial.hermite_e import HermiteE
----> 7 from scipy.misc import factorial
      8 from scipy.stats import rv_continuous
      9 import scipy.special as special

ImportError: cannot import name 'factorial'```

更新:现在升级 statsmodels 将解决此问题:pip install statsmodels --upgrade.


this issue on statsmodels' github repo 开始,解决方案似乎是将 SciPy 降级到版本 1.2(当前版本是 1.3,您似乎正在使用)。
至少对我来说,SciPy 1.2 在 scipy.misc 包中有 factorial 功能。

你可以做到

python3.6 -m pip install scipy==1.2 --upgrade

如果您没有标准安装权限,请使用 --user 选项。

也许您想避免使用 pip,因为您使用的是 Conda。您也应该能够在 Conda 中固定 scipy 的版本,但是如果您不打算向您的环境中添加任何其他包,只需使用 pip 版本。
当然,降级 SciPy 可能会在其他地方引起问题,但这很难预见,尤其是在不知道您安装了哪些其他软件包和依赖项的情况下;你只需要找出答案。为没有陷入依赖地狱而祈祷(因为你已经在门口了)。


更好奇的是,scipy.misc.factorial 自 1.0 版以来已被弃用; scipy.special.factorial 应该改用。

然而,在 1.2 版中导入并没有显示任何明确的警告,也没有使用它。这或许可以解释为什么 statsmodels 仍然使用旧的导入。下一个 statsmodels 版本正在修复中。

感谢@9769953。

  1. pip3 uninstall statsmodels # 确保删除旧版本
  2. pip3 install statsmodels==0.10.0rc2 --pre --user # 安装 statsmodels 的候选版本
  3. 重启jupyter notebook的内核

帮我修好了。
您可以使用 pip3 list

检查您的版本

摘要:在您的终端中复制&运行以下内容:

pip3 uninstall statsmodels -y
pip3 install statsmodels==0.10.0rc2 --pre --user

并且不要忘记重新启动 jupyter notebook 的内核:)

pip install statsmodels --upgrade 

对我有用

我发现一个简单的修复方法是编辑 .py 文件。在使用优势分析时,我遇到了与 OP 相同的错误。将 dominance.py 文件编辑为 from scipy.special import factorial 并且有效。我认为在 edgeworth.py 中的 statsmodel 包代码中将 from scipy.misc import factorial 行编辑为 from scipy.special import factorial 会在这里做同样的工作。