馬孝宗 王雪山 魏景春
摘? 要:以關(guān)鍵部位維修周期分析為例,詳細闡述了基于Pandas對Excel表格進行數(shù)據(jù)導入、清洗無效行、清洗無效列、數(shù)據(jù)透視、數(shù)據(jù)合并重塑、排序與排名、分組運算的實現(xiàn)過程。該方法解決了關(guān)鍵部位維修周期分析中的存在數(shù)據(jù)量大、基礎(chǔ)數(shù)據(jù)不規(guī)范、計算過程復雜等難點,實現(xiàn)了關(guān)鍵部位維修周期分析的自動化。該方法也適用于人事數(shù)據(jù)、財務(wù)數(shù)據(jù)的年度匯總,具有良好的實用性與推廣價值。
關(guān)鍵詞:Pandas;運維記錄;關(guān)鍵部位;數(shù)據(jù)分析
中圖分類號:TP391? ? ? ?文獻標識碼:A 文章編號:2096-4706(2020)09-0148-03
Maintenance Cycle Analysis of Key Parts Based on Pandas
MA Xiaozong,WANG Xueshan,WEI Jingchun
(Cigarette Rolling Department of Zhumadian Cigarette Factory of Henan Zhongyan Industry Co.,Ltd.,Zhumadian? 463000,China)
Abstract:Taking the maintenance cycle analysis of key parts as an example,the realization process of data import,invalid row cleaning,invalid column cleaning,data perspective,data consolidation and reconstruction,sorting and ranking,grouping operation of Excel tables based on Pandas is described in detail. This method solves the problems of large amount of data,nonstandard basic data and complex calculation process in the analysis of key partsmaintenance cycle,and realizes the automation of the analysis of key partsmaintenance cycle. This method is also applicable to the annual summary of personnel data and financial data,and has good practicability and promotion value.
Keywords:Pandas;operation and maintenance records;key parts;data analysis
0? 引? 言
在先進的卷煙工業(yè)中,一般采用裝備管理系統(tǒng)記錄設(shè)備維修、運行數(shù)據(jù),裝備管理系統(tǒng)是集設(shè)備運行維護、點檢管理、潤滑管理、保養(yǎng)管理、維修管理、零備件申報與發(fā)放為一體的信息系統(tǒng),其提供的維修實施報表和運維報表記錄了機組名稱、維修部位、維修工時、備件費用、設(shè)備總產(chǎn)量、制度時間、保養(yǎng)時間等信息。為了對關(guān)鍵部位進行重點維保,需要摸清各機組的關(guān)鍵部位和對應(yīng)的維修周期,為此需要對多年的維修實施記錄、運維記錄進行統(tǒng)計分析,但該分析過程存在數(shù)據(jù)量大、基礎(chǔ)數(shù)據(jù)不規(guī)范、計算過程復雜等難點,分析過程費時費力。
Pandas是Python的一個數(shù)據(jù)分析包。其提供了大量快速便捷地處理數(shù)據(jù)的函數(shù)和方法,不但包含常見的計數(shù)、篩選、排序、分組運算、描述性統(tǒng)計、數(shù)據(jù)透視、數(shù)據(jù)合并與重塑等分析功能,還提供了自定義函數(shù)功能以滿足用戶個性化的需求。借助Pandas可以對維修實施記錄、運維記錄進行高效的數(shù)據(jù)導入、數(shù)據(jù)清洗、個性化分析。下面介紹基于Pandas進行關(guān)鍵部位維修周期分析的方法。
1? 需求分析
關(guān)鍵部位維修周期分析的數(shù)據(jù)來源包括維修實施記錄、運維記錄兩個Excel文件。維修實施記錄包括機組名稱、維修部位、維修工時、備件費用等信息,運維記錄包括機組名稱、設(shè)備總產(chǎn)量、制度時間、保養(yǎng)時間等信息。關(guān)鍵部位維修周期分析結(jié)果分為兩個階段:第一個階段根據(jù)維修頻次、維修工時、備件費用確定各機組的關(guān)鍵部位;第二個階段根據(jù)維修頻次、制度時間、保養(yǎng)時間確定各機組各關(guān)鍵部位的維修周期。
在關(guān)鍵部位年度維修周期分析中存在以下難點:一是數(shù)據(jù)量大,其數(shù)據(jù)來源于多年的維修實施記錄、運維記錄;二是數(shù)據(jù)不規(guī)范,比如部分記錄的維修部位與機組名稱不標準或設(shè)備總產(chǎn)量為零的無效記錄;三是標題行位置不確定,維修實施記錄、運維記錄自系統(tǒng)導出時有空行且標題行位置不統(tǒng)一;四是關(guān)鍵部位的確定涉及維修頻次、維修工時、備件費用三個因素,計算過程復雜;五是要將各機組關(guān)鍵部位、維修周期等分析結(jié)果匯至一處,便于查看與比對。
2? 編程實現(xiàn)
基于Pandas進行關(guān)鍵部位維修周期分析,包括標題行識別、數(shù)據(jù)導入、數(shù)據(jù)清洗、數(shù)據(jù)分析、數(shù)據(jù)導出五個步驟。
2.1? 編程環(huán)境
編程環(huán)境采用Windows下的Anaconda軟件,Anaconda包含了conda、Python在內(nèi)的大量科學包及其依賴項,以及高效的Python開發(fā)環(huán)境Spyder。具體開發(fā)環(huán)境為:Windows 7/10操作系統(tǒng)、Anaconda3-5.3.0(64 bit)。
2.2? 標題行識別
自裝備管理系統(tǒng)導出的維修實施記錄、運維記錄中既有空行又有表頭,Pandas提供的skip_blank_lines方法可在導入Excel數(shù)據(jù)時跳過空行,卻無法跳過表頭,影響下一步數(shù)據(jù)處理。為此設(shè)計識別標題行的自定義函數(shù),利用空行、表頭導入時產(chǎn)生大量“Unnamed”字符的特點,判斷Excel標題行所在位置并返回正確的數(shù)據(jù)幀。關(guān)鍵代碼如下:
def check_excel(f):
sign = 0#返回正確數(shù)據(jù)幀的標志
for i in range (10):
df = pd.read_excel(f, skiprows=i, header=0)
cols = df.columns.tolist()
cols = [str(s)[:7] for s in cols].count('Unnamed')
if df.shape[1] > cols * 2:#如果標題行Unnamed字符較少
return df#返回該正確數(shù)據(jù)幀
sign = 1
else:
pass
2.3? 數(shù)據(jù)導入
首先獲取當前工作目錄下的所有文件名,判斷文件的后綴名是否是“.xlsx”或“.xls”并且文件名包含“維修實施”或“運維”;接著創(chuàng)建一個標準的機組名稱列表,便于下一步清洗數(shù)據(jù);最后將“維修實施記錄”和“運維記錄”分別導入為Pandas的數(shù)據(jù)幀。根據(jù)自定義函數(shù)check_excel保證數(shù)據(jù)導入時標題行位置正確。關(guān)鍵代碼如下:
files = os.listdir()#遍歷當前目錄下文件名
order_name = ['卷接' + str(i + 1) + '號' for i in range(7)] + ['包裝' + str(i + 1) + '號' for i in range(7)]#創(chuàng)建標準的機組名稱
l_f = []
for f in files:
if (f.endswith('.xlsx') or f.endswith('.xls')) and '維修實施' in f:
l_f.insert(0,f)
elif (f.endswith('.xlsx') or f.endswith('.xls')) and '運維' in f:
l_f.append(f)
else:
pass
if len(sign_f==2):#維修實施表和運維記錄表同時存在才導入數(shù)據(jù)
df_data1 = check_excel(l_f[0])
df_data2 = check_excel(l_f[1])
else:
os._exit(0)
2.4? 數(shù)據(jù)清洗
導入后的數(shù)據(jù)通常包含無效值、缺失值、重復值、錯誤值等,通過數(shù)據(jù)清洗的過程過濾掉不符合要求的數(shù)據(jù)。Pandas中過濾數(shù)據(jù)的常見操作包括篩選、刪除、填充、替換等。維修實施表中需要清洗的數(shù)據(jù)包括三種:一是無效記錄;二是“機組名稱”不標準;三是“部位名稱”不標準。運維記錄表中需要清洗的數(shù)據(jù)包括兩種:一是無效記錄;二是“設(shè)備總產(chǎn)量”為0。通過篩選的方法清洗數(shù)據(jù),關(guān)鍵代碼如下:
df_data1 = df_data1[['機組名稱', '部位名稱', '維修工時(分鐘)', '備件費用']]
df_data2 = df_data2[['機組名稱', '制度班次時間(h)', '保養(yǎng)時間(h)', '設(shè)備總產(chǎn)量']]
df_data1 = df_data1[((df_data1['機組名稱'].isin(order_name))& (~df_data1['部位名稱'].isin(order_name)& (df_data1 ['記錄狀態(tài)']=='已提交'))]]
df_data2 = df_data2[((df_data2['記錄狀態(tài)']=='已提交') & (df_data2['設(shè)備總產(chǎn)量'] > 0))]
2.5? 數(shù)據(jù)分析
Pandas中常用的數(shù)據(jù)分析方式包括數(shù)據(jù)透視、數(shù)據(jù)合并重塑、排序與排名、分組運算等。首先對維修實施記錄進行數(shù)據(jù)透視,統(tǒng)計各機組的維修頻次、維修工時、備件費用;接著依據(jù)維修頻次、維修工時、備件費用進行綜合排名,返回排名前三的關(guān)鍵部位名稱、維修頻次;然后對運行記錄表進行數(shù)據(jù)透視,統(tǒng)計各機組、各部位的生產(chǎn)時間;最后以“機組名稱”為連接鍵合并數(shù)據(jù),得到各機組的關(guān)鍵部位名稱、維修頻次、生產(chǎn)時間并計算出維修周期。關(guān)鍵代碼如下:
df_頻次 = pd.pivot_table(df_data1, index=['機組名稱', '部位名稱'], values=['維修工時(分鐘)'],aggfunc=['count']).reset_index()
df_時間 = pd.pivot_table(df_data1, index=['機組名稱', '部位名稱'], values=['維修工時(分鐘)'],aggfunc=[np.sum]). reset_index()
df_費用 = pd.pivot_table(df_data1, index=['機組名稱', '部位名稱'], values=['備件費用'],aggfunc=[np.sum]).reset_index()
df_data1 = pd.merge(df_頻次, df_時間, on=['機組名稱', '部位名稱'], how='left')
df_data1 = pd.merge(df_data1, df_費用, on=['機組名稱', '部位名稱'], how='left')
df_data1['排名'] = df_data1.groupby(['機組名稱'])['維修頻次'].rank(ascending=False, method='dense') * 0.4+df_data1.
groupby(['機組名稱'])['維修工時'].rank(ascending=False,method ='dense') * 0.4+df_data1.groupby(['機組名稱'])['備件費用'].rank(ascending=False, method='dense')*0.2
df_data1['排名'] = df_data1.groupby(['機組名稱'])['排名'].rank(ascending=True, method='first')
df_result1 = analysis1(df_data1)#自定義函數(shù)返回關(guān)鍵部位
df_result2 = analysis2(df_data1)#自定義函數(shù)返回維修頻次
df_data2 = df_data2[['機組名稱', '制度班次時間(h)', '保養(yǎng)時間(h)', '設(shè)備總產(chǎn)量']]
df_data2['生產(chǎn)時間'] = df_data2['制度班次時間(h)'] - df_data2['保養(yǎng)時間(h)']
df_data2 = pd.pivot_table(df_data2, index=['機組名稱'], values=['生產(chǎn)時間'], aggfunc=[np.sum]).reset_index()
df_data2.columns = ['機組名稱', '生產(chǎn)時間']
df_result2 = pd.merge(df_result2, df_data2, on=['機組名稱'], how='left')
df_result2['維修周期1'] = (df_result2['生產(chǎn)時間'] / df_result2['維修頻次1']).round(0)
df_result2['維修周期2'] = (df_result2['生產(chǎn)時間'] / df_result2['維修頻次2']).round(0)
df_result2['維修周期3'] = (df_result2['生產(chǎn)時間'] / df_result2['維修頻次3']).round(0)
df_result_all = pd.merge(df_result1, df_result2, on=['機組名稱'], how='left')
2.6? 數(shù)據(jù)導出
利用Pandas中的to_excel方法將分析結(jié)果輸出為Excel文件,便于查看、分析與記錄。
writer = pd.ExcelWriter('維修周期分析結(jié)果.xlsx')
df_result_all.to_excel(writer, '維修周期分析結(jié)果', index= None)
writer.save()
3? 結(jié)? 論
對于多年維修實施、運維數(shù)據(jù)的分析,如果缺乏自動、高效的數(shù)據(jù)分析工具,難以解決數(shù)據(jù)量大、基礎(chǔ)數(shù)據(jù)不規(guī)范、計算過程復雜等難點。借助功能強大的Pandas工具,統(tǒng)計人員可以快速、準確地對Excel表格進行數(shù)據(jù)導入、清洗無效行、清洗無效列、數(shù)據(jù)透視、數(shù)據(jù)合并重塑、排序與排名、分組運算等操作。除了Pandas工具自帶的統(tǒng)計分析函數(shù),用戶也可以方便地自定義函數(shù),實現(xiàn)個性化的分析功能,極大地拓展了Pandas的分析能力,有效地提高了分析效率。
參考文獻:
[1] 馬孝宗.基于Pandas定位信息系統(tǒng)中的異常數(shù)據(jù) [J].電腦編程技巧與維護,2019(12):95-96+108.
[2] 張若愚.Python科學計算 [M].北京:清華大學出版社,2012:469-471.
[3] 韋斯·麥金尼.利用Python進行數(shù)據(jù)分析:第2版 [M].徐敬一,譯.北京:機械工業(yè)出版社,2018:10-11.
[4] 托比·西格蘭.集體智慧編程 [M].莫映,王開福,譯.北京:電子工業(yè)出版社,2009:156-157.
作者簡介:馬孝宗(1989—),男,漢族,河南駐馬店人,信息管理員,碩士,研究方向:數(shù)據(jù)分析、機器視覺。