我有一些非常稀疏的多维时间序列,在某些时间具有活动,在其他时间具有零活动。我将Pandas中的数据表示为SparseDataframe
,MultiIndex
。工作流程是对非零的小数据集执行计算,然后将结果放入大型稀疏数据帧中。稍后我将对稀疏数据帧进行计算(即跟踪活动随时间的变化,包括零活动区域)。
问题在于将少量数据放入稀疏数据帧中。下面是一个比我最终使用的数据集小得多的数据集。
使用常规索引就可以了:
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
使用MultiIndex
会慢得多!
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!
我认为问题可能在于使用join
,所以我尝试了另一条路线。它更快但没有解决问题。
#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
这样的常规索引函数?我应该重新思考如何做到这一切吗?