試驗資料的篩選和質量可視化
- 前言
- 一、試驗資料的篩選
- 問題背景
- 解決思路
- 腳本實作:
- 二、試驗資料質量的可視化
- 1.背景介紹
- 2.解決思路
- 3.腳本實作
- 總結
前言
??在試驗程序中,試驗員經常會在試驗中獲得三個以上的試驗資料,在資料處理時再從多個重復中挑選,通常會挑選三個,進行統一的計算方差等資料處理,這個挑選的程序如果通過人為篩選較為費時低效,可以通過腳本計算方差的方式自動選出最接近的三個數值,
??資料篩選出來之后,還需要以最快的方式的知資料的質量,因為試驗材料通常具有時效性,并且如果是使用大型儀器測量的話,儀器的使用時間嚴格控制,因此在最短的時間內獲得資料的質量,有助于試驗員及時補測,
一、試驗資料的篩選
問題背景
??在試驗中,為了讓資料更具有可靠性,試驗員需要在試驗中設定了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)<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化,搭建簡易的網站,希望能用,能為自己和身邊的人提供便利吧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262048.html
標籤:python
上一篇:python基礎語法
下一篇:【資料可視化】基于Dash制作的疫情資料可視化APP(Dash入門必讀,附可運行原始碼)(2021-02-19)
