尽管密度极低,但使用稀疏 Pandas 数据帧没有 space 好处
No space benefit using sparse Pandas dataframe despite extremely low density
我正在使用 Python/Pandas 来处理非常大且非常稀疏的单列数据框,但是当我对它们进行 pickle 时,几乎没有任何好处。如果我在 Matlab 上尝试同样的事情,差异是巨大的,所以我试图了解发生了什么。
使用Pandas:
len(SecondBins)
>> 34300801
dense = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary'],index=SecondBins)
sparse = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary'],index=SecondBins).to_sparse(fill_value=0)
pickle.dump(dense,open('dense.p','wb'))
pickle.dump(sparse,open('sparse.p','wb'))
查看腌制文件的大小,
密集 = 548.8MB
稀疏 = 274.4MB
但是,当我查看与这些变量相关的内存使用情况时,
dense.memory_usage()
>>Binary 274406408
>>dtype: int64
sparse.memory_usage()
>>Binary 0
>>dtype: int64
因此,对于一个完全空的稀疏向量,节省了 50% 多一点。也许这与变量 'SecondBins' 由 pd.Timestamp 组成这一事实有关,我在 Pandas 中将其用作索引,因此我使用默认索引尝试了类似的过程。
dense_defaultindex = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary'])
sparse_defaultindex = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary']).to_sparse(fill_value=0)
pickle.dump(dense_defaultindex,open('dense_defaultindex.p','wb'))
pickle.dump(sparse_defaultindex,open('sparse_defaultindex.p','wb'))
但它在磁盘上产生相同的大小。
泡菜在幕后做什么?
如果我在 Matlab 中创建一个类似的零填充向量,并将其保存在 .mat 文件中,它是 ~180 字节!?
请指教
此致
请记住,pandas 是 标记的 数据。列标签和索引标签本质上是专门的数组,这些数组占用space。因此在实践中,就 space 用法而言,索引充当附加列,列标题充当附加行。
在密集的情况下,您基本上有两列,即数据和索引。在稀疏情况下,您基本上只有一列,即索引(因为备用数据列几乎不包含任何数据)。所以从这个角度来看,你会期望稀疏案例的大小大约是密集案例的一半。这就是您在文件大小中看到的。
然而,在 MATLAB 的情况下,数据没有被标记。因此,稀疏情况几乎不占space。与 MATLAB 情况等效的是稀疏矩阵,而不是备用数据帧结构。因此,如果您想充分利用 space 的节省,您应该使用 scipy.sparse
,它提供类似于您在 MATLAB 中获得的稀疏矩阵支持。
我正在使用 Python/Pandas 来处理非常大且非常稀疏的单列数据框,但是当我对它们进行 pickle 时,几乎没有任何好处。如果我在 Matlab 上尝试同样的事情,差异是巨大的,所以我试图了解发生了什么。
使用Pandas:
len(SecondBins)
>> 34300801
dense = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary'],index=SecondBins)
sparse = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary'],index=SecondBins).to_sparse(fill_value=0)
pickle.dump(dense,open('dense.p','wb'))
pickle.dump(sparse,open('sparse.p','wb'))
查看腌制文件的大小, 密集 = 548.8MB 稀疏 = 274.4MB
但是,当我查看与这些变量相关的内存使用情况时,
dense.memory_usage()
>>Binary 274406408
>>dtype: int64
sparse.memory_usage()
>>Binary 0
>>dtype: int64
因此,对于一个完全空的稀疏向量,节省了 50% 多一点。也许这与变量 'SecondBins' 由 pd.Timestamp 组成这一事实有关,我在 Pandas 中将其用作索引,因此我使用默认索引尝试了类似的过程。
dense_defaultindex = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary'])
sparse_defaultindex = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary']).to_sparse(fill_value=0)
pickle.dump(dense_defaultindex,open('dense_defaultindex.p','wb'))
pickle.dump(sparse_defaultindex,open('sparse_defaultindex.p','wb'))
但它在磁盘上产生相同的大小。
泡菜在幕后做什么? 如果我在 Matlab 中创建一个类似的零填充向量,并将其保存在 .mat 文件中,它是 ~180 字节!?
请指教
此致
请记住,pandas 是 标记的 数据。列标签和索引标签本质上是专门的数组,这些数组占用space。因此在实践中,就 space 用法而言,索引充当附加列,列标题充当附加行。
在密集的情况下,您基本上有两列,即数据和索引。在稀疏情况下,您基本上只有一列,即索引(因为备用数据列几乎不包含任何数据)。所以从这个角度来看,你会期望稀疏案例的大小大约是密集案例的一半。这就是您在文件大小中看到的。
然而,在 MATLAB 的情况下,数据没有被标记。因此,稀疏情况几乎不占space。与 MATLAB 情况等效的是稀疏矩阵,而不是备用数据帧结构。因此,如果您想充分利用 space 的节省,您应该使用 scipy.sparse
,它提供类似于您在 MATLAB 中获得的稀疏矩阵支持。