使用 python 的 stats.kendalltau 函数

using python's stats.kendalltau function

我想测量两个 Conference 相关指标(AcceptanceRateFiveYrIF)之间的相关性。我有以下两个 DataFrame(已经相应排序/排名):

df_if:

                      Conference    FiveYrIF
0              SIGMOD Conference  112.685585
1                            KDD  103.674543
2                            CHI   99.453096
3                          SIGIR   68.967753
4                            WWW   65.715631
5                           SODA   60.151959
6                            DAC   42.076365
7                          ICCAD   39.906361
8                           CIKM   33.232224
9                           DATE   26.578906
10                       INFOCOM   22.694122
11  Winter Simulation Conference   17.448830
12                           SAC   10.646007 

df_ar:

                      Conference AcceptanceRate
0                           CIKM             15
1                          SIGIR             16
2                        INFOCOM           19.7
3                            KDD             21
4                            DAC             22
5                           DATE             23
6                            WWW             24
7                            CHI             25
8                          ICCAD             27
9              SIGMOD Conference             27
10                           SAC             29
11                          SODA           29.5
12  Winter Simulation Conference             54 

我想使用我以前使用过的 stats.kendalltau 方法比较两个指标(FiveYrIFAcceptanceRates),但使用的是年份(数字)排名使用此处所示的会议(文本)排名。

我尝试了以下方法:

from scipy.stats import kendalltau

kendalltau(df_if['Conference'].values, df_ar['Conference'].values)

但它返回了以下错误:

TypeError: merge sort not available for item 0

我不太确定我做错了什么,我的理解是我正在比较的只是序数(有序)而不是可比较的数字。我们比较订单,不是吗?

我正在努力避免必须返回数据库并为每个会议设置某种数字 ID,以便在可能的情况下执行此操作。

显然 kendalltau 不处理 Pandas 使用的对象数组。您可以通过在将其传递给 kendalltau.

之前将其转换为字符串数组来解决此问题

例如,这里有一个 DataFrame:

In [107]: df
Out[107]: 
     x    y
0  aaa  0.5
1   bb  1.4
2    c  1.3
3    d  2.0
4   ee  2.1

x 列中的值为字符串。 Pandas 将字符串数组表示为数据类型为 object:

的数组
In [108]: df['x']
Out[108]: 
0    aaa
1     bb
2      c
3      d
4     ee
Name: x, dtype: object

In [109]: df['x'].values
Out[109]: array(['aaa', 'bb', 'c', 'd', 'ee'], dtype=object)

kendalltau 不处理这样的数组:

In [110]: kendalltau(df['x'], df['y'])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-110-07ca97e866e2> in <module>()
----> 1 kendalltau(df['x'], df['y'])

/Users/warren/anaconda/lib/python2.7/site-packages/scipy/stats/stats.pyc in kendalltau(x, y, initial_lexsort)
   3020     if initial_lexsort:
   3021         # sort implemented as mergesort, worst case: O(n log(n))
-> 3022         perm = np.lexsort((y, x))
   3023     else:
   3024         # sort implemented as quicksort, 30% faster but with worst case: O(n^2)

TypeError: merge sort not available for item 1

In [111]: kendalltau(df['x'].values, df['y'])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-111-e903a3b3475e> in <module>()
----> 1 kendalltau(df['x'].values, df['y'])

/Users/warren/anaconda/lib/python2.7/site-packages/scipy/stats/stats.pyc in kendalltau(x, y, initial_lexsort)
   3020     if initial_lexsort:
   3021         # sort implemented as mergesort, worst case: O(n log(n))
-> 3022         perm = np.lexsort((y, x))
   3023     else:
   3024         # sort implemented as quicksort, 30% faster but with worst case: O(n^2)

TypeError: merge sort not available for item 1

如果使用 df['x'].values.astype(str):

将数组转换为字符串数组,它会起作用
In [112]: kendalltau(df['x'].values.astype(str), df['y'])
Out[112]: KendalltauResult(correlation=0.79999999999999982, pvalue=0.050043527347496564)