使用 python 的 stats.kendalltau 函数
using python's stats.kendalltau function
我想测量两个 Conference
相关指标(AcceptanceRate
和 FiveYrIF
)之间的相关性。我有以下两个 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
方法比较两个指标(FiveYrIF
和 AcceptanceRates
),但使用的是年份(数字)排名使用此处所示的会议(文本)排名。
我尝试了以下方法:
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)
我想测量两个 Conference
相关指标(AcceptanceRate
和 FiveYrIF
)之间的相关性。我有以下两个 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
方法比较两个指标(FiveYrIF
和 AcceptanceRates
),但使用的是年份(数字)排名使用此处所示的会议(文本)排名。
我尝试了以下方法:
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)