如何分离出偏离平均值2和3西格玛的数据,然后在python的绘图中标记它们?

如何分离出偏离平均值2和3西格玛的数据,然后在python的绘图中标记它们?,python,scipy,curve-fitting,standard-deviation,Python,Scipy,Curve Fitting,Standard Deviation,我从一个数据集中读取数据,当在matplotlib中绘制时,它看起来如下所示,然后使用线性回归获得最佳拟合曲线。 数据示例如下所示: # ID X Y px py pz M R 1.04826492772e-05 1.04828050287e-05 1.048233088e-05 0.000107002791008 0.000106552433081 0.000108704469007 387.02 4.81947797625e+13 1.87380963036e-05 1.8737058808

我从一个数据集中读取数据,当在matplotlib中绘制时,它看起来如下所示,然后使用线性回归获得最佳拟合曲线。 数据示例如下所示:

# ID X Y px py pz M R
1.04826492772e-05 1.04828050287e-05 1.048233088e-05 0.000107002791008 0.000106552433081 0.000108704469007 387.02 4.81947797625e+13
1.87380963036e-05 1.87370588085e-05 1.87372620448e-05 0.000121616280029 0.000151924707761 0.00012371156585 428.77 6.54636174067e+13
3.95579877816e-05 3.95603773653e-05 3.95610756809e-05 0.000163470663023 0.000265203868883 0.000228031803626 470.74 8.66961875758e+13
# Regression Function
def regress(x, y):
    #Return a tuple of predicted y values and parameters for linear regression.
    p = sp.stats.linregress(x, y)
    b1, b0, r, p_val, stderr = p
    y_pred = sp.polyval([b1, b0], x)
    return y_pred, p

# plotting z
xz, yz = M, Y_z                              # data, non-transformed
y_pred, _ = regress(xz, np.log(yz))      # change here           # transformed input             

plt.semilogy(xz, yz, marker='o',color ='b', markersize=4,linestyle='None', label="l.o.s within R500")
plt.semilogy(xz, np.exp(y_pred), "b", label = 'best fit')  # transformed output

我的代码如下所示:

# ID X Y px py pz M R
1.04826492772e-05 1.04828050287e-05 1.048233088e-05 0.000107002791008 0.000106552433081 0.000108704469007 387.02 4.81947797625e+13
1.87380963036e-05 1.87370588085e-05 1.87372620448e-05 0.000121616280029 0.000151924707761 0.00012371156585 428.77 6.54636174067e+13
3.95579877816e-05 3.95603773653e-05 3.95610756809e-05 0.000163470663023 0.000265203868883 0.000228031803626 470.74 8.66961875758e+13
# Regression Function
def regress(x, y):
    #Return a tuple of predicted y values and parameters for linear regression.
    p = sp.stats.linregress(x, y)
    b1, b0, r, p_val, stderr = p
    y_pred = sp.polyval([b1, b0], x)
    return y_pred, p

# plotting z
xz, yz = M, Y_z                              # data, non-transformed
y_pred, _ = regress(xz, np.log(yz))      # change here           # transformed input             

plt.semilogy(xz, yz, marker='o',color ='b', markersize=4,linestyle='None', label="l.o.s within R500")
plt.semilogy(xz, np.exp(y_pred), "b", label = 'best fit')  # transformed output
然而,我可以看到数据中有很多向上的分散,最佳拟合曲线受到这些因素的影响。首先,我想分离出与我的平均数据相差2和3西格玛的数据点,并用圆圈标记它们。 然后取最佳拟合曲线,仅考虑平均数据在1西格玛范围内的点

python中有没有一个好的函数可以帮我做到这一点

除此之外,我还可以将数据从实际数据集中分离出来,例如,如果样本输入中的第三行表示2西格玛偏差,我可以将该行也作为输出,以便稍后保存并进行更多调查吗


非常感谢您的帮助。

以下是一些代码,这些代码在给定数量的窗口中遍历数据,计算所述窗口中的统计信息,并在行为良好和行为不良的列表中分隔数据。 希望这有帮助

from scipy import stats
from scipy import polyval
import numpy as np
import matplotlib.pyplot as plt

num_data = 10000
fake_data_x = np.sort(12.8+np.random.random(num_data))
fake_data_y = np.exp(fake_data_x) + np.random.normal(0,scale=50000,size=num_data)

# Regression Function
def regress(x, y):
    #Return a tuple of predicted y values and parameters for linear regression.
    p = stats.linregress(x, y)
    b1, b0, r, p_val, stderr = p
    y_pred = polyval([b1, b0], x)
    return y_pred, p

# plotting z
xz, yz = fake_data_x, fake_data_y                            # data, non-transformed
y_pred, _ = regress(xz, np.log(yz))      # change here           # transformed input             

plt.figure()
plt.semilogy(xz, yz, marker='o',color ='b', markersize=4,linestyle='None', label="l.o.s within R500")
plt.semilogy(xz, np.exp(y_pred), "b", label = 'best fit')  # transformed output
plt.show()

num_bin_intervals = 10 # approx number of averaging windows
window_boundaries = np.linspace(min(fake_data_x),max(fake_data_x),int(len(fake_data_x)/num_bin_intervals)) # window boundaries
y_good = [] # list to collect the "well-behaved" y-axis data
x_good = [] # list to collect the "well-behaved" x-axis data
y_outlier = []
x_outlier = []

for i in range(len(window_boundaries)-1):

    # create a boolean mask to select the data within the averaging window
    window_indices = (fake_data_x<=window_boundaries[i+1]) & (fake_data_x>window_boundaries[i])
    # separate the pieces of data in the window
    fake_data_x_slice = fake_data_x[window_indices]
    fake_data_y_slice = fake_data_y[window_indices]

    # calculate the mean y_value in the window
    y_mean = np.mean(fake_data_y_slice)
    y_std = np.std(fake_data_y_slice)

    # choose and select the outliers
    y_outliers = fake_data_y_slice[np.abs(fake_data_y_slice-y_mean)>=2*y_std]
    x_outliers = fake_data_x_slice[np.abs(fake_data_y_slice-y_mean)>=2*y_std]

    # choose and select the good ones
    y_goodies = fake_data_y_slice[np.abs(fake_data_y_slice-y_mean)<2*y_std]
    x_goodies = fake_data_x_slice[np.abs(fake_data_y_slice-y_mean)<2*y_std]

    # extend the lists with all the good and the bad
    y_good.extend(list(y_goodies))
    y_outlier.extend(list(y_outliers))
    x_good.extend(list(x_goodies))
    x_outlier.extend(list(x_outliers))

plt.figure()
plt.semilogy(x_good,y_good,'o')
plt.semilogy(x_outlier,y_outlier,'r*')
plt.show()
来自scipy导入统计信息
从scipy导入polyval
将numpy作为np导入
将matplotlib.pyplot作为plt导入
num_data=10000
伪数据=np.sort(12.8+np.random.random(num\u数据))
伪数据y=np.exp(伪数据x)+np.random.normal(0,刻度=50000,大小=num数据)
#回归函数
def回归(x,y):
#返回线性回归的预测y值和参数的元组。
p=统计回归(x,y)
b1,b0,r,p_值,标准r=p
y_pred=polyval([b1,b0],x)
返回y_pred,p
#绘图z
xz,yz=伪数据,伪数据,非转换数据
y#u pred,#=回归(xz,np.log(yz))#此处更改#转换输入
plt.图()
plt.符号学(xz,yz,marker='o',color='b',markersize=4,linestyle='None',label='l.o.s在R500范围内)
plt.符号学(xz,np.exp(y_pred),“b”,标签=‘最佳拟合’)#转换输出
plt.show()
num_bin_间隔=10#大约平均窗口数
窗口边界=np.linspace(最小值(假数据)、最大值(假数据)、int(len(假数据)/num(假间隔))#窗口边界
y_good=[]#用于收集“行为良好”的y轴数据的列表
x_good=[]#用于收集“行为良好”的x轴数据的列表
y_异常值=[]
x_异常值=[]
对于范围内的i(len(窗口边界)-1):
#创建布尔掩码以选择平均窗口内的数据
窗口索引=(假数据窗口边界[i])
#在窗口中分离数据段
假数据片=假数据片[窗口索引]
假数据片=假数据片[窗口索引]
#计算窗口中的平均y_值
y_平均值=np.平均值(假数据y_切片)
y_标准=np.std(假数据y_切片)
#选择并选择异常值
y_异常值=伪数据y_切片[np.abs(伪数据y_切片-y_均值)>=2*y_标准]
x_异常值=伪数据x_切片[np.abs(伪数据y_切片-y_均值)>=2*y_标准]
#选择并选择好的
y_goodies=假数据y_切片[np.abs(假数据y_切片-y平均值)