TLDR:我知道这个问题,但它打破了懒惰评估dask集合的心态。将延迟计算的dask.dataframe
转换为具有.values
的array
是有问题的(内存方面(。那么,如何在不先将数据帧转换为数组的情况下将 dask 数据帧转换为scipy.sparse.csr_matrix
?
完整问题:我有 3 个 dask 数据帧。其中一个具有文本特征,一个具有数字特征,一个具有分类特征。我正在使用返回scipy.sparse.csr_matrix
sklearn.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()))