2010-10-07 4 views
10

में तुकी पांच संख्या सारांश मैं इस मानक को किसी भी मानक पैकेज में नहीं ढूंढ पाया, इसलिए मैंने नीचे दिया गया एक लिखा। 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), 
+0

जो कुछ के लिए यह लायक है, matplotlib के 'boxplot' http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.boxplot प्रभावी रूप से इस करता है, यह बुला सिर्फ मानकों की गणना करने के लिए, हालांकि कम से कम कहने के लिए घबराहट होगी ... –

+0

मैटलैब का बॉक्स प्लॉट 5 नंबर सारांश की गणना नहीं करता है। क्यू 1 और निचले कंगन अक्सर समान होते हैं, लेकिन हमेशा नहीं! बॉक्स प्लॉट एक निश्चित विधि का उपयोग कर क्यू 1 की गणना करता है (वहां से कई भी चुनते हैं), लेकिन यह तुकी के निचले रंग के उत्पादन के लिए गारंटी नहीं है। – russellpierce

+0

सीएफ। http: //stats.stackexchange।कॉम/प्रश्न/51801/व्याख्या-अजीब-बॉक्स-प्लॉट/51806? noredirect = 1 # comment101742_51806 – russellpierce

उत्तर

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. प्रकार अजगर में जांच न करें। दस्तावेज क्या लेता है दस्तावेज।
  2. आप कैसे जानते हैं कि कॉलर्स इसे देखेंगे? हो सकता है कि वे कंसोल पर नहीं चल रहे हों, और यहां तक ​​कि यदि वे हैं, तो हो सकता है कि वे आपके त्रुटि संदेश को उनके आउटपुट में हस्तक्षेप न करें।
  3. पायथन में चेक टाइप न करें।

आप अमान्य डेटा (नहीं प्रकार की जाँच) के लिए अपवाद के कुछ प्रकार को बढ़ाने के लिए, या तो एक मौजूदा अपवाद का प्रचार करते हैं, या अपने स्वयं अपवाद प्रकार में लपेट चाहते हैं, तो।

+0

दोनों की तरह अच्छी टिप्पणियां लगती हैं। आयात एक प्लेसहोल्डर के रूप में होता है जब यह एक मॉड्यूल होगा। अपवाद हैंडलिंग मैं भी उठाऊंगा। धन्यवाद। –

+0

आपके पास पहले से एक मॉड्यूल है (पायथन में, सभी कोड मॉड्यूल में निहित है)। फ़ंक्शन के बाहर, बस शीर्ष स्तर पर अपने आयात करें। न केवल यह तर्कसंगत रूप से "अधिक सही" है, लेकिन यदि आप फ़ाइल में कोई अन्य फ़ंक्शन जोड़ते हैं तो आपको फिर से आयात विवरण लिखना नहीं होगा। –

+0

टाइपिंग जांच के रूप में क्या हो रहा है, बस खराब त्रुटि रिपोर्टिंग के संदर्भ में यह सही नहीं है। कोड क्लाइंट कोड को 'v' के साथ कॉल करने के लिए मुक्त करता है जिसे' sum' पर पारित किया जा सकता है। यह पूरी तरह से सही है। – aaronasterling

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

मैं अजगर करने के लिए नया हूँ, लेकिन वापसी गलत तरीके से की जाती है: यह (न्यूनतम (v), Q1-गलमुच्छा) लोअर बाउंड और मिनट (अधिकतम (v), Q3 + गलमुच्छा) के लिए अधिकतम होना चाहिए ऊपरी बाउंड के लिए। यह है कि यह कैसे आर (summary() समारोह) में किया जाता है है, और वह है क्या matplotlib.pyplot में और आर में boxplots पर दिखाई देता है

26

pandasSeries और 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 सही तरीके से संभाला जाता है।

+0

एनबी यह आपको एक अलग परिणाम दे सकता है जिसका आप इरादा रखते हैं। वर्णन 'निचला' और 'ऊपरी' क्वार्टाइल के लिए आवश्यकतानुसार एक अलग इंटरपोलेशन विधि का उपयोग कर सकता है। Https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.percentile.html देखें –

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]]