我在网上问过类似的问题将大数据帧转换为小数据帧。列队,做矛兵角但这个有点不同:我正在尝试将一个列与一个大数据集(30k)进行比较。这次我想要得到一个"value"。除了值之外。可以这样做:
stats.spearmanr(df,df['col'])
但是这个太大了,我的电脑无法运行(内存错误)
df= df[df.columns].apply(lambda x: x.corr(df['col'],method = 'spearman'))
这段代码只给出了Rho值
如何使用stats。斯皮尔曼在"打火机"里。路吗?(当前运行在12gb内存上)
[rho = 0.4853049, pval = 0.923423.]等等
update
这个更紧凑,同样好:
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)