簡體   English   中英

python:有頻率函數嗎?

[英]python: is there a frequency function?

在excel中有一個頻率函數:

Excel FREQUENCY函數此有用的函數可以分析一系列值並將它們匯總為多個指定范圍。 例如,一些孩子的身高可以分為[小於150厘米]四類。 [151-160cm]; [161-170cm]; [超過170厘米]。

您想了解更多嗎?

John Walkenbach的Excel 2003公式(含CD)

FREQUENCY()是一個異常的數組函數,其工作方式與大多數其他普通函數不同。 不能簡單地將其鍵入到單元格中,甚至不能使用Excel Function Wizard正確輸入。

請注意,此功能不會將值分類,例如將家庭支出划分為諸如燃氣,電,水,費率等組。要執行這種分析,高級過濾器可能是合適的。

頻率函數有兩個參數-第一個是包含要分析的值的像元范圍;第二個是包含要分析的值的像元范圍。 第二個是包含每個組帶上限值的單元格范圍。 例如= FREQUENCY(A3:A120,B6:B10)

第二個參數(組上限)將排除任何超出最高類別或范圍的值。 該功能可讓您考慮到這一點,並將分析范圍擴展到包含所有超出指定上限的所有值的附加類別。

http://www.meadinkent.co.uk/xlfreq.htm

python中有這樣的事情嗎?

import numpy
numpy.histogram( [ <data> ], [ <bins> ] )

文件

 numpy.histogram(a, bins=10, range=None, normed=False, weights=None) 

計算一組數據的直方圖。 參數:

a :array_like輸入數據。 直方圖是在平坦數組上計算的。

bins :int或標量序列,可選,如果bins是int,則它定義給定范圍內的等寬bin數(默認為10個)。 如果bin是序列,則它將定義bin邊緣(包括最右邊),從而允許非均勻的bin寬度。

range :(浮動,浮動),可選垃圾箱的上下限。 如果未提供,則范圍僅為(a.min(),a.max())。 超出范圍的值將被忽略。

normed :bool,可選如果為False,結果將包含每個bin中的樣本數。 如果為True,則結果為bin處概率密度函數的值,將其歸一化,以使該范圍內的積分為1。注意,除非選擇了單位寬度的bin,否則直方圖值的總和將不等於1;否則,直方圖值的總和將不等於1。 它不是概率質量函數。

weights :array_like,可選一個與a形狀相同的權重數組。 每個中的每個值僅將其關聯權重分配給倉位計數(而不是1)。 如果normed為True,則會對權重進行歸一化,以便該范圍內的密度積分保持為1

返回值:

hist :array直方圖的值。 有關可能的語義的描述,請參見normed和weights。

bin_edgesbin_edges float的數組返回bin的邊(長度(歷史)+1)。

您可能必須先安裝numpy

最好的選擇是使用numpy.histogram ,但是如果您不想安裝numpy,那么這里的工作方式就像Excel:

def frequency(data, bins):
    # work with local sorted copy of bins for performance
    bins = bins[:]
    bins.sort()
    freqs = [0] * (len(bins)+1)
    for item in data:
        for i, bin_val in enumerate(bins):
            if item <= bin_val:
                freqs[i] += 1
                break
        else:
            freqs[len(bins)] += 1
    return freqs

這是轉換為python的Excel幫助中的示例:

>>> data = [79, 85, 78, 85, 50, 81, 95, 88, 97]
... bins = [70, 79, 89]
... print frequency(data, bins)
[1, 2, 4, 2]

有一個小的區別。 在Excel中,如果bins為空,則將數據長度作為整數返回。 此python版本在列表中返回該整數。 其原因是Python版本將返回一致的數據類型(並且仍然給出正確的答案)。

根據所引用頁面http://www.meadinkent.co.uk/xlfreq.htm的說明,我編寫了一個函數,我確定可以使用更快的方法來完成此操作,但是我確定這是正確的

def FREQUENCY(values, bands, max=None):
   counts = [0]*(len(bands)+1)
   for v in values:
       for i,b in enumerate(bands):
           if v <= b:
               counts[i] += 1
               break
           else if v > max:
               counts[-1] += 1
               break
   return counts

我不知道Python中是否有這樣的函數,但是顯然您可以編寫它:

def frequency(values, groups):
    # Build the solution
    toret = dict()
    toret[ None ] = list()

    # Sort them
    values.sort()
    groups.sort()

    # Run over groups
    i = 0
    for maxValue in groups:
        while ( ( values[ i ] < maxValue ) and ( i < len( values ) ) ):
            if ( toret.get( maxValue ) == None ):
                toret[ maxValue ] = list()
            toret[ maxValue ].append( values[ i ] )
            i += 1

        if ( i >= len( values ) ):
            break

    if ( i < len( values ) ):
        while( i < len( values ) ):
            toret[ None ].append( values[ i ] )
            i += 1

    return toret


l=[ 15,9,3,5,6,4,8,2,1,7,11,12 ]
g=[ 3,6,9 ]
print( frequency( l, g ) )

這里的結果是一個字典,其中每個元素都是組列表中的最大值之一。 您可以通過計算每個列表的長度來找到頻率。

結果是:

{None: [9, 11, 12, 15], 9: [6, 7, 8], 3: [1, 2], 6: [3, 4, 5]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM