【问题标题】:How do I calculate a spearman rank correlation in pandas?如何计算熊猫中的斯皮尔曼等级相关性?
【发布时间】:2018-09-07 03:51:46
【问题描述】:

我有一个如下所示的数据框:每个值代表 5 个距离(1000m、800m、600m、400m、200m、0)中的一个值。

'key1': array([  1.21,   0.99,   6.66,
          5.22,   3.33]), 'key2': array([  2.21,   2.99,   5.66,
          6.22,   2.33]), 'key3': array([  4.21,   1.59,   6.66,
          9.12,   0.23])......

我想计算每个键的值和距离之间的 Spearman 等级相关性。

我有很多“钥匙”,我想在熊猫中以某种方式做到这一点。然后绘制所有键的 spearman 等级和距离平均图。

【问题讨论】:

  • 请发布MCVE 以及预期输出
  • 我已经回答了你问题的第一部分,尽管没有pandas。对于绘图,请检查 SO 上的其他问题,或者如果您找不到答案,请询问其他问题。一次问一个问题是一种很好的做法,因为这会使 SO 对其他用户更有用。

标签: python pandas numpy ipython


【解决方案1】:

既然你提到了 pandas ,并且 pandas 中有 corr 函数,方法为spearman

pd.concat([pd.DataFrame(v),pd.DataFrame(d)],axis=1).corr(method="spearman").iloc[-1]
Out[1302]: 
key1   -0.5
key2   -0.4
key3    0.1
0       1.0
Name: 0, dtype: float64

【讨论】:

    【解决方案2】:

    这是通过字典理解和scipy.stats.spearmanr 的一种方式。

    import numpy as np
    from scipy.stats import spearmanr
    
    d = np.array([1000, 800, 600, 400, 200])
    
    v = {'key1': np.array([  1.21,   0.99,   6.66,   5.22,   3.33]),
         'key2': np.array([  2.21,   2.99,   5.66,   6.22,   2.33]),
         'key3': np.array([  4.21,   1.59,   6.66,   9.12,   0.23])}
    
    res = {k: spearmanr(v[k], d)[0] for k in sorted(v)}
    

    如果你想使用pandas,我的建议是按照上面的方法进行计算并根据你的结果创建一个数据框。

    这几乎肯定会比将数据放入pandas 后执行计算更有效。

    df = pd.DataFrame.from_dict(res, orient='index')
    

    结果:

            0
    key1 -0.5
    key2 -0.4
    key3  0.1
    

    【讨论】:

    • 谢谢你;还有一个问题。真的有必要定义距离数组吗?由于所有键都有 5 个值,我可以简单地在数组中的位置调用它吗?有捷径可以做到这一点吗?我希望这是有道理的。
    • 不,spearmanr 函数需要 2 个数组作为输入。这在任何方面都不是低效的,因为我们只定义了一次距离数组。
    猜你喜欢
    • 1970-01-01
    • 2017-06-05
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2012-11-18
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多