2010-10-07 25 views
10

Tôi đã không thể tìm thấy chức năng này trong bất kỳ gói tiêu chuẩn nào, vì vậy tôi đã viết phần dưới đây. Trước khi ném nó về phía Cheeseshop, tuy nhiên, có ai biết về một phiên bản đã được xuất bản không? Ngoài ra, vui lòng đề xuất bất kỳ cải tiến nào. Cảm ơn.Tukey tổng số năm bản tóm tắt bằng Python

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

Đối với bất cứ điều gì nó có giá trị, matplotlib của 'boxplot' http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.boxplot hiệu quả thực hiện điều này, mặc dù gọi đó là chỉ để tính toán các thông số sẽ là clunky, để nói rằng ít nhất ... –

+0

ô của Matlab không tính toán một bản tóm tắt số 5. Q1 và bản lề thấp thường giống nhau, nhưng không phải lúc nào cũng vậy! Ô lô tính toán Q1 sử dụng một phương pháp nhất định (có quá nhiều lựa chọn từ), nhưng nó không đảm bảo để sản xuất bản lề thấp hơn của Tukey. – russellpierce

+0

Cf. http: //stats.stackexchange.com/questions/51801/interpreting-weird-box-plot/51806? noredirect = 1 # comment101742_51806 – russellpierce

Trả lời

9

tôi sẽ thoát khỏi hai điều này:

import numpy as np 
from scipy.stats import scoreatpercentile 

Bạn nên nhập khẩu ở mức mô-đun. Điều này có nghĩa là người dùng sẽ nhận thức được các phụ thuộc bị thiếu ngay sau khi họ nhập mô-đun của bạn, thay vì khi họ gọi hàm.

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

Một số vấn đề với điều này:

  1. Đừng gõ kiểm tra bằng Python. Ghi lại chức năng của hàm.
  2. Làm cách nào để bạn biết người gọi sẽ thấy điều này? Họ có thể không chạy ở bàn điều khiển, và ngay cả khi họ đang có, họ có thể không muốn thông báo lỗi của bạn can thiệp với sản lượng của họ.
  3. Không nhập séc bằng Python.

Nếu bạn muốn nâng cao một số loại ngoại lệ cho không hợp lệ dữ liệu (không kiểm tra kiểu), hoặc là cho một ngoại lệ hiện tuyên truyền, hoặc bọc nó trong loại ngoại lệ của riêng bạn.

+0

Nhận xét tốt cả hai. Việc nhập khẩu có chỉ là một trình giữ chỗ cho khi nó sẽ là một mô-đun. Việc xử lý ngoại lệ tôi cũng sẽ mất. Cảm ơn. –

+0

Bạn đã có một mô-đun (trong python, tất cả các mã được chứa trong một mô-đun). Chỉ cần nhập khẩu của bạn ở cấp cao nhất, bên ngoài chức năng. Không chỉ là nó được cho là "chính xác hơn", nhưng nếu/khi bạn thêm một chức năng khác vào tập tin, bạn sẽ không phải viết các câu lệnh nhập khẩu nữa. –

+0

Nó không phải là chính xác để tham khảo những gì đang xảy ra như kiểm tra loại, chỉ báo cáo lỗi xấu. Mã rời khỏi mã máy khách miễn phí để gọi nó bằng 'v' bằng bất cứ thứ gì có thể được chuyển đến' tổng hợp'. Điều đó hoàn toàn chính xác. – aaronasterling

5

Trong trường hợp ai đó cần phiên bản hoạt động với NaN trong dữ liệu, dưới đây là sửa đổi của tôi. Tôi không muốn thay đổi câu trả lời của poster gốc để tránh nhầm lẫn.

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

Tôi mới vào Python, nhưng sự trở lại được tính sai: nó phải max (min (v), q1-ria) cho thấp hơn bị ràng buộc và min (max (v), q3 + râu ria) cho giới hạn trên. Đó là cách nó được thực hiện trong R (các summary() chức năng), và đó là những gì hiển thị trên boxplots trong matplotlib.pyplot và R.

26

pandasSeriesDataFrame có một phương pháp describe, mà là tương tự như R 's 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 được xử lý chính xác.

+0

N.B. Điều này có thể cung cấp cho bạn một kết quả khác mà bạn dự định. Mô tả có thể sử dụng phương thức nội suy khác với phương thức cần thiết cho phần tư 'lower' và' upper'. Xem https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.percentile.html –

0

Hãy thử điều này:

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

tối thiểu, nhưng nó được công việc làm. :)

import numpy as np 
[round(np.percentile(results[:,4], i), 1) for i in [1, 2, 5, 10, 25, 50]] 
Các vấn đề liên quan