3

我有一些非常稀疏的多维时间序列,在某些时间有活动,而在其他时间活动为零。我将 Pandas 中的数据表示为 aSparseDataframeMultiIndex. 工作流程是对非零的小数据集进行计算,然后将结果放入大的稀疏数据框中。稍后我将对那个稀疏数据帧进行计算(即跟踪活动随时间的变化,包括零活动区域)。

问题在于将一小部分数据放入稀疏数据框中。下面是一个比我最终使用的数据集小得多的数据集。

使用常规索引就可以了:

import pandas as pd
full_index = arange(10000000) #10 million
sparse_data = full_index[:20000]
sparse_df = pd.SparseDataFrame(index=full_index)
data_df = pd.DataFrame(index=sparse_data,columns=['Data'], data=1) #Calculations would go here.

%time sparse_df.join(data_df)
CPU times: user 888 ms, sys: 225 ms, total: 1.11 s
Wall time: 1.56 s

使用 aMultiIndex会慢得多!

full_index = pd.MultiIndex.from_product([arange(2),
                                         arange(5),
                                         arange(1000000)]) #Still 10 million
sparse_data = full_index[:20000]
sparse_df = pd.SparseDataFrame(index=full_index)
data_df = pd.DataFrame(index=sparse_data,columns=['Data'], data=1)

%time sparse_df.join(data_df)
CPU times: user 13.8 s, sys: 1.82 s, total: 15.6 s
Wall time: 16.6 s #10x slower!

我认为问题可能出在 usingjoin上,所以我尝试了另一条路线。它更快,但没有解决问题。

#regular Index
%time sparse_df['Data'] = data_df.reindex(full_index).to_sparse()['Data'] #The reindexing is the slow part
CPU times: user 318 ms, sys: 129 ms, total: 448 ms
Wall time: 448 ms

#MultiIndex
%time sparse_df['Data'] = data_df.reindex(full_index).to_sparse()['Data'] #The reindexing is the slow part
CPU times: user 9.33 s, sys: 1.02 s, total: 10.3 s
Wall time: 10.4 s #20x slower!

reindex用它来代替确实更快join,但现在MultiIndex更慢,比较!

我有哪些选择?有没有办法用 实现常规索引的速度MultiIndex?有没有一种优雅的方法来制作像这样的常规索引函数MultiIndex?我是否应该重新考虑如何做到这一切?

4

0 回答 0