python:有频率函数吗?

时间:2010-08-03 15:29:47

标签: python excel vba

在excel中有一个频率函数:

  

Excel FREQUENCY功能这个   有用的功能可以分析一系列   价值观并将它们总结成一个   指定范围的数量。对于   例如一些孩子的身高   可以分为四类   [小于150厘米]; [151 - 160cm];   [161-170厘米]; [超过170厘米]。

     

您想了解更多吗?

     

Excel 2003 Formulas by John Walkenbach   (附CD)

     

FREQUENCY()是一个不寻常的数组   功能和它的工作方式不同   大多数其他正常功能。它可以   不仅仅是键入单元格或   甚至使用Excel正确输入   功能向导。

     

请注意,此功能没有   将值分析为类别,例如   家庭支出分组等   天然气,电力,水,费率等   进行这种分析一个   高级过滤器可能是合适的。

     

频率功能有两个   参数 - 第一个是范围   包含值的单元格   分析;第二个是范围   包含上限值的单元格   每组绑扎。例如   =频率(A3:A120,B6:B10)

     

第二个论点(上层组   限制)将排除任何值   超过最高类别或   条纹。该功能允许您   考虑到这一点并延长   范围分析到另外一个   包含所有值的类别   超过指定的上限。

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

在python中有这样的东西吗?

4 个答案:

答案 0 :(得分:4)

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

Docs

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

计算一组数据的直方图。   参数:

     

a:array_like   输入数据。直方图是在平顶阵列上计算的。

     

bins:int或scalars序列,可选   如果bin是一个int,它定义了等宽bin的数量   给定范围(默认为10)。如果垃圾箱   是一个序列,它定义了bin   边缘,包括最右边,   允许不均匀的箱宽。

     

range :( float,float),可选   箱子的下部和上部范围。如果没有提供,范围是   简单地说(a.min(),a.max())。值   超出范围的人将被忽略。

     

normed:bool,可选   如果为False,则结果将包含每个中的样本数   完事。如果为True,则结果为值   的概率密度函数   bin,规范化使得   整数范围是1.注意   直方图值的总和   除非是垃圾箱,否则不等于1   选择统一宽度;它不是   概率质量函数。

     

weights:array_like,可选   一系列重量,形状与a相同。每个值只有一个   贡献其相关的重量   朝向bin计数(而不是1)。   如果normed为True,则权重为   归一化,使积分   该范围内的密度保持为1

     

返回:

     

hist:数组   直方图的值。请参阅标准和权重   可能的语义描述。

     

bin_edges:dtype float数组   返回bin边缘(length(hist)+1)。

您可能必须先install numpy

答案 1 :(得分:3)

最好的选择是使用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

以下是Excel帮助翻译为python的示例:

>>> 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版本将返回一致的数据类型(并仍然给出正确的答案)。

答案 2 :(得分:1)

基于引用的页面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

答案 3 :(得分:1)

我不知道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]}