scipy.stats.binned_statistic如何将条柱边序列Map到要计算统计信息的数据?

xmjla07d  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(106)

以文档中的以下示例为例:

rng = np.random.default_rng(seed=3576)
windspeed = 8 * rng.random(500)
boatspeed = .3 * windspeed**.5 + .2 * rng.random(500)
bin_means, bin_edges, binnumber = stats.binned_statistic(windspeed,
                boatspeed, statistic='median', bins=[1,2,3,4,5,6,7])

bin_means中的第一个值(实际上在本例中计算中值)是0.48067334,这是数组boatspeed中的第90个值。
我真的很困惑,这个方法是如何把bin数组Map到值向量上的(在这个例子中是boatspeed)。第90个条目是如何属于一个从“1”开始到“2”结束的bin的?有人能给予一个直观的例子或解释吗?
我也不清楚需要风速矢量做什么。根据文档,这是“一系列要分组的值”,但统计数据是在第二个矢量船速上计算的,对我来说,这意味着我们实际上是在分组船速,而风速似乎并没有被使用/需要。
干杯干杯干杯

pod7payv

pod7payv1#

scipy.stats.binned_statistic()文档中的示例分析变量 Y(船速),通过将确定性函数 f 应用于随机变量 X 而产生(风速)通过 Y=f(X).故汇总统计boatspeed的(例如中位数)取决于windspeed。反过来,我们手头有 * 条件 * 中位数,而不是(无条件)中位数。
但是,您调用了无条件中值,因为

len(boatspeed[boatspeed < 0.48067334])
> 90

相比之下,binned_statistic()计算boatspeed的条件中值,假定相应的windspeed值出现在区间[1,2)中。

np.quantile(boatspeed[(1 <= windspeed) & (windspeed < 2)], 0.5)
> 0.48067334081468044

更一般地,每个条件中值对应于bin_means中的一个条目,因为

all([np.isclose(np.quantile(boatspeed[(binLower <= windspeed) & (windspeed < binLower+1)], 0.5), binMean) for binLower, binMean in zip(bin_edges, bin_means)])
> True

直观地说,我们得到了这个问题的答案:假设风速为1(即1<= windspeed<2),那么,对于此类风速观测,相应的中值船速是多少?
此外,binnumber只提供了一个数组,其中每个索引表示相应数据点在bin中的隶属关系。

all([max(windspeed[binnumber==i]) < min(windspeed[binnumber==i+1]) for i in range(1,7)])
>True

表示前一个windspeed bin的最大值严格小于当前bin的最小值。这是我们对数据进行正确装仓所期望的。
此外,我们可以通过以下方式重现上面的示例:

np.quantile(boatspeed[binnumber==1], 0.5)
> 0.48067334081468044

相关问题