首页 > 解决方案 > Spearman scipy 状态,关于大数据

问题描述

我在将大数据帧转换为 nd.array时问了一个类似的问题 ,做 spearman corr 但这个有点不同:我正在尝试将一列与大数据集(30k)进行比较。这次我试图获得除了 Rho 值之外的“pvalue”。可以通过以下方式完成:

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

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

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

此代码仅给出 Rho 值

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

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

标签: pythonmemorycorrelation

解决方案


更新

这使技巧更加紧凑且同样出色:

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)

推荐阅读