我有一些非常稀疏的多维时间序列,在某些时间有活动,而在其他时间活动为零。我将 Pandas 中的数据表示为 aSparseDataframe
和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
使用 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
?我是否应该重新考虑如何做到这一切?