微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将大数据帧转换为 nd.array,做 spearman corr

如何解决将大数据帧转换为 nd.array,做 spearman corr

我有一个大数据,由样本作为索引和名称作为标题(500 X 30000)组成。 例如:

          Name1    Name2    Name3
Sample1   232.12   0.239    -0.324
Sample2   0.928    23.213   -0.056
Sample3   -0.231   7.7776   -0.984

我想得到的:

          Name1    Name2    Name3
Name1      1        0.001    corr val
Name2      corr val   1      corr val
Name3      corr val  corr val   1

等等。

我想过:

np.corrcoef(data)

但它只是“pearsons”,而且我收到了一个错误,声称数据很大。

我尝试拆分它

lst = []
data = For_spearman.to_numpy()
#data = np.delete(data,(0),axis=0)
data_size = len(data)-1
for key1 in range(1,data_size): #Ignoring first column which is index
    if key1 != data_size-1: # Cant compare after the last row,so -1 and -1.
        for key2 in range(key1+1,data_size): # Comparing name1 vs name2
            test = scipy.stats.spearmanr(data[key1][1:],data[key2][1:])
            lst .append([data[key1][0],data[key2][0],test])
            pd.DataFrame(lst ).to_csv('ForSpearman.csv')

但我只是弄得一团糟,因为我总是以某种方式被 nd.array 纠缠不清.. 我怎样才能做“np.corrcoef”工作,但以“spearman”方式进行拆分,以便每次都将一个数组与另一个数组进行比较?

解决方法

这是您的问题,您正在尝试创建一个 30000 x 30000 的矩阵,仅此矩阵就有 7.2GB。对于中间阵列,16GB 可能不够。不过,一种方法是循环。它会很慢,但可能在您的系统上可行:

df = pd.DataFrame(np.random.rand(500,30000))

out = pd.DataFrame(index=df.columns,columns = df.columns)

# you can also loop in chunks of columns
for col in df:
    out[col] = df.corrwith(df[col],method='spearman')

更新:以下内容可能对内存要求较低

out = pd.concat([df.corrwith(df[col],method='spearman')
                   .to_frame(name=col) for col in df.columns],axis=1)

尽管如此,我认为 12~16GB 在这种情况下非常有限。此外,循环将花费很长时间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。