我想找到最差的记录,这会使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。但是,我只想查找一个(或几个)异常行。凭直觉,我希望获得一组非平凡的记录,以获得更好的相关性。

最佳答案

首先,您可以强行获取确切的解决方案:

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'])


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

关于python - 在Pandas DataFrame中找到最差的元素使相关性更差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32516949/

10-12 02:27