Spearman scipy 状态,关于大数据

Spearman scipy states, on large data

我在 但这个有点不同: 我正在尝试将一列与一个大数据集 (30k) 进行比较。这一次,除了 Rho 值之外,我还试图获得一个“pvalue”。 可以通过以下方式完成:

stats.spearmanr(df,df['col'])

但是这个对我的电脑来说太大了运行(内存错误)

df= df[df.columns].apply(lambda x: x.corr(df['col'],method = 'spearman'))

此代码仅给出 Rho 值

如何以“更轻松”的方式使用 stats.spearmanr? (运行ning 目前在 12gb 内存上)

[rho = 0.4853049 , pval = 0.923423..] 等等

更新

这个技巧更紧凑,同样有效:

import numpy as np
import pandas as pd
from scipy.stats import spearmanr

idx = np.linspace(1, 100, 1000000)
# some random dataframe
df = pd.DataFrame(data=dict(x=np.sin(idx), 
                            y=np.tan(idx)**3,
                            z=np.cos(idx)), 
                  index=idx)

corrs = df.apply(lambda x: pd.Series(spearmanr(x, df.x)._asdict()))

- - - - - - 旧答案 - - - - - - -

我想如果您不计算完整的相关矩阵,而只计算您感兴趣的值,这可能会有所帮助... (毕竟你得到的矩阵是对称的并且在对角线上有 1 所以额外的信息可以忽略不计......)

这里有一些代码在我的 16Gb ram 笔记本电脑上没有问题的 1 个(甚至 10M)条目的数据帧...

import numpy as np
import pandas as pd
from scipy.stats import spearmanr


idx = np.linspace(1, 100, 1000000)

# some random dataframe
df = pd.DataFrame(data=dict(x=np.sin(idx), 
                            y=np.tan(idx)**3,
                            z=np.cos(idx)), 
                  
                  index=idx)


def corr_with_col(df, var='x'):
    corrs = dict()

    for key, val in df.items():
        if key != var:
            corrs[f'{key}_{var}'] = spearmanr(df[var], df[key])
    
    return corrs

corrs = corr_with_col(df, 'x')

print('\n'.join([f'{key}: {val.correlation} ({val.pvalue})' 
                 for key, val in corrs.items()]))
>>> y_x: -0.004591765709253266 (4.394727211467625e-06)
>>> z_x: -0.0036273289997811407 (0.0002863601059399195)