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
函数可以按键值排序。