Tukey在Python中的五个数字摘要

时间:2010-10-07 02:23:43

标签: 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),

7 个答案:

答案 0 :(得分:29)

pandas SeriesDataFrame使用describe方法,类似于R的{​​{1}}:

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 已正确处理。

答案 1 :(得分: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中键入check。记录该功能的用途。
  2. 您如何知道来电者会看到这个?它们可能没有在控制台上运行,即使它们是,它们也可能不希望您的错误消息干扰它们的输出。
  3. 请勿在Python中键入check。
  4. 如果您确实要为无效数据(类型检查)引发某种异常,请将现有异常传播,或将其包装在您自己的异常中类型。

答案 2 :(得分: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),

答案 3 :(得分:0)

我是Python新手,但返回计算错误:下限应为max(min(v),q1-whisker),上限为min(max(v),q3 + whisker) 。它是如何在R(summary()函数)中完成的,这是matplotlib.pyplot和R中的箱图中显示的内容。

答案 4 :(得分:0)

试试这个:

import numpy as np
import numpy.random
from statstools import run
from scipy.stats import scoreatpercentile

data=np.random.randn(5)

return (min(data), md-whisker, md, md+whisker, max(data))

答案 5 :(得分:0)

最小,但它完成了工作。 :)

import numpy as np
[round(np.percentile(results[:,4], i), 1) for i in [1, 2, 5, 10, 25, 50]]

答案 6 :(得分:0)

import numpy as np
# np_array = np.array(np.random.random(100))
np.percentile(np_array, [0, 25, 50, 75, 100])

百分位数选择可以使用interpolation参数配置,默认情况下为linear