Python 基于线性回归R^2值更改数据帧

Python 基于线性回归R^2值更改数据帧,python,pandas,scipy,Python,Pandas,Scipy,我需要将一个线性方程拟合到一个数据帧,并且根据行的拟合程度(R^2值),我需要删除数据帧中的行。我使用的是SciPy linregress函数。我已经尝试了几种方法,但尚未找到一种能满足我需要的方法,例如: slope, intercept, r_value, p_value, std_err = stats.linregress([df['p_rel',df['y_BET']) r_sq = r_value ** 2 if r_sq < 0.995: '''remove las

我需要将一个线性方程拟合到一个数据帧,并且根据行的拟合程度(R^2值),我需要删除数据帧中的行。我使用的是SciPy linregress函数。我已经尝试了几种方法,但尚未找到一种能满足我需要的方法,例如:

slope, intercept, r_value, p_value, std_err = stats.linregress([df['p_rel',df['y_BET'])
r_sq = r_value ** 2

if r_sq < 0.995:
    '''remove last row from dataframe and run linregress again. repeat this until r_sq >= 0.995 '''
slope,intercept,r_值,p_值,std_err=stats.linregresse([df['p_rel',df['y_BET']))
r_sq=r_值**2
如果r_sq<0.995:
''从数据帧中删除最后一行并再次运行linregress。重复此操作直到r_sq>=0.995''

为什么不将其放入函数中

def regress(df):
    slope, intercept, r_value, p_value, std_err = stats.linregress(df['p_rel'], df['y_BET'])

    if r_value ** 2 < 0.995:
        regress(df.iloc[:-1, :])  # call again and regress with last row removed
    else:
        DO STUFF WITH RESULT
您可以使用创建迭代器 它可以在
linregresse
调用序列上迭代。因为它是 一次通过迭代器,对
linregresse
的调用将延迟到必要时

然后可以使用迭代生成器表达式,删除结果,直到
R**2
值大于0.995:

import scipy.stats as stats
import itertools as IT
regressions = (stats.linregress([df['p_rel'].iloc[:-i], df['y_BET'].iloc[:-i]) 
                                for i in range(len(df)))
slope, intercept, r_value, p_value, std_err = next(IT.dropwhile(
    lambda x: x[2]**2 < 0.995, regressions))
将scipy.stats导入为stats
按原样导入itertools
回归=(stats.linregresse([df['p_rel'].iloc[:-i],df['y_BET'].iloc[:-i])
对于范围内的i(len(df)))
斜率,截距,r_值,p_值,标准误差=下一步(IT.dropwhile(
λx:x[2]**2<0.995,回归)
您还可以将其包装到函数中:

def regress_dropping_tail_outliers(x, y, threshold=0.995):
    regressions = (stats.linregress([x.iloc[:-i], y.iloc[:-i]) for i in range(len(x)))
    return next(IT.dropwhile(lambda x: x[2]**2 < threshold, regressions))

slope, intercept, r_value, p_value, std_err = regress_dropping_tail_outliers(
    df['p_rel'], df['y_BET'])
def回归\u丢弃\u尾部\u异常值(x,y,阈值=0.995):
回归=(范围(len(x))内i的stats.linregresse([x.iloc[:-i],y.iloc[:-i]))
返回下一个(IT.dropwhile(lambda x:x[2]**2<阈值,回归))
斜率、截距、r_值、p_值、标准误差=回归、下降、尾部异常值(
df['p_rel'],df['y_BET']

你能发布几行df吗?考虑到它是基于csv文件的,我不知道如何发布数据帧。谢谢,我尝试了一个函数,但我希望能够调用函数外的slope和intercept,但没有运气。这样做会使R^2=1,这不是我需要的。我希望当R^2>=1时该函数停止。@Fungie,它是does.您是否考虑过,对于
n>2
,R平方可能没有达到阈值?我不知道您的数据,但您想要的R平方非常严格,因此很可能在
n=2
之前没有匹配,在这一点上,您的R平方保证等于1。对于此数据集,如果我删除前3行拟合度大于0.995,我已对此进行了测试,但我希望这是一个通用表达式,以便将其应用于其他数据集。@Fungie,你说你删除了第一行?但在你的编码示例中,你提到了删除最后一行。我假设你想删除最后一行(根据你的示例)但是,如果您希望删除第一行,只需将
df.iloc[:-1,:]
更改为
df.iloc[1:,:]
def regress_dropping_tail_outliers(x, y, threshold=0.995):
    regressions = (stats.linregress([x.iloc[:-i], y.iloc[:-i]) for i in range(len(x)))
    return next(IT.dropwhile(lambda x: x[2]**2 < threshold, regressions))

slope, intercept, r_value, p_value, std_err = regress_dropping_tail_outliers(
    df['p_rel'], df['y_BET'])