【问题标题】:Converting large dataframe to nd.array, doing spearman corr将大型数据帧转换为 nd.array,执行 spearman corr
【发布时间】:2021-01-26 19:35:34
【问题描述】:

我有一个大数据,其中包含作为索引的样本和作为标题的名称 (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”的方式并将其拆分,以便每次都会将一个数组与另一个数组进行比较?

【问题讨论】:

  • df.corr(method='spearman')吗?
  • 对数据框来说是的,但如果我这样做,我会得到一个错误:ValueError: array is too big; arr.size * arr.dtype.itemsize 大于最大可能大小。
  • 哈哈,即使我的桌面有 16 个,我也无法运行它(已编辑,数据的实际大小是多少)

标签: pandas correlation numpy-ndarray


【解决方案1】:

这是您的问题,您正在尝试创建一个 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 在这种情况下是相当有限的。此外,循环会花费很长时间。

【讨论】:

  • 目前在我的笔记本电脑上,12 GB,关闭所有应用程序,同样的错误:ValueError:数组太大; arr.size * arr.dtype.itemsize 大于最大可能大小。
  • 谢谢,这个正在运行(现在:))。嗯.. 是的,它有点受限,这就是我转而使用 nd.array 的原因,但它一团糟
  • 现在我想起来了,第二个可能会更糟,因为它会复制最终数据。如果你正在向磁盘写东西,你可以使用append模式逐行写入。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多