2.4 直方图的表示

我编写了一个名叫Pmf.py的Python模块,其中定义了用于表示直方图的Hist对象,以及表示PMF的Pmf对象。可从http://thinkstats.com/Pmf.html阅读它的文档,从http://thinkstats.com/Pmf.py下载源代码。

MakeHistFromList函数接受一串值,并返回一个新的Hist对象。可以在Python的交互模式下测试一下:

  1. >>> import Pmf
  2. >>> hist = Pmf.MakeHistFromList([1, 2, 2, 3, 5])
  3. >>> print hist
  4. <Pmf.Hist object at 0xb76cf68c>

Pmf.Hist的意思是这个对象属于Pmf模块中定义的Hist类。一般情况下,书中的类和函数名首字母大写,变量名首字母小写。

Hist对象提供了查找值及其概率的方法。Freq方法接收一个值,并返回它的频数:

  1. >>> hist.Freq(2)
  2. 2

如果所查找的值不存在,那么频数就是0。

  1. >>> hist.Freq(4)
  2. 0

Values方法会返回未经排序的Hist类的对象的所有值:

  1. >>> hist.Values()
  2. [1, 5, 3, 2]

要按序遍历这些值,可以用内置的sorted函数:

  1. for val in sorted(hist.Values()):
  2. print val, hist.Freq(val)

如果要查找所有的频数,用Items会更高效。它会返回一组未经排序的值-频数对:

  1. for val, freq in hist.Items():
  2. print val, freq

习题2-3

一个分布的众数就是它的最频繁值(见 http://wikipedia.org/wiki/Mode_(statistics))。编写一个Mode函数,以Hist对象为参数,返回最频繁值。

再来一个更有挑战的,编写一个AllModes函数,参数还是Hist对象,但返回的是按照频数降序排列的值-频数对。提示:operator模块中有个itemgetter函数可以按键值排序。