8

我在计算四分位间距时遇到了一个有趣的情况。假设我们有一个数据框,例如:

import pandas as pd
index=pd.date_range('2014 01 01',periods=10,freq='D')
data=pd.np.random.randint(0,100,(10,5))
data = pd.DataFrame(index=index,data=data)

data
Out[90]: 
             0   1   2   3   4
2014-01-01  33  31  82   3  26
2014-01-02  46  59   0  34  48
2014-01-03  71   2  56  67  54
2014-01-04  90  18  71  12   2
2014-01-05  71  53   5  56  65
2014-01-06  42  78  34  54  40
2014-01-07  80   5  76  12  90
2014-01-08  60  90  84  55  78
2014-01-09  33  11  66  90   8
2014-01-10  40   8  35  36  98

# test for q1 values (this works)
data.quantile(0.25)
Out[111]: 
0    40.50
1     8.75
2    34.25
3    17.50
4    29.50

# break it by inserting row of nans
data.iloc[-1] = pd.np.NaN

data.quantile(0.25)
Out[115]: 
0    42
1    11
2    34
3    12
4    26

第一个四分位数可以通过取数据框中低于整体中位数的值的中位数来计算,因此我们可以看到 data.quantile(0.25) 应该产生什么。例如

med = data.median()
q1  = data[data<med].median()
q1
Out[119]: 
0    37.5
1     8.0
2    19.5
3    12.0
4    17.0

分位数似乎未能提供 q1 等的适当表示,因为它在处理 NaN 值方面做得不好(即它在没有 NaN 的情况下工作,但在 NaN 的情况下不工作)。

我认为这可能不是“NaN”问题,而可能是无法处理偶数数据集的分位数(即必须将中位数计算为两个中心数的平均值)。但是,在使用具有偶数行和奇数行的数据帧进行测试后,我发现分位数正确地处理了这些情况。只有当数据框中存在 NaN 值时,才会出现问题。

我想使用 quntile 来计算我的数据框中的滚动 q1/q3 值,但是,这不适用于 NaN 的存在。任何人都可以提供这个问题的解决方案吗?

4

1 回答 1

4

在内部,quantile使用numpy.percentile非空值。当您将最后一行更改为时,dataNaNs基本上会array([ 33., 46., 71., 90., 71., 42., 80., 60., 33.])在第一列中留下一个数组

计算np.percentile(array([ 33., 46., 71., 90., 71., 42., 80., 60., 33.])得出 42。

从文档字符串:

给定一个长度为 N 的向量 V,V 的第 q 个百分位数是 V 的排序副本中的第 q 个排序值。如果归一化排序与 q 不完全匹配,则使用两个最近邻居的加权平均值。与中位数 ifq=50相同,与最小值 ifq=0 相同,与最大值 if 相同q=100

于 2014-06-04T21:30:40.500 回答