找到最糟糕的元素,使pandas DataFrame中的相关性变差

时间:2015-09-11 06:30:16

标签: python pandas data-analysis

我想在pandas.DataFrame中找到导致相关性更差的最差记录,以删除异常记录。

当我有以下DataFrame时:

df = pd.DataFrame({'a':[1,2,3], 'b':[1,2,30]})

相关性变得更好,删除第三行。

print df.corr() #-> correlation is 0.88
print df.ix[0:1].corr() # -> correlation is 1.00

在这种情况下,我的问题是如何找到第三行是异常的候选者,使相关性变差。

我的想法是执行线性回归并计算每个元素(行)的误差。但是,我不知道尝试这个想法的简单方法,并且相信有更简单明了的方式。

更新

当然,你可以删除所有元素并实现相关性1.但是我想找到一个(或几个)异常行。直觉上,我希望得到一些非平凡的记录,以实现更好的相关性。

1 个答案:

答案 0 :(得分:1)

首先,你可以强制它来获得准确的解决方案:

import pandas as pd
import numpy as np
from itertools import combinations, chain, imap

df = pd.DataFrame(zip(np.random.randn(10), np.random.randn(10)))

# set the maximal number of lines you are willing to remove
reomve_up_to_n = 3

# all combinations of indices to keep
to_keep = imap(list, chain(*map(lambda i: combinations(df.index, df.shape[0] - i), range(1, reomve_up_to_n + 1))))

# find index with highest remaining correlation
highest_correlation_index = max(to_keep, key = lambda ks: df.ix[ks].corr().ix[0,1])

df_remaining = df.ix[highest_correlation_index]

这可能代价高昂。你可以通过添加一个像行对相关性的贡献之类的列来获得贪婪的近似值。

df['CorComp'] = (df.icol(0).mean() - df.icol(0)) * (df.icol(1).mean() - df.icol(1))
df = df.sort(['CorComp'])

现在,您可以从顶部开始删除行,这可能会提高您的相关性。