使用相同的bin在Python中获取可变大小的numpy数组的CDF?

时间:2013-04-03 18:39:30

标签: python numpy scipy pandas statsmodels

我想为几个numpy数组(每个不同长度)制作一组可比较的经验CDF,并将它们存储在pandas数据帧中:

a = scipy.randn(100)
b = scipy.randn(500)
# ECDF from statmodels
cdf_a = ECDF(a)
cdf_b = ECDF(b)

问题是cdf_a.x, cdf_a.y的长度不同cdf_b.x, cdf_b.y,我希望这些长度相同,即使用相同数量的二进制位来计算CDF,以便可以绘制这些与pandas DataFrame相同的比例。这是不可能的:

df = pandas.DataFrame({"cdf_a": cdf_a.y, "cdf_b": cdf_b.y})

由于cdfs的长度不同。在计算CDF时,如何使用类似的bin来ab,以便我可以获得相似的相同长度的向量?

这是最好的解决方案吗?

bins = np.linspace(0, 1, 10)
v1 = cdf_a(bins)
v2 = cdf_b(bins)

2 个答案:

答案 0 :(得分:1)

我们在一些拟合优度测试中使用它的方法是堆叠数组,因此它们是在两个数组的所有点,点上定义的。

然后使用np.searchsorted获取排名,数据集1中的点数低于x,数据集2中的点数低于x。

如果我没记错的话,请查看scipy.stats.ks_2samp

data1 = np.sort(data1)
data2 = np.sort(data2)
data_all = np.concatenate([data1,data2])
cdf1 = np.searchsorted(data1,data_all,side='right')/(1.0*n1)
cdf2 = (np.searchsorted(data2,data_all,side='right'))/(1.0*n2)

答案 1 :(得分:0)

这似乎是一个很好的解决方案:

bins = np.linspace(0, 1, 10)
v1 = cdf_a(bins)
v2 = cdf_b(bins)

然后len(v1) == len(v2),这些可以在同一比例上绘制为a, b的CDF。