我有一个pandas-DataFrame:
data = pd.read_csv(r'C:\data-path\demographics.csv', sep=',')
print(data)
PersonID Married No. of Children Sex
1 yes 0 male
2 no 0 female
3 no 1 male
4 yes 1 male
5 no 1 female
6 no 2 female
7 no 1 male
8 no 2 male
9 no 2 male
10 no 1 male
11 no 0 female
现在我尝试使用statsmodels.graphics.mosaicplot
创建一个马赛克图 mosaic(data, ['Married', 'No. of Children'])
...每当我尝试添加第三个维度时,它都可以工作,例如:
mosaic(data, ['Married', 'No. of Children', 'Sex'])
...我收到以下错误消息:
ValueError: at least one proportion should begreater than zero
我不确定,它对我有什么要求。是否有一些参数缺失/错误设置?
我选择的列/尺寸或顺序也无关紧要。每当我超过2时,我都会收到错误。
有人有想法吗?
提前致谢
答案 0 :(得分:1)
经过一些修修补补后,我没有找到解决方案,而是找到了bug的来源。
它位于mosaicplot-class / -module的代码中:http://nipy.bic.berkeley.edu/nightly/statsmodels/doc/html/_modules/statsmodels/graphics/mosaicplot.html
简而言之:它无法处理数据集中的类,这些类是空的,即有0个实例。
考虑原始问题中的数据集,然后调用以下函数:
mosaic(data, ['Married', 'No. of Children'])
'马赛克'方法将做的是确定第一类有多少类(在这种情况下:2),然后确定每个类出现的频率。然后,它将根据情节生成情节矩形的“比例”列表,如果是“已婚”类别,则
[2,9]
...因为有2个'是'和9个'不'实例。
对于每个班级,根据第二类,会有新的分组,在这里:'不。孩子的'。有3个类(0,1和2),这将生成以下'比例':
[1,1,0](1与0个孩子结婚,1个与1个孩子结婚,0个与2个孩子结婚)
[2,4,3](1个单身,0个孩子等等)
仅基于上述内容,它就可以画出完美的马赛克图。
但是,一旦我们考虑了第三类(例如:“性别”),上面其中一个列表中的0就成了问题。它将产生列表[0,0],因为它们是已婚男性/女性和2个孩子。
在源代码的第45行中,有一个if子句将在所有0列表中引发异常(因为它们“没有意义”)。
如上所述,我无法找到修复/解决方法来执行此操作。简单地说出if-clause将允许所有分割正常执行,但是,这也会导致马赛图的绘制在matplotlib的backend_agg.py中引发异常,因为它们现在是NaN的值(不是数字)。
为什么会这样,我不知道,如果有人比我更聪明,更有经验,我会很高兴。
我仍然不排除我必须以不同的方式设置一些参数。