昌吉市濱湖鎮(zhèn)農(nóng)(牧)業(yè)發(fā)展服務(wù)中心 范治璇 楊樹楠 余桂玲
Python和R作為一種高效的數(shù)據(jù)整合工具,順應(yīng)了各類管理數(shù)據(jù)處理自動化快速發(fā)展需求。這類數(shù)據(jù)處理軟件要求使用者具備一定的C或C++計算機語言基礎(chǔ)。對于新時代農(nóng)機管理人員而言,大多具備機械電子類教育背景,一般對C類計算機語言比較熟悉,在此基礎(chǔ)上開展Python和R的應(yīng)用已經(jīng)具備了人員素質(zhì)條件要素。Python和R語言環(huán)境本身具有眾多的擴展庫,其處理海量數(shù)據(jù)能力的特點十分適合工程技術(shù)、科研人員處理數(shù)據(jù)、制作圖表,甚至開發(fā)科學(xué)計算應(yīng)用程序。在數(shù)據(jù)處理中應(yīng)用該程序可以有效地提高工作效率?,F(xiàn)就對Python和R在農(nóng)機數(shù)據(jù)管理中的使用方法做如下介紹。
Python語言結(jié)構(gòu)比較簡單,關(guān)鍵字相對其他語言少很多,而且語法定義明確,對初學(xué)者更容易掌握,學(xué)習(xí)過程較為友好。由于Python代碼定義更清晰,使其便于該軟件使用者閱讀理解。
Python的開放源代碼特性及容易維護是它可以大范圍使用的關(guān)鍵。Python有廣泛的跨平臺的標準庫,兼容UNIX、Windows和Macintosh等主流操作系統(tǒng),能移植到多重平臺。對于使用者個人不愿意開放的一些算法,可以先使用C或C++完成算法部分的程序,然后在Python程序中調(diào)用。在互動模式支持下,可以從終端輸入執(zhí)行代碼獲得結(jié)果以進行互動測試和代碼片段的調(diào)試。
作為一個功能完善、強大的語言python的pandas庫中的merge()支持各種內(nèi)外連接。工作表數(shù)據(jù)合并方式包括左連接、右連接、內(nèi)連接、全連接。在處理兩個表格數(shù)據(jù)時,左連接是以左邊的表格為基準表把右邊的數(shù)據(jù)合并過來,右連接是以右邊的表格為基準表把左邊的數(shù)據(jù)合并過來,內(nèi)連接則是把左邊表格和右邊表格中同樣的數(shù)據(jù)類型進行合并,全連接則是把左邊和右邊表格全部數(shù)據(jù)都進行合并。合并時確定一個鍵值作為變量進行合并時的參照。
2.1.1 基本的合并方法。
合并是基于Pandas庫運行,因此先應(yīng)將所需處理的數(shù)據(jù)導(dǎo)入pandas庫再進行下一步操作,如有兩張工作表“D1農(nóng)機購置補貼資金發(fā)放明細表2019”“D2農(nóng)機購置補貼資金發(fā)放明細表2020”,先要導(dǎo)入庫:importpandasaspd,然后才能將這兩個表合并起來,對于表中“姓名-機型-補貼值”項,鍵值為姓名,基本語句為:merge(D1,D2,on='姓名'),如不指定,則默認內(nèi)連接(inner)。左連接時,基本語句為:merge(D1,D2,on='姓名',how='left')。右連接時,基本語句為:merge(D1,D2,on='姓名',how='right')。全合并時基本語句為:merge(D1,D2,on='姓名',how='outer')。以上的幾種合并,都是按照表中姓名來合并的,兩個表姓名一樣,即將這條數(shù)據(jù)合并,這個姓名被稱為鍵值,作為一個變量被用來作為合并參照。
2.1.2 特殊情況合并方法
對于鍵值名不一樣的合并方法,如上例D1和D2表格中都有一個變量“姓名”,假如這兩個表的鍵值的名字分別為“機型”“生產(chǎn)廠家”,這種情況只要用left_on=和right_on=分別指定兩個鍵的名字即可,語句為:merge(D1,D2,left_on='機型',right_on='生產(chǎn)廠家')。如果上例表格D1的鍵值是變量,D2的鍵值是一個索引,合并時使用?left_index=True或?right_index=True語句,來聲明某個數(shù)據(jù)的索引應(yīng)該被當(dāng)作鍵值,基本語句為:merge(D1,D2,left_on='姓名',right_index=True)。
對于有一樣變量名的兩個數(shù)據(jù)列的合并方法。如兩個數(shù)據(jù)表有本區(qū)域數(shù)名農(nóng)機登記所有人近兩年的審驗數(shù)據(jù),數(shù)據(jù)名為“2019農(nóng)機審驗記錄表”“2020農(nóng)機審驗記錄表”。生成語句為:2019農(nóng)機審驗記錄表=pd.DataFrame({'姓名':[張非,李俊,王欣,趙龍],'審驗情況':[已審驗,已審驗,已審驗,已審驗]}),生成語句為:2020農(nóng)機審驗記錄表=pd.DataFrame({'姓名':[張非,李俊,王欣,趙龍],'審驗情況':[已審驗,未審驗,未審驗,已審驗]})。運行后,兩個'審驗情況'會自動打上后綴,一個是_x,一個是_y,使用者也可以自己加后綴,使用suffixes=()?選項。比如將后綴變?yōu)椋篲2019和_2020,基本語句為:merge(2019農(nóng)機審驗記錄表,2020農(nóng)機審驗記錄表,on='姓名',how='left',suffixes=('_2019','_2020’))
縱向合并也稱為堆疊。比如,把上述農(nóng)機購置補貼資金發(fā)放明細表分成兩個部分。堆疊的基本語句為:concat([D1,D2]),堆疊起來的數(shù)據(jù),可以用?keys=[,]?標記出哪部分來自D1,哪部分來自D2,基本語句為:concat([D1,D2],keys=['D1','D2'])。另外,還存在直接將兩個數(shù)據(jù)橫向堆在一起的橫向堆疊,其與橫向合并的區(qū)別就是指定了axis=1。
文本數(shù)據(jù)文件可以直接用pandas中的pd.read_csv('filename')命令直接讀寫。應(yīng)注意,如果直接寫入,則會覆蓋源文件,所以在寫之前先讀取一下文件,再進行寫入,則寫入的數(shù)據(jù)會添加到文件末尾而不會替換掉原先的文件。通過read()命令讀取文件后,指針會移到文件的末尾,再寫入數(shù)據(jù)就不會有問題了。
R是從S語言演變而來的一種基于對象的強類型語言,是一種代碼全部公開免費使用的開源軟件,可以在多種操作系統(tǒng)中運行,其語法靈活、結(jié)構(gòu)簡單。
R語言對象有多種屬性,類是其中重要的屬性之一。最基本的類包括數(shù)值、邏輯、字符、復(fù)數(shù)、因子,符合類包括矩陣、數(shù)組、因子、數(shù)據(jù)框。R可以在編寫函數(shù)和腳本后根據(jù)需要輸入命令,進行批處理運算。特定的分析功能需要用相應(yīng)的R程序包實現(xiàn)。每個R程序包包括R函數(shù)、數(shù)據(jù)、幫助文件、描述文件等內(nèi)容。
R語言編程不需要申明變量,使用者編寫的程序可直接調(diào)用,編程靈活但區(qū)分字母大小寫,比如邏輯向量運算:TRUE,F(xiàn)ALSE全部大寫;isTRUE(x)判斷x為TRUE。通常,一個命名必須以點(.)或者字母開頭,如果以點(.)開頭,第二個字符不允許是數(shù)字,但數(shù)字可以放在中間或結(jié)尾?;久钣斜磉_式和賦值兩種形式。命令可以用分號(;)隔開或另起一行?;久钣么罄ɑ?{})放在一起構(gòu)成一個復(fù)合表達式。在一行命令中,從#號開始到句子收尾之間的語句是注釋。
第一種方法:使用剪貼板,調(diào)用read.table函數(shù),先選擇農(nóng)機管理數(shù)據(jù)Excel中的數(shù)據(jù)源,然后進行復(fù)制;在Rstudio中輸入腳本read.table("clipboard",header=TRUE),回車即可。注:header=TRUE,表示首行為標題行,若為FALSE則標題行也算在正文第一行。
第二種方法:先將農(nóng)機管理數(shù)據(jù)Excel另存為csv文件,使用read.csv函數(shù)打開Excel數(shù)據(jù)源,然后另存為Agrimachine.csv文件;然后在Rstudio中輸入代碼read.csv("C:/Users/Administrator/Desktop/Agrimachine./Agrimachine.csv",header=TRUE),回車即可。
第三種方法:將農(nóng)機管理數(shù)據(jù)Excel另存為txt文本文件,然后使用read.table函數(shù);打開Excel數(shù)據(jù)源,另存為Agrimachine.txt文件;路徑為【C:UsersAdministratorDesktopAgrimachine】,然后在Rstudio中輸入代碼read.table("C:/Users/Administrator/Desktop/Agrimachine/Agrimachine.txt",header=TRUE),回車即可。
第四種方法:使用RODBC中的odbcConnectExcel來創(chuàng)建與Excel的連接,獲取農(nóng)機管理數(shù)據(jù)Excel中的數(shù)據(jù);由于2007、2010版xlsx格式的Excel文件導(dǎo)入R語言可能會出現(xiàn)錯誤提示,可先調(diào)用xlsx包來讀取這類版本格式的電子表格,因此在從快捷實用方面考慮還是建議采用前三種方法導(dǎo)入Excel數(shù)據(jù)。
readr包在R中提供了若干函數(shù)以讀取數(shù)據(jù)。通常用R中的read.table函數(shù)來完成工作表數(shù)據(jù)讀入任務(wù)。readr包提供了許多替代函數(shù),既增加了額外的一些功能也提高了運行速度。有測試顯示,用不同的指令完成相同的任務(wù),read.table用時50.62秒,而read_table用2.76秒,其原因在于read_table把數(shù)據(jù)當(dāng)作固定格式的文件,并且利用C++快速處理數(shù)據(jù)。因有更高的效率,在一些場合read_table幾乎代替了read.table。
對于Excel格式的數(shù)據(jù),可以在R軟件安裝readxl包。readxl包提供的函數(shù)可以讀取.xls和.xlsx格式的工作表。其read_execl函數(shù)和readr中的函數(shù)同樣都是基于C++語言庫的,讀取速度迅速。需強調(diào)的是readxl包沒有任何的外部依賴,可以不安裝Excel就可以在任意平臺上用它來讀取數(shù)據(jù)。
使用read.table函數(shù)以數(shù)據(jù)框的格式讀入.txt數(shù)據(jù),適合讀取要求每列的數(shù)據(jù)類型相同的混合模式的數(shù)據(jù)。通常read.table只需要有文件路徑、URL或連接對象就可以讀取數(shù)據(jù),而且可以設(shè)置各類參數(shù),所以非常方便。
數(shù)據(jù)中含有中文時,導(dǎo)入前應(yīng)設(shè)置中文轉(zhuǎn)碼參數(shù),否則直接導(dǎo)入可能出現(xiàn)不識別中文情況。字符型數(shù)據(jù)讀入時會自動轉(zhuǎn)換為因子,因子是R中的變量,由于因子只能取有限的幾個不同值,將數(shù)據(jù)保存為因子可確保模型函數(shù)能夠正確處理。但是當(dāng)變量作為簡單字符串使用時可能出錯。防止字符串轉(zhuǎn)換為因子可采用輸入?yún)?shù)、更改系統(tǒng)選項、指定抑制轉(zhuǎn)換的列等方式來實現(xiàn)。也可通過一個索引向量指定,或者一個邏輯向量,在需要轉(zhuǎn)換的列取值FALSE,不需要轉(zhuǎn)換的列取值TRUE。
以上,簡單介紹了Python和R在農(nóng)機管理過程中進行一些工作表格和文本數(shù)據(jù)處理的應(yīng)用場景,目的只是希望對廣大農(nóng)業(yè)農(nóng)機管理人員主動掌握這些實用化數(shù)據(jù)管理工具起到拋磚引玉的推動作用,但要想熟練掌握并使用這類工具,就必須深入學(xué)習(xí)和參閱相關(guān)教程及文獻,不斷在實踐中完善操作技能,舉一反三,就能極大地提升工作效率,也一定能使農(nóng)機管理技術(shù)人員順應(yīng)新時代要求并以全新面貌展現(xiàn)在世人面前。