Tukey在Python中的五个数字摘要

Ric*_*aga 11 python statistics numpy scipy

我无法在任何标准软件包中找到此函数,因此我编写了下面的一个.然而,在将它扔向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),
Run Code Online (Sandbox Code Playgroud)

bmu*_*bmu 30

pandas Series并且DataFrame有一个describe方法,它类似于Rsummary:

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
Run Code Online (Sandbox Code Playgroud)

NAN是正确处理的.


det*_*tly 9

我会摆脱这两件事:

import numpy as np
from scipy.stats import scoreatpercentile
Run Code Online (Sandbox Code Playgroud)

您应该在模块级别导入.这意味着用户在导入模块时会立即意识到缺少依赖项,而不是在调用函数时.

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

这有几个问题:

  1. 不要在Python中键入check.记录函数所需的内容.
  2. 你怎么知道打电话的人会看到这个?它们可能没有在控制台上运行,即使它们是,它们也可能不希望您的错误消息干扰它们的输出.
  3. 不要在Python中键入check.

如果您确实想要为无效数据引发某种异常(而不是类型检查),请将现有异常传播,或将其包装在您自己的异常类型中.

  • 我经常在函数内使用延迟导入.在一个更大的包中并不是每个人都使用每个函数,所以我们不需要默认导入所有内容.我认为这在很大程度上取决于背景. (2认同)

Seb*_*ian 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),
Run Code Online (Sandbox Code Playgroud)