試驗資料的篩選和質量視覺化

ckxllf發表於2021-02-22

  前言

    在試驗過程中,試驗員經常會在試驗中獲得三個以上的試驗資料,在資料處理時再從多個重複中挑選,通常會挑選三個,進行統一的計算方差等資料處理。這個挑選的過程如果透過人為篩選較為費時低效,可以透過指令碼計算方差的方式自動選出最接近的三個數值。

    資料篩選出來之後,還需要以最快的方式的知資料的質量。因為試驗材料通常具有時效性,並且如果是使用大型儀器測量的話,儀器的使用時間嚴格控制。因此在最短的時間內獲得資料的質量,有助於試驗員及時補測。

  一、試驗資料的篩選

  問題背景

    在試驗中,為了讓資料更具有可靠性,試驗員需要在試驗中設定了3個以上的重複。但是平常的方差分析等,只需要3個資料就可以了。因此試驗員常常需要在各個重複中選出最為接近的三個資料。這個過程是必須以計算為基礎的,直觀上很難快速看出資料的接近程度,並且試驗通常處理數較多,各處理的資料需要單獨篩選,使得篩選過程單調複雜。但是如果能夠將篩選資料的方法用指令碼表達出來,這將大大簡化資料篩選的效率,節省試驗員的時間。

  解決思路

  本文構想的資料篩選方法有兩種:

  基於排序和差值的篩選方法:將重複資料先按照升/降序排列,然後計算相鄰資料的差值,再計算相鄰兩個差值的和,和最小的相鄰三個資料即是重複性最好的三個資料。

  基於排列組合和平均值的篩選方法:使用排列組合的方法獲得從重複資料中選出三個資料的所有組合,然後分別計算每個組合的平均值和方法,方差最小並且平均值最接近總體平均值的組合即是重複性最好的組合。

  指令碼實現:

  基於上訴第二種方法:

  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)

  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')

  總結

  本文總結了在進行液相質譜儀和氣相色譜等資料量較大並且設定重複較多的試驗場景的資料特點,並且給出了博主認為高效的處理方法。

  試驗員是相關研究領域的求知者和探索者,應該儘可能的利用自身的時間閱讀文獻關注領域進展思考總結解決關注領域當下存在的問題,而不應該被低效工作所困擾。因此博主認為總結試驗過程,分享高效的方法步驟,也是一件非常有意義的事情。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2758352/,如需轉載,請註明出處,否則將追究法律責任。

相關文章