首页 > 解决方案 > 我是否正确调用 Dask dataframe.corr()?

问题描述

我正在尝试计算 Dask 数据帧上的相关矩阵。

  1. 数据非常庞大 - 围绕1 000 000行和900列。
  2. 我想从相关矩阵创建一个热图。
  3. 我知道热图可能会完全令人困惑并且视觉上不令人愉悦,但我仍然想这样做。

我正在使用 Daskdataframe来利用它,parallelism因此可以更快地计算它:

from dask.distributed import Client
import dask.dataframe as df

#Create cluster on local machine
client = Client(n_workers = 4, threads_per_worker = 1, memory_limit = '4GB')
client

#Get the data to RAM memory
dataframe_numerical = df.read_csv(numerical_path, engine = 'c', low_memory = False, dtype = dtypes)
dataframe_numerical = dataframe_numerical.persist()

#Calculate the correlation matrix:
corelation = dataframe_numerical.corr().compute()

Dask但是在可视化的这个阶段已经卡了这么久了:

我的代码正确吗?


附加信息:

读取.csv文件并将其存储到 Pandas中的代码dataframe(大约需要 2 分钟):

dataframe_numerical_lazy = df.read_csv(numerical_path, engine = 'c', low_memory = False, dtype = dtypes)
dataframe_numerical = dataframe_numerical_lazy.compute()

标签: pythonpandasheatmapdaskcorrelation

解决方案


计算相关矩阵的最简单方法是使用numpy(在大约 20 秒内完成):

import pandas as pd
import numpy as np
num_cols = 10**3
num_rows = 10**6
df = pd.DataFrame(np.random.rand(num_rows, num_cols), columns=map(str, range(num_cols)))
data = df.to_numpy()
corrmat = np.corrcoef(data.T)

更重要的问题是为什么要dask努力完成这项任务......我希望有一个答案,但如果列数较少,那么 dask 计算相关性,尝试设置低值num_cols,然后看看你的机器在哪一点停止:

import pandas as pd
import numpy as np
num_cols = 10
df = pd.DataFrame(np.random.rand(10**6, num_cols), columns=map(str, range(num_cols)))

import dask.dataframe as dd
ddf = dd.from_pandas(df, npartitions=10)

from distributed import Client
client = Client()
client

ddf.corr().compute()

推荐阅读