2.4 直方图的表示

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

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

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

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

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

>>> hist.Freq(2) 
2

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

>>> hist.Freq(4) 
0

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

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

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

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

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

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

习题2-3

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

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