matplotlib绘制等行数数据集直方图Y轴计数显示异常排查
同总行数数据集直方图计数差异异常问题
数据集基础校验结果
两个待对比数据集经校验行数、列数完全一致,校验代码及输出如下:
>>> df = load_diffae() >>> print(df.shape) (360000, 5) >>> dfn = load_diffne() >>> print(dfn.shape) (360000, 5)
异常表现
两个数据集总行数均为36万,但绘制出的直方图Y轴计数显示新数据集的数值远高于旧数据集,实际效果如下:
绘图所用代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm from Extract_elevation import * def load_diffae(): df = dfl return df def load_diffd(): dfn = dfld return dfn def Plot_show_eu(df,dfd, dfn): x = dfe['O18ad'] z = dfne['O18nd'] bins = np.linspace(-50, 1, 40) bins = 'auto' plt.hist(x, bins, alpha=0.65, label='alt') plt.hist(z, bins, alpha=0.65, label='new') plt.legend(loc='upper right')
异常可能诱因
- 变量作用域错误:绘图函数
Plot_show_eu虽然声明了df、dfd、dfn三个入参,但内部取绘图数据时调用的是全局作用域下的dfe、dfne变量,完全没有使用之前校验过行数为36万的传入数据集。如果全局作用域下的dfe本身是有效样本量远低于36万的残缺数据,自然会出现旧数据集直方图计数远低于新数据集的情况。 - 列空值率差异过大:
matplotlib的hist方法默认会自动忽略NaN、空值,不会计入统计。即使两个DataFrame总行数一致,如果旧数据集绘图取用的O18ad列空值量远高于新数据集的O18nd列,实际参与直方图统计的有效样本量会存在明显差距。 - 分箱规则不统一:代码中先定义了固定区间、固定数量的分箱数组,随后又将
bins参数覆盖为'auto'。连续两次调用hist传入bins='auto'时,matplotlib会针对当前传入的单组数据单独计算适配的分箱宽度,不会强制两组图使用完全一致的分箱边界:如果新数据集数值分布更集中,自动生成的单箱宽度更宽,单箱覆盖的样本数就会更高;旧数据集分布更分散时自动分箱粒度更细,单箱计数自然更低。 - 函数名拼写不匹配:代码中定义的新数据集加载函数名为
load_diffd,但校验数据集shape时调用的是load_diffne,存在拼写偏差,很可能校验shape用的数据集和实际绘图取用的数据集不是同一个对象,绘图时调用的新数据集实际有效行数远高于36万。
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

