Python 删除一行数据,其中包含的值与平均值之间的偏差超过两个标准差
所以我有一个列表作为我的数据集X。我计算了每行的平均值和标准偏差,并将它们存储到各自的列表中。我的目标是找出X的哪些行有异常值(与平均值相差两个标准差以上的值),并删除整行。我只完成了从单个测试列表而不是列表列表中删除异常值:Python 删除一行数据,其中包含的值与平均值之间的偏差超过两个标准差,python,python-3.x,list-comprehension,Python,Python 3.x,List Comprehension,所以我有一个列表作为我的数据集X。我计算了每行的平均值和标准偏差,并将它们存储到各自的列表中。我的目标是找出X的哪些行有异常值(与平均值相差两个标准差以上的值),并删除整行。我只完成了从单个测试列表而不是列表列表中删除异常值: from math import sqrt def std_dev(lst): # standard deviation function mean = float(sum(lst)) / len(lst) return sqrt(sum((x -
from math import sqrt
def std_dev(lst): # standard deviation function
mean = float(sum(lst)) / len(lst)
return sqrt(sum((x - mean)**2 for x in lst) / len(lst))
def compute_std(X):
std = []
std.append([std_dev(char) for char in X])
return std
std = compute_std(X)
def means(lst):
return float(sum(lst)) / len(lst)
def compute_mean(X):
mean = []
mean.append([means(chars) for chars in X])
return mean
mean = compute_mean(X)
final_list1 = [x for x in X if (x > mean - 2 * std)]
final_list = [x for x in final_list1 if (x < mean + 2 * std)]
从数学导入sqrt
def标准偏差(lst):#标准偏差函数
平均值=浮动(总和(lst))/len(lst)
返回sqrt(总和((x-平均值)**2表示lst中的x)/len(lst))
def计算标准(X):
标准=[]
std.append([X中字符的std_dev(char)])
返回标准
标准=计算标准(X)
def是指(lst):
返回浮点(总和(lst))/len(lst)
def计算平均值(X):
平均值=[]
mean.append([X中字符的平均值(字符)])
回归均值
平均值=计算平均值(X)
最终列表1=[x代表x,如果(x>mean-2*std)]
最终清单=[x代表最终清单1中的x,如果(x
最后两行代码只在一个列表上工作,我希望它在X中遍历每个列表。我对python和列表理解还不熟悉。我没有使用列表理解来获取
X
的有效行,我不确定是否正确找到了符合条件的行(使用stdev和mean)
from statistics import mean, stdev
from random import randint, seed
#seed(1)
X = []
final_list = []
for i in range(10):
M = []
for j in range(25):
M.append(randint(-25, 1000))
X.append(M)
for row in X:
sd = stdev(row)
avg = mean(row)
#print(avg, sd)
high = avg + 2 * sd
low = avg - 2 * sd
if all(low < num < high for num in row):
final_list.append(row)
print(len(final_list))
也许其他人可以创建一个理解,但我认为有太多的计算(平均值、stddev和比较)来制作一个简洁的列表理解
from statistics import mean, stdev
from random import randint, seed
#seed(1)
X = []
final_list = []
for i in range(10):
M = []
for j in range(25):
M.append(randint(-25, 1000))
X.append(M)
for row in X:
sd = stdev(row)
avg = mean(row)
#print(avg, sd)
high = avg + 2 * sd
low = avg - 2 * sd
if all(low < num < high for num in row):
final_list.append(row)
print(len(final_list))
从统计数据导入平均值,stdev
从随机导入randint,种子
#种子(1)
X=[]
最终清单=[]
对于范围(10)内的i:
M=[]
对于范围(25)内的j:
M.append(randint(-251000))
X.1(M)
对于X中的行:
sd=stdev(世界其他地区)
平均值=平均值(行)
#打印(平均值,标准差)
高=平均值+2*sd
低=平均值-2*sd
如果全部(低<数值<行中数值高):
最终列表。追加(行)
打印(len(最终清单))
已经有均值和(样本)标准差。@ChrisCharley是的,我知道。我对列表理解部分比较困惑。非常感谢你的帮助!你能解释一下你在以“范围(10)中的i”开头的第一段代码中做了什么吗?@c_collins创建了10个列表(附加到X
),其中每个列表包含25个从-25到1000的随机整数。我这样做只是为了创建一个10个列表的样本X
,每个列表中有25个随机数。这只是给出了一些示例值,以便在代码的后面应用stdev和mean函数。