如何将 dask 数据帧转换为 scipy csr 矩阵?



TLDR:我知道这个问题,但它打破了懒惰评估dask集合的心态。将延迟计算的dask.dataframe转换为具有.valuesarray是有问题的(内存方面(。那么,如何在不先将数据帧转换为数组的情况下将 dask 数据帧转换为scipy.sparse.csr_matrix

完整问题:我有 3 个 dask 数据帧。其中一个具有文本特征,一个具有数字特征,一个具有分类特征。我正在使用返回scipy.sparse.csr_matrixsklearn.feature_extraction.text.TfidfVectorizer使用文本特征对数据帧进行矢量化。我需要将 3 个数据帧连接成一个(水平(。但他们有不同的dtype。我也dask_ml.feature_extraction.text.HashingVectorizer.它返回延迟计算dask.array.compute()返回scipy.sparse.csr_matrix。当我尝试将其转换为dask.dataframe时,没有.compute(),如下所示:

import dask.array as da
import dask.dataframe as dd
.
.
.
# Here the fitting the dask.dataframe, result is  lazily evaluated dask.array
X = vectorizer.fit_transform(X)
print(X.compute())
X = dd.from_dask_array(X)
print(X.compute())

X = vectorizer.fit_transform(X)回报:

dask.array<_transform, shape=(nan, 1000), dtype=float64, chunksize=(nan, 1000), chunktype=numpy.ndarray>

第一个print(X.compute())返回一个csr_matrix:

(0, 73)   2.0
(0, 95)   3.0
(0, 286)  1.0
(0, 340)  2.0
(0, 373)  3.0
(0, 379)  3.0
(0, 387)  1.0
(0, 407)  2.0
(0, 421)  1.0
(0, 479)  1.0
(0, 482)  3.0
(0, 515)  1.0
(0, 520)  1.0
(0, 560)  4.0
(0, 596)  1.0
(0, 620)  4.0
(0, 630)  1.0
(0, 648)  2.0
(0, 680)  1.0
(0, 721)  1.0
(0, 760)  3.0
(0, 824)  4.0
(0, 826)  12.0
(0, 880)  2.0
(0, 908)  1.0
: :
(10, 985) 1.0
(11, 95)  3.0
(11, 171) 4.0
(11, 259) 4.0
(11, 276) 1.0
(11, 352) 3.0
(11, 358) 1.0
(11, 436) 1.0
(11, 485) 1.0
(11, 507) 3.0
(11, 553) 1.0
(11, 589) 1.0
(11, 604) 1.0
(11, 619) 3.0
(11, 625) 2.0
(11, 719) 1.0
(11, 826) 6.0
(11, 858) 2.0
(11, 880) 3.0
(11, 908) 1.0
(11, 925) 2.0
(11, 930) 4.0
(11, 968) 1.0
(11, 975) 1.0
(11, 984) 4.0

X = dd.from_dask_array(X)返回:

Dask DataFrame Structure:
0        1        2        3        4        5        6        7        8        9        10       11       12       13       14       15       16       17       18       19       20       21       22       23  

第二个print(X.compute())返回错误:

ValueError: Shape of passed values is (6, 1), indices imply (6, 1000)

因此,我也无法将csr_matrix转换为 dask.dataframe。

更新:我刚刚意识到在dask.dataframe上使用.values实际上是返回一个延迟计算dask.array.这仍然不是我想要的,但至少它是 不在本地计算机上返回实体数据帧或数组。

最好的方法是将其实际转换为CSR矩阵并使其密集。

from scipy.sparse import csr_matrix

dd.from_dask_array(X.map_blocks(lambda x: csr_matrix(x).todense()))

最新更新