试验数据的筛选和质量可视化


前言

  在试验过程中,试验员经常会在试验中获得三个以上的试验数据,在数据处理时再从多个重复中挑选,通常会挑选三个,进行统一的计算方差等数据处理。这个挑选的过程如果通过人为筛选较为费时低效,可以通过脚本计算方差的方式自动选出最接近的三个数值。
  数据筛选出来之后,还需要以最快的方式的知数据的质量。因为试验材料通常具有时效性,并且如果是使用大型仪器测量的话,仪器的使用时间严格控制。因此在最短的时间内获得数据的质量,有助于试验员及时补测。


一、试验数据的筛选

问题背景

  在试验中,为了让数据更具有可靠性,试验员需要在试验中设置了3个以上的重复。但是平常的方差分析等,只需要3个数据就可以了。因此试验员常常需要在各个重复中选出最为接近的三个数据。这个过程是必须以计算为基础的,直观上很难快速看出数据的接近程度,并且试验通常处理数较多,各处理的数据需要单独筛选,使得筛选过程单调复杂。但是如果能够将筛选数据的方法用脚本表达出来,这将大大简化数据筛选的效率,节省试验员的时间。

解决思路

本文构想的数据筛选方法有两种:

  1. 基于排序和差值的筛选方法:将重复数据先按照升/降序排列,然后计算相邻数据的差值,再计算相邻两个差值的和,和最小的相邻三个数据即是重复性最好的三个数据。
  2. 基于排列组合和平均值的筛选方法:使用排列组合的方法获得从重复数据中选出三个数据的所有组合,然后分别计算每个组合的平均值和方法,方差最小并且平均值最接近总体平均值的组合即是重复性最好的组合。

脚本实现:

基于上诉第二种方法:

import pandas as pd
import numpy as np
import sys
import argparse

#排列组合起始函数,参数准备
def getSubLists(lis=[], m=0):
    allAns = []
    ans = [None for i in range(m)]
    subLists(lis, m, ans, allAns)
    return allAns
#使用迭代的方式实现排列组合
def subLists(lis=[], m=0, ans=[], allAns=[]):
	#迭代终点
    if m == 0:
        allAns.append(ans.copy())
        return
    #确认参数长度无误
    if len(lis)<m:
        print("short list!")
        return
    length = len(lis)
    #迭代循环
    for iter in range(length-m+1):
        ans[-m] = lis[iter]
        if iter+1 < length:
            subLists(lis[iter+1:], m-1, ans, allAns)
        else:
            allAns.append(ans.copy())
            return
#基于第二种方法的数据筛选函数函数
def selecter(mean, col, allAns=[]):
    df = pd.DataFrame(allAns)
    temp = df
    #计算平均值方差和平均值差
    df['avg'] = temp.mean(axis=1)
    df['std'] = temp.std(axis=1)
    df['d_value'] = abs(df.avg - mean)
    #先进行方差筛选再进行平均值筛选
    df = df[df['std'] == df['std'].min()]
    df = df[df['d_value'] == df['d_value'].min()]
    #清除中间参数
    df.drop(columns=['avg', 'std', 'd_value'], inplace=True)
    #删除原索引,并重新设置索引
    df = df.reset_index(drop=True)
    #当多组数据同时满足上诉条件时,使用第一个满足条件的组合
    if len(df) >1:
        df = df.loc[0]
    #拼接前转置
    df = df.T
    return df

if __name__=='__main__':
	#参数设置,输入输出文件和筛选中需要需要保留的数据个数
    parser = argparse.ArgumentParser(description="试验数据筛选:")
    parser.add_argument('-i', '--infile', help="初始数据文件路径", required=True)
    parser.add_argument('-o', '--outfile', help="筛选后数据文件路径", required=True)
    parser.add_argument('-m', '--num', type=int, help="要保留的数据个数", default = 3)
    #参数实例化
    args = parser.parse_args()
    #获取原始数据
    orign = pd.read_table(args.infile, sep=',')
    #去除重复序号
    orign.trial = orign.trial.apply(func = lambda x:x[:-2])
    #将样品名(字符型)设置为行索引
    orign.set_index("trial", inplace=True)
    #去重,获取不带重复序号的样品名列表
    indexs = orign.index.drop_duplicates()
    for row in indexs:
        for col in orign.columns:
        	#按照数据框的行索引和列索引获得重复数据
            liss = orign.loc[row, col]
            #获取排列组合
            allAns = getSubLists(liss, args.num)
            #筛选数据
            df = selecter(liss.mean(), col, allAns)
            #同一处理不同指标数据(不同列数据)的拼接
            if col != orign.columns[0]:
                single = pd.concat([single, df], axis=1)
            else:
                single = df
        #引入原始数据的列名称
        single.columns = orign.columns
        #插入处理/样品名称(行索引)
        single.insert(loc=0, column='trial', value=row)
        #不同行数据的拼接
        if row == indexs[0]:
            data = single
        else:
            data = pd.concat([data, single])
    #筛选后数据导出
    data.to_excel(args.outfile)

二、试验数据质量的可视化

1.背景介绍

  在进行液相质谱仪和气相色谱试验时,由于同时检测多个指标,试验数据量很大,试验员除了需要进行快速的试验数据筛选以外,还需要及时的进行数据质量的检查,以便于进行及时的补测。尤其在生命科学试验中,试验材料具有时效性并且实验仪器紧张。因此如果能够在数据筛选后,同样使用脚本可视化的展现出试验数据的质量,这将为该类多指标检测、数据量大的试验提供极大的便利,同时也节省了试验员的时间,提高了效率。

2.解决思路

  计算数据标准差与平均值的比值,设置5% 、10%两个阈值将数据分为优、良、不合格三个等级,并且分别用绿、黄、红三总背景颜色可视化的表现。

3.脚本实现

import pandas as pd
import numpy as np
import xlwt

#读取数据文件
df = pd.read_table("./Download/19suger.csv", sep=",")
#去除样品名称的重复序号
df.trial = df.trial.apply(func = lambda x:x[:-2])
#将样品名设置为行索引便于后续进行运算
df.set_index("trial", inplace=True)
#通过行索引进行聚类
grouped  = df.groupby(by=["trial"])
gro_dic = {key:"np.mean"  for key in df.columns}
#计算数据均值
result_mean  = grouped.aggregate({key:eval(value) for key, value in gro_dic.items()})
gro_dic = { key:"np.std" for key in df.columns}
#计算数据标准差
result_std = grouped.aggregate({ key:eval(value) for key,value in gro_dic.items()})
#获取数据均值和标准差的比值
ratio = result_std/result_mean

#初始化,三种背景的设置
perfect = xlwt.easyxf('pattern: pattern solid, fore_colour green; font: bold on;')
acceptable  = xlwt.easyxf('pattern: pattern solid, fore_colour yellow; font: bold on;')
ugly = xlwt.easyxf('pattern: pattern solid, fore_colour red; font: bold on;')
#重新设置行索引,便于数据的定位和引用
df=df.reset_index()
#初始化,创建新的表格并实例化sheet1
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('My Sheet')
#在表格内写入列索引
for column in df.columns:
    worksheet.write(0, list(df.columns).index(column), column)
#在表格内写入行索引
for index in df.index:
    worksheet.write(index+1, 0, df.trial[index])
#循环进行阈值判断,设置各组数据的对应单元格的style(背景色)
for column in df.columns[1:]:
    for index in df.index:
        if ratio.loc[df.loc[index,"trial"], column] < 0.05:
            style = perfect
        elif ratio.loc[df.loc[index,"trial"], column] <0.10:
            style = acceptable
        else:
            style = ugly
        #写入数据并且通过阈值设置背景色
        worksheet.write(index+1, list(df.columns).index(column), df.loc[index, column], style)
#保存数据表格为xls文件
workbook.save('Excel_Workbook.xls')

总结

  本文总结了在进行液相质谱仪和气相色谱等数据量较大并且设置重复较多的试验场景的数据特点,并且给出了博主认为高效的处理方法。
  试验员是相关研究领域的求知者和探索者,应该尽可能的利用自身的时间阅读文献关注领域进展思考总结解决关注领域当下存在的问题,而不应该被低效工作所困扰。因此博主认为总结试验过程,分享高效的方法步骤,也是一件非常有意义的事情。
  接下来的假期,博主会总结一下上学期接触到的X-ray重金属检测仪的使用过程,这样上学期使用到的所有仪器就都总结完了。最后博主会用相当长的时间进行这些脚本的Web化,搭建简易的网站,希望能用,能为自己和身边的人提供便利吧。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页