J'ai remarqué Pandas a maintenant prise en charge des matrices et des tableaux clairsemés . Actuellement, je crée DataFrame()
s comme ceci:
return DataFrame(matrix.toarray(), columns=features, index=observations)
Existe-t-il un moyen de créer une SparseDataFrame()
avec une scipy.sparse.csc_matrix()
ou csr_matrix()
? La conversion au format dense tue RAM mal. Merci!
Une conversion directe n'est pas prise en charge ATM. Les contributions sont les bienvenues!
Essayez ceci, devrait être correct sur la mémoire car la SpareSeries ressemble beaucoup à une csc_matrix (pour 1 colonne) et assez économe en espace
In [37]: col = np.array([0,0,1,2,2,2])
In [38]: data = np.array([1,2,3,4,5,6],dtype='float64')
In [39]: m = csc_matrix( (data,(row,col)), shape=(3,3) )
In [40]: m
Out[40]:
<3x3 sparse matrix of type '<type 'numpy.float64'>'
with 6 stored elements in Compressed Sparse Column format>
In [46]: pd.SparseDataFrame([ pd.SparseSeries(m[i].toarray().ravel())
for i in np.arange(m.shape[0]) ])
Out[46]:
0 1 2
0 1 0 4
1 0 0 5
2 2 3 6
In [47]: df = pd.SparseDataFrame([ pd.SparseSeries(m[i].toarray().ravel())
for i in np.arange(m.shape[0]) ])
In [48]: type(df)
Out[48]: pandas.sparse.frame.SparseDataFrame
Depuis pandas v 0.20.0, vous pouvez utiliser le constructeur SparseDataFrame
.
Un exemple de les pandas docs :
import numpy as np
import pandas as pd
from scipy.sparse import csr_matrix
arr = np.random.random(size=(1000, 5))
arr[arr < .9] = 0
sp_arr = csr_matrix(arr)
sdf = pd.SparseDataFrame(sp_arr)