python:有频率函数吗?

python:有频率函数吗?,python,excel,vba,Python,Excel,Vba,excel中有一个频率函数: Excel的频率函数将对此进行更改 有用的函数可以分析一个系列 并将其总结为 指定范围的数目。对于 举一些孩子的身高为例 可分为四类 [小于150厘米];[151-160厘米]; [161-170cm];[超过170厘米] 你想了解更多吗 John Walkenbach的Excel 2003公式 (附光盘) FREQUENCY()是一个不寻常的数组 功能,它的工作方式与 大多数其他正常功能。它可以 不是简单地输入单元格或 甚至可以使用Excel正确输入 函数向导 请

excel中有一个频率函数:

Excel的频率函数将对此进行更改 有用的函数可以分析一个系列 并将其总结为 指定范围的数目。对于 举一些孩子的身高为例 可分为四类 [小于150厘米];[151-160厘米]; [161-170cm];[超过170厘米]

你想了解更多吗

John Walkenbach的Excel 2003公式 (附光盘)

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

请注意,此函数不可用 对价值进行分类分析,例如:。 家庭开支分为以下几类: 如煤气、电、水、费率等。 要进行这种分析 高级过滤器可能是合适的

频率函数有两种 参数-第一个是参数的范围 包含要删除的值的单元格 分析;第二个是范围 包含 每组分带。例如 =频率(A3:A120,B6:B10)

第二个参数(组上限) 限制)将排除任何 超过最高类别或 捆扎。该函数允许您 考虑到这一点,并扩展 从分析范围到附加 包含所有值的类别 超过规定的上限

python中有这样的东西吗

import numpy
numpy.histogram( [ <data> ], [ <bins> ] )
计算一组数据的直方图。 参数:

a
:类似数组 输入数据。直方图是在展平阵列上计算的

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

范围
:(浮动,浮动),可选 箱子的上下范围。如果未提供,则范围为 简单地(a.min(),a.max()。价值观 超出范围的将被忽略

normed
:布尔值,可选 如果为False,则结果将包含每个样本中的样本数 箱子如果为True,则结果为值 概率密度函数在 标准化的垃圾箱,以便 范围内的积分为1。注 即直方图值的总和 将不等于1,除非 选择单位宽度;这不是一个问题 概率质量函数

权重
:类似阵列,可选 一组权重,形状与a相同。每个值只包含一个 贡献其相关权重 朝向垃圾箱计数(而不是1)。 如果normed为True,则权重为 归一化,使 该范围内的密度保持为1

返回:

hist
:数组 直方图的值。请参见规范化和重量,了解更多信息 可能语义的描述

bin_边
:数据类型float的数组 返回箱子边缘(长度(历史)+1)


您可能必须首先执行此操作。

根据引用的页面所述,我编写了一个函数,我确信有更快的方法来执行此操作,但我确信此方法是正确的

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
def频率(值、频带、最大值=无):
计数=[0]*(长度(带)+1)
对于v值:
对于枚举中的i、b(带):
如果v最大值:
计数[-1]+=1
打破
返回计数

最好的选择是使用
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中,如果
bin
为空,则数据长度将作为整数返回。此python版本在列表中返回该整数。原因是Python版本将返回一致的数据类型(并且仍然给出正确的答案)。

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

(我没有Excel atm。)
FREQUENCY
是仅仅计算每个bucket中的数据点的数量,还是它自己将数据点存储在bucket中?也就是说,
频率([145155])
是否意味着给出
{‘小于150cm’:1,…}
{“小于150cm”:145,…
?如果后者,
numpy.histogram
是您的朋友。Excel的频率返回一个比频带长一个元素的数组。此版本没有。如果您在诸如“print(FREQUENCY(l,g))”之类的句子中引用括号,则它们是由于使用了Python 3。如果您在“If”中引用它们(i>>> data = [79, 85, 78, 85, 50, 81, 95, 88, 97] ... bins = [70, 79, 89] ... print frequency(data, bins) [1, 2, 4, 2]
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]}