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)
我在
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)