Python 3 - 如何从高维数据制作马赛克图?

标签 python python-3.x pandas plot

我有一个 pandas-DataFrame:

data = pd.read_csv(r'C:\data-path\demographics.csv', sep=',') 打印(数据)

PersonID 已婚子女人数性别 1 是 0 男性 2无0女 3无1男 4对1男 5无1女 6号2女 7无1男 8号2男 9号2男 10无1男 11 无 0 女

现在我尝试使用 statsmodels.graphics.mosaicplot 从中创建一个马赛克图

mosaic(data, ['Married', 'No. of Children'])

...但是,无论何时我尝试添加第三个维度,都有效,例如:

mosaic(data, ['Married', 'No. of Children', 'Sex'])

...我收到以下错误消息:

ValueError:至少有一个比例应该大于零

我不确定,它想从我这里得到什么。是否缺少/错误设置了某些参数?

我选择的列/维度或顺序也无关紧要。每当我有超过 2 个时,我都会收到错误消息。

有人有想法吗?

提前致谢

最佳答案

经过一些修补,我没有找到解决方案,而是找到了 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 个"is"和 9 个“否”实例。

对于每个类别,都会有新的拆分,根据第二个类别,这里:'No. child 的'。有 3 个类(0、1 和 2),这将生成以下“比例”:

[1, 1, 0](1 已婚有 0 个 child ,1 已婚有 1 个 child ,0 已婚有 2 个 child )

[2, 4, 3](1个单例,有0个 child ,等等....)

仅凭以上,就可以绘制出完美的马赛克图。

但是,一旦我们考虑了第三个类别(例如:“性”),上述列表之一中的 0 就会成为问题。它会产生列表 [0, 0],因为他们是 0 个有 2 个 child 的已婚男人/女人。

在源代码的第 45 行,有一个 if 子句会在全 0 列表中引发异常(因为它们“没有意义”)。

如上所述,我无法找到修复/解决方法来执行此操作。简单地取消注释所说的 if 子句将允许所有拆分正常执行,但是,这也会导致马赛克图的绘制在 matplotlib 的 backend_agg.py 中抛出异常,因为不知何故它们现在是 NaN 的值(不是数字)。

这是为什么,我不知道,如果有人比我更聪明、更有经验,我会很高兴研究这个。

我仍然不排除我必须设置一些不同的参数。

关于Python 3 - 如何从高维数据制作马赛克图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33987423/

相关文章:

python - 超高成本Tensorflow

python - 加快 np.arange( 1,100) 下值的求和速度

python - 将 pandas 数据框对齐为面板

python - 无法安装编解码器或升级 pip

python - 如何在函数中键入默认列表初始值设定项

python - 如何从受控循环中获取作为列表的打印输出?或者,在不打印的情况下获得相同的结果?

Pandas - 查找两个或多个满足条件的行

python - 使用open()打开文件时使用什么共享模式

python - 根据属性计算类的实例

python - python 脚本中 os.system 的 256 和 512 的响应代码是什么