我试图以这种方式在Kaggle笔记本上绘制海洋直方图:
sns.distplot(myseries, bins=50, kde=True)
但是我得到这个错误:
TypeError: slice indices must be integers or None or have an __index__ method
Thi是Kaggle笔记本:
https://www.kaggle.com/asindico/slice-indices-must-be-integers-or-none/
这是系列的负责人:
0 5850000
1 6000000
2 5700000
3 13100000
4 16331452
Name: price_doc, dtype: int64
最佳答案
正如@ryankdwyer所指出的,它是底层statsmodels
实现中的issue,但在0.8.0
版本中不再存在。
由于kaggle不允许您从任何内核/脚本访问Internet,因此无法升级软件包。基本上,您有以下两种选择:
sns.distplot(myseries, bins=50, kde=False)
。当然,这不会打印kde。 statsmodels
中的code手动修补0.8.0
实现。诚然,这有点棘手,但是您会得到kde图。 这是一个示例(和proof on kaggle):
import numpy as np
def _revrt(X,m=None):
"""
Inverse of forrt. Equivalent to Munro (1976) REVRT routine.
"""
if m is None:
m = len(X)
i = int(m // 2+1)
y = X[:i] + np.r_[0,X[i:],0]*1j
return np.fft.irfft(y)*m
from statsmodels.nonparametric import kdetools
# replace the implementation with new method.
kdetools.revrt = _revrt
# import seaborn AFTER replacing the method.
import seaborn as sns
# draw the distplot with the kde function
sns.distplot(myseries, bins=50, kde=True)
为什么行得通?好吧,它与Python加载模块的方式有关。从Python docs:
因此,
from statsmodels.nonparametric import kdetools
在此模块缓存中。 seaborn下次获取它时,缓存的版本将由Python模块加载器返回。由于此缓存版本是我们适应的模块,因此使用了revrt
函数的补丁程序。顺便说一句,这种做法在编写单元测试时非常方便,称为模拟。关于python - Kaggle TypeError : slice indices must be integers or None or have an __index__ method,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44009609/