我试图以这种方式在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/

    10-16 16:10