我想找到最差的记录,这会使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/