对DataFrame的每一行执行mahalanobis计算,其距离指向DataFrame中的每一行。它看起来像这样:
import pandas as pd
from scipy import linalg
from scipy.spatial.distance import mahalanobis
from pprint import pprint
testa = { 'pid': 'testa', 'a': 25, 'b': .455, 'c': .375 }
testb = { 'pid': 'testb', 'a': 22, 'b': .422, 'c': .402 }
testc = { 'pid': 'testc', 'a': 11, 'b': .389, 'c': .391 }
cats = ['a','b','c']
pids = pd.DataFrame([ testa, testb, testc ])
inverse = linalg.inv(pids[cats].cov().values)
distances = { pid: {} for pid in pids['pid'].tolist() }
for i, p in pids.iterrows():
pid = p['pid']
others = pids.loc[pids['pid'] != pid]
for x, other in others.iterrows():
otherpid = other['pid']
d = mahalanobis(p[cats], other[cats], inverse) ** 2
distances[pid][otherpid] = d
pprint(distances)
这对于这里的三个测试用例来说效果很好,但在现实生活中它会在2000-3000行左右运行,并且使用这种方法需要太长时间。我对熊猫比较陌生,我真的更喜欢python到R,所以我想把它清理干净。
如何提高效率?
答案 0 :(得分:1)
对DataFrame的每一行执行mahalanobis计算,其距离指向DataFrame中的每一行。
这基本上是在sklearn.metrics.pairwise.pairwise_distances
中解决的,所以很有可能手动更有效地做到这一点。因此,在这种情况下,怎么样
$j('#hide_' + records[i].idOne).parent('.hideEmail').hide().next('.showReserved').show();