[英]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_edges
:bin_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.