Python中的Tukey五数概括

13 投票
8 回答
21279 浏览
提问于 2025-04-16 05:07

我一直找不到这个功能在任何标准包里,所以我自己写了下面这个。在把它提交给Cheeseshop之前,有没有人知道已经有类似的版本?或者,有什么改进的建议吗?谢谢。

def fivenum(v):
    """Returns Tukey's five number summary (minimum, lower-hinge, median, upper-hinge, maximum) for the input vector, a list or array of numbers based on 1.5 times the interquartile distance"""
    import numpy as np
    from scipy.stats import scoreatpercentile
    try:
        np.sum(v)
    except TypeError:
        print('Error: you must provide a list or array of only numbers')
    q1 = scoreatpercentile(v,25)
    q3 = scoreatpercentile(v,75)
    iqd = q3-q1
    md = np.median(v)
    whisker = 1.5*iqd
    return np.min(v), md-whisker, md, md+whisker, np.max(v),

8 个回答

6

如果有人需要一个可以处理数据中包含NaN(不是一个数字)的版本,这里是我做的修改。我不想直接修改原作者的回答,以免造成混淆。

import numpy as np
from scipy.stats import scoreatpercentile
from scipy.stats import nanmedian

def fivenum(v):
    """Returns Tukey's five number summary (minimum, lower-hinge, median, upper-hinge, maximum) for the input vector, a list or array of numbers based on 1.5 times the interquartile distance"""
    try:
        np.sum(v)
    except TypeError:
        print('Error: you must provide a list or array of only numbers')
    q1 = scoreatpercentile(v[~np.isnan(v)],25)
    q3 = scoreatpercentile(v[~np.isnan(v)],75)
    iqd = q3-q1
    md = nanmedian(v)
    whisker = 1.5*iqd
    return np.nanmin(v), md-whisker, md, md+whisker, np.nanmax(v),
9

我建议去掉这两样东西:

import numpy as np
from scipy.stats import scoreatpercentile

你应该在模块的最上面导入需要的东西。这意味着用户在导入你的模块时就能知道缺少哪些依赖,而不是等到他们调用函数的时候才发现。

try:
    sum(v)
except TypeError:
    print('Error: you must provide a list or array of only numbers')

这样做有几个问题:

  1. 在Python中不要进行类型检查。应该在文档里说明这个函数需要什么样的参数。
  2. 你怎么知道调用这个函数的人能看到这些信息?他们可能不是在控制台运行,即使是在控制台,他们也可能不希望你的错误信息打扰到他们的输出。
  3. 在Python中不要进行类型检查。

如果你确实想对无效的数据(不是类型检查)抛出一些异常,最好是让已有的异常继续传播,或者用你自己的异常类型来包装它。

33

pandas 中的 SeriesDataFrame 有一个叫 describe 的方法,这个方法和 R 里的 summary 很像:

In [3]: import numpy as np

In [4]: import pandas as pd

In [5]: s = pd.Series(np.random.rand(100))

In [6]: s.describe()
Out[6]: 
count    100.000000
mean       0.540376
std        0.296250
min        0.002514
25%        0.268722
50%        0.593436
75%        0.831067
max        0.991971

NAN(缺失值)会被正确处理。

撰写回答