欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

三个平行样选择性剔除异常值后求平均值(python)Nekotaizi

时间:2023-05-26

第一次用的Grubbs检验法剔除异常值,结果发现当n=3的时候,0.99,1,1.01按理来说没有异常值,但是算出来的G却是大于G(3)的,也就是说1.01要被剔除。这就很奇怪。上网查了一下竟然没人对这个方法产生一点质疑。暂且搁置,Grubbs检验法我感觉不靠谱。

后来我想可以利用条件限制去选择性剔除异常值。根据个人经验,选择用两个条件去限制(给x1,x2和x3从小到大排好顺序):(1)最大值和中间值距离与最小值和中间值距离的倍数比较(这里设定为绝对值不超过3倍):x3-x2>3(x2-x1)(2)单个最大值或者最小值与中间值的倍数限制(这里设定最大值不超过中间值的1.05倍,最小值不小于中间值的0.95倍):x3>1.05x2,x1<0.95x2。

这两个条件必须是“且”的关系,也就是两者缺一不可。

原始txt文件如下:

 スクリプト如下:

# -*- coding: utf-8 -*-"""Created on Mon Feb 14 00:35:11 2022@author: Lily"""import numpy as np# a=[1.2,1.6,1.1,2.3,2.5,2.1,2.01,2.30,0.45,4.56,1.21,1.23,100,100.01,100.63,-80,0,80]filename=r"D:pythonlpracticethree samples.txt"a=np.loadtxt(filename,skiprows=3,usecols=1,unpack=True,encoding='utf8')b=np.reshape(a,(int(len(a)/3),3)) #何行三列にするfor i in range(int(len(a)/3)): b[i]=np.sort(b[i]) #上昇順位で並べ替えるprint(b) #並べ替えたデータY=[]Ystrange=[]for i in range(int(len(a)/3)): if np.fabs(b[i][0]-b[i][1])<=3*np.fabs(b[i][2]-b[i][1]) and np.fabs(b[i][2]-b[i][1])<=3*np.fabs(b[i][0]-b[i][1]): Y.append(b[i]) Ystrange.append(0) else: for ii in range(3): if np.fabs(b[i][ii]-b[i][1])>3*np.fabs(b[i][2-ii]-b[i][1]): if ii==0 and b[i][ii]<0.95*b[i][1]: Y.append(np.delete(b[i],ii,None)) Ystrange.append(b[i][ii]) elif ii==2 and b[i][ii]>1.05*b[i][1]: Y.append(np.delete(b[i],ii,None)) Ystrange.append(b[i][ii]) else: Y.append(b[i]) Ystrange.append(0)#print(Y)Yaverage=[np.mean(x) for x in Y]print(Yaverage)Y1=[]Y2=[]Y3=[]for iii in Y: if len(iii)==2: Y1.append(iii[0]) Y2.append(iii[1]) Y3.append((iii[0]+iii[1])/2) elif len(iii)==3: Y1.append(iii[0]) Y2.append(iii[1]) Y3.append(iii[2])headtext="three samples' average"headtext+="nLily"headtext+="nnn x1(g/kg) x2(g/kg) x3(g/kg) average strange data"outputfilename=r"D:pythonlpracticethree samples results.txt"np.savetxt(outputfilename,list(zip(Y1,Y2,Y3,Yaverage,Ystrange)),fmt="%8.3f",header=headtext,encoding="utf8",delimiter=" ",comments=" ")

注:x1,x2,x3分别是从小到大排列后应该留住的数据。不用剔除就strange data里放个0;如果需要剔除:异常值x3剔除后用剩下两个数的平均值补位x3,然后把异常值放在strange data里。

最后输出结果如下:

 完美!

ps:两天下午的成果,第一天下午写的Grubbs全都浪费了,但是打算把部分代码写在下面以后可以再参考一些语法:

import numpy as npa1=[0.99,1.,1.01]a2=[-2,0.98,1.03]a3=[1,1.05,2.6]a4=[0.97,1.08,0.3]A=np.array([a1,a2,a3,a4])B=[[],[],[],[]]for i in np.arange(4): B[i]=[x for x in A[i] if (np.abs((x-A[i].mean())/A[i].std()))<= 1.135] B=np.array(B)print(B)Ave=np.zeros(4)for i in np.arange(4): Ave[i]=np.mean(B[i])print("外れ値を除いた平均値は",Ave)

配列の内包表記について参考する価値はあると思う!

python是跟着某日本老师的ppt学的,结果学完之后发现关于python的日语说法都知道,汉语说法却说不上来。。。最近看了很多日本那边的python经验分享,以后感觉有用的会翻译过来发上来!

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。