Python中的Tukey五数概括
我一直找不到这个功能在任何标准包里,所以我自己写了下面这个。在把它提交给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')
这样做有几个问题:
- 在Python中不要进行类型检查。应该在文档里说明这个函数需要什么样的参数。
- 你怎么知道调用这个函数的人能看到这些信息?他们可能不是在控制台运行,即使是在控制台,他们也可能不希望你的错误信息打扰到他们的输出。
- 在Python中不要进行类型检查。
如果你确实想对无效的数据(不是类型检查)抛出一些异常,最好是让已有的异常继续传播,或者用你自己的异常类型来包装它。
33
pandas
中的 Series
和 DataFrame
有一个叫 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
(缺失值)会被正确处理。