我有一个双重循环耗时比较多,主要可能在检查 index 上面:
from scipy.stats import pearsonr
# X,Y 是一个字典,每一个 key 对应一个序列 pandas.Series , 序列的元素是 float
# 难点:序列的 index 可能不一致,比如 X[k1] 这个序列的 index 是 0 到 100 ,
# Y[k2] 这个序列的 index 是 30 到 130 , X[k1] 和 Y[k2] 这两个序列里面可能有 nan 值。
# 要求:取出 X[k1] 和 Y[k2] 这两个序列中索引相同的,且不含 nan 值的部分,做相关系数
result = np.empty((len(X),len(y)))
for kx in X.keys():
for ky in Y.keys():
df = pd.DataFrame({'col1':X[kx], 'col2':Y[ky]}).dropna() # 耗时几乎都在这上面了
result[kx,ky] = pearsonr(df.col1, df.col2)
真正的 pearsonr 并不耗费多少时间,请教该如何优化是好?
1
yelite 2016-01-28 07:20:45 +08:00
试试看不创建 DataFrame ,用 is_nan 之类的函数生产两个 Bool Series ,然后 and 一下作为 index ,最后应该是 `pearsonr(X[kx][idx], Y[ky][idx])` 这种感觉
|
2
fractal314 2016-01-28 07:24:23 +08:00 via Android
倒数第二行的计算量是 o(n*n)的。自己写的话,应该是 o(n)的
|
3
billgreen1 OP |
4
asj 2016-01-28 07:43:36 +08:00 via Android
不是很确定理解清楚了你的问题
如果只是要找到两个字典中的序列号的话 各循环一次插入同一张 Hashtable ,以 series 为 key , value 为插入次数。之后遍历 Hashtable 取出 value 为 2 的条目。 |
5
fractal314 2016-01-28 07:50:31 +08:00 via Android
@billgreen1 1 楼和 4 楼的方法都是 o(n)的吧
|
6
ruoyu0088 2016-01-28 11:06:56 +08:00
先把所有序列的 nan 都删除掉,然后再进入双重循环。循环里面用 align(join="inner")对齐两个序列,相关文档: http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.Series.align.html
这样不需要创建 DataFrame 对象,速度应该有所提升。 |