我需要对熊猫的数据拟合一个线性方程,根据直线的拟合(R^2值),我需要删除数据的行。我使用的是SciPy线性回归函数。我尝试过几种方法,但还没有找到一种我需要它的方式,比如:
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 '''
发布于 2015-12-13 14:54:43
为什么不把它变成一个函数呢?
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
这个递归是保证结束的:我们正在回归两列(所以是两个n x 1
结构),并递归地将其更新为n-1, n-2, ..., 2
。它最迟在2
停止,因为对两个2 x 1
结构的回归保证R-平方等于1(从而在if语句中计算为false )。
编辑:如果您想在函数之外使用结果(请参阅注释),这是可行的:
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:
return regress(df.iloc[:-1, :]) # call again and regress with last row removed
else:
return slope, intercept, r_value, p_value, std_err
# call like so:
slope, intercept, r_value, p_value, std_err = regress(df)
# use the results here
发布于 2015-12-13 15:16:29
您可以使用一个generator expression来创建一个迭代器,它可以遍历linregress
调用的序列。由于它是一个单程迭代器,对linregress
的调用将被推迟到必要时。
然后可以使用itertools.dropwhile
对生成器表达式进行迭代,删除结果直到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))
您还可以将其包装在一个函数中:
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'])
https://stackoverflow.com/questions/34252216
复制相似问题