2010-10-07 70 views
10

我一直無法在任何標準包中找到這個函數,所以我寫了下面的一個。然而,在向Cheeseshop投擲之前,有沒有人知道已經發布的版本?或者,請提出任何改進建議。謝謝。Python中的Tukey五數摘要

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), 
+0

不管它的價值,matplotlib的'boxplot' http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.boxplot有效地做到這一點,但稱這只是爲了計算參數將是笨重的,至少可以說... – 2010-10-07 03:11:46

+0

Matlab的盒子圖不計算5號碼摘要。 Q1和下鉸鏈通常是相同的,但並不總是如此! Box plot使用某種方法計算Q1(有許多選擇),但不能保證Tukey的下鉸鏈。 – russellpierce 2013-03-13 16:06:02

+0

參考HTTP://stats.stackexchange。com/questions/51801/interpreting-weird-box-plot/51806?noredirect = 1#comment101742_51806 – russellpierce 2013-03-13 16:10:03

回答

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中輸入check。

如果你想提高某種異常的無效數據(類型檢查),要麼讓現有的異常傳播,或在自己的異常類型的包裹。

+0

好評都。這些導入只是作爲一個模塊的佔位符。異常處理我也會接受。謝謝。 – 2010-10-07 02:35:20

+0

你已經有了一個模塊(在Python中,所有代碼都包含在模塊中)。只要在功能之外的頂級進行導入。它不僅可以說是「更正確的」,但是如果/當您向文件中添加另一個函數時,您將不必再次編寫導入語句。 – 2010-10-07 03:40:27

+0

這不完全正確,指的是類型檢查發生了什麼,只是不好的錯誤報告。該代碼將客戶端代碼自由地用'v'調用它,等於任何可以傳遞給'sum'的東西。這完全正確。 – aaronasterling 2010-10-07 06:37:54

5

如果有人需要與數據中的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), 
0

我是新來的Python,但回報率計算錯誤:它應該是最大(最小(V),Q1-晶須)的下限和最小(MAX(V),Q3 +晶須)爲上限。這是它是如何在R(該summary()函數)來完成,而這對箱線圖中顯示的內容在matplotlib.pyplot和R.

26

pandasSeriesDataFramedescribe方法,它類似於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 

NAN的處理正確。

+0

N.B.這可能會給你一個不同的結果,你打算。描述可能會使用與「下」和「上」四分位數所需的插值方法不同的插值方法。見https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.percentile.html – 2017-09-14 21:39:16

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)) 
0

最小,但它能夠完成任務。 :)

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