python:有没有频率函数?

问题描述:

在Excel中存在频率函数:python:有没有频率函数?

Excel的FREQUENCY函数此 有用的功能可以分析值的系列 和它们聚合成一个 号所指定的范围。对于 例如一些孩子 的高度可以被分组到四个类别[少于150厘米]的 ; [151 - 160cm]; [161 - 170cm]; [超过170厘米]。

你想了解更多?

Excel 2003中的公式由约翰瓦尔肯巴赫 (附光盘)

FREQUENCY()是一个不寻常的阵列 功能,它的工作方式不同,以 大多数其他正常功能。它可以 不能简单地键入到细胞或 甚至使用Excel 功能向导中输入正确。

注意,此函数不 分析值代入类别例如 家庭支出成组等 如天然气,电力,水,费率等 要执行这种分析的 高级过滤器可能是合适的。

频率函数有两个 参数 - 第一个是要 分析含有值 细胞的范围内;第二个是 单元格的范围,其中包含每个组绑定的上限值 。例如 = FREQUENCY(A3:A120,B6:B10)

第二个参数(该基团上 限制)将排除其中 超过最高类别或 绑扎的任何值。该功能可让您 带上户口本和 范围的分析扩大到其他类别 包含超过规定上限的所有值 。

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

有在Python这样的事情?

+1

(我没有Excel自动柜员机)是否'FREQUENCY'仅仅数个数据点的数量,每个桶呢,还是斗数据点自己?也就是说,'FREQUENCY'([145,155])是为了给'{'小于150cm':1,...}或'{'小于150cm':145,...''? – katrielalex 2010-08-03 15:40:12

+1

如果是后者,'numpy.histogram'是你的朋友。 – katrielalex 2010-08-03 15:44:49

+0

谢谢!我如何包含它? – 2010-08-03 15:46:49

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

Docs

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

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

a:array_like 输入数据。直方图是在平坦数组上计算的。

bins:int或标量的序列,可选 如果仓是一个int,它定义了在给定 范围等宽窗口的数量(10,默认情况下)。如果分箱 是一个序列,则它定义了分箱 边缘,包括最右边的边缘,允许不均匀的分箱宽度。

range :(浮动,浮动),可选 垃圾箱的上下范围。如果未提供,范围为 (a.min(),a.max())。范围之外的值 被忽略。

normed:bool,可选 如果为False,结果将包含每个 bin中的样本数。如果为真,则结果是归零的概率密度函数 的值 归一化,使得该范围上的积分是1.注意 直方图值的总和 将不等于1,除非选择单位宽度为 ;它不是一个 概率质量函数。

weights:array_like,可选 一个与a相同形状的权重数组。仅在 中的每个值贡献其相关权重 朝向箱计数(而不是1)。 如果赋范为True,权重是 归一化,从而使 积分密度在范围内保持1

返回:

hist:阵列 直方图的值。请参阅规范和权重以了解可能的语义描述。

bin_edges:dtype float的数组 返回bin边(长度(hist)+1)。

您可能首先需要install numpy

基于什么引用的页面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 
+0

Excel的FREQUENCY返回的数组是一个比band长的元素。这个版本没有。 – 2010-08-03 16:00:35

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

我不知道是否有在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]} 
+1

为什么所有括号? – 2010-08-03 16:40:33

+0

如果您在诸如“print(frequency(l,g))”之类的句子中引用括号,那么它们归因于Python 3的使用。如果您在“if(i Baltasarq 2010-08-03 17:55:01