劉曜碩
(中國人民解放軍63637 部隊 甘肅省酒泉市 732700)
R 語言作為主流統(tǒng)計軟件所發(fā)揮作用逐漸突出,Python 作為面向?qū)ο蟾呒壵Z言,具有簡單易學(xué),易操作的特點。在實際的應(yīng)用中R 語言具有強大的統(tǒng)計分析性能,但是對于大項項目分析和管理存在缺點,而Python 雖然能夠?qū)?shù)據(jù)信息進行準(zhǔn)確的獲取,但是對于數(shù)據(jù)的分析需要通過R 語言作為輔助。因此,將Python 和R 語言加以混合編程能夠?qū)崿F(xiàn)統(tǒng)計運算的良好進行。
Python 是ABC 語言代替品,其提供高效、高級的數(shù)據(jù)結(jié)構(gòu),能夠有效簡單的面向?qū)ο筮M行編程。Python 編程語言設(shè)計風(fēng)格清晰劃一,也正是因為在這一原因Python 編程語言容易讀懂,容易維護,被大量用戶所接受,用途廣泛。Python 編程語言開發(fā)思想為,對特定問題,選擇最為有效的方式解決即可。Python 編程語言是限制性非常強的語言,在編程過程中不良的編程習(xí)慣都將導(dǎo)致編程無法通過編譯。例如if 語句的下一行不向右縮進。在Python 編程語言中最為重要的一點便是縮進規(guī)則。相比其他語言,Python 編程語言最為突出的特點便是模塊界限,其完全有每行首字符位置所決定,而其他語言,例如C 語言則主要使用“{}”確定模塊界限。
Python 編程語言具有簡單、易學(xué)、速度快、開源、免費、可移植性、解釋性、面向?qū)ο?、可拓展性、可嵌入性、豐富的庫、代碼規(guī)范等優(yōu)點。
首先Python 編程語言是簡單思想語言,閱讀良好的Python 編程員對Python 編程的閱讀就如同在閱讀英語,其能夠促使相關(guān)人員更加專注的解決問題,而不是對語言本身進行摸索。也正是因為Python 編程語言的簡單性,對于Python 學(xué)習(xí)比較簡單,因為在Python 中有說明文檔。Python 編程語言底層是通過C 語言進行編寫的,多數(shù)標(biāo)準(zhǔn)款、第三方庫則是通過C 語言進行編寫的,因此運行速度較快。另外,Python 為FLOSS 之一,應(yīng)用者能夠自由發(fā)布軟件拷貝,對其源代碼進行閱讀、改動,并且可以將其應(yīng)用至新自由軟件內(nèi)。開源本質(zhì)促使Python 能夠移植至多個平臺中,例如z/OS、BeOS、OS/2 等。解釋性為用編譯性語言,例如C 語言或C++語言編寫程序能夠由源文件轉(zhuǎn)換至用戶計算機所使用的語言。此過程通過編譯器以及不同標(biāo)記、選項共同完成。當(dāng)對程度進行運行時,轉(zhuǎn)載器/連接軟件將用戶程序復(fù)制至內(nèi)存中運行。但是Python 編程語言蘇編寫的程序不用編譯為二進制便能夠在源代碼中運行相關(guān)程序。計算機的內(nèi)部,Python 解釋器將源代碼轉(zhuǎn)化成字節(jié)碼中間形式,之后將其翻譯為計算機語言運行,使得Python 編程應(yīng)用更加簡單,程序容易移植。面向?qū)ο髣t是Python 編程支持面向過程編輯,同時支持面向?qū)ο缶幊?。面向過程語言中,程序由過程或者僅是使用重用代碼函數(shù)構(gòu)建。面向?qū)ο笳Z言中,Python 程序有功能和數(shù)據(jù)組合對象構(gòu)建??蓴U展性為能夠?qū)ython 編程語言嵌入至C 語言和C++語言中,提供腳本功能。在Python 中具有龐大的標(biāo)準(zhǔn)庫,其能夠?qū)Ω鞣N工作進行處理,例如密碼系統(tǒng)、線程、GUI、文檔生成、數(shù)據(jù)庫、電子郵件、TK 等。除標(biāo)準(zhǔn)庫外[1],Python 還具有高質(zhì)量庫,例如圖像庫、Twisted 等。最后,Python 編程縮進方式是代碼連續(xù)性良好,代碼規(guī)范,在對程序進行編寫是不用將其編譯為二進制。
R 語言為統(tǒng)計分析軟件,及圖像顯示、統(tǒng)計分析為一體,能夠應(yīng)用至Mac 和Windows 系統(tǒng)中。R 語言特點具有以下特點:首先,R 語言為自由軟件,意味著R 語言完全免費,能夠在其網(wǎng)站鏡像內(nèi)下載相關(guān)安全程序、程序包、文檔資料以及源代碼,標(biāo)準(zhǔn)安裝文件中具有多個模塊、統(tǒng)計函數(shù),在進行安裝后便能夠進行常用統(tǒng)計。其次,R 語言為可編程語言,其作為開放統(tǒng)計編輯,語言易懂,易學(xué),并且進行學(xué)習(xí)后編程者能夠通過編制函數(shù)拓展語言。同時R 語言中所有函數(shù)以及數(shù)據(jù)都保存于程序包中,當(dāng)載入包時,相關(guān)內(nèi)容才能夠被運行,內(nèi)容方可被訪問。部分基本和常用程序包多收入至標(biāo)準(zhǔn)安裝文件中。新統(tǒng)計方式的出現(xiàn),安裝文件中的程序包也會隨之發(fā)生變化。另外版安裝文件內(nèi),包括base、mle、ts、mva、survival等模塊。R 語言互動性較強,除圖像輸出,其余輸出輸入窗口均在同一窗口,在輸入語法內(nèi)若發(fā)生錯誤將立即在窗口中提示,對以往輸入命令存在記憶功能,能夠?qū)⒁酝斎胫噶钫{(diào)出,并加以編輯修改。輸出圖形能夠?qū)NG、BMP、JPG 圖像格式進行直接地保存,同時能夠?qū)DF 文件進行直接地保存,在數(shù)據(jù)庫和編程語言中具有良好接口。
Python 調(diào)用使用R 語言為Python 計算機語言中rpy2 程序庫。其能夠?qū)崿F(xiàn)Python 編程語言讀取調(diào)用R 語言函數(shù)、對象以及方法。如果操作系統(tǒng)安裝R3.0 和Python2.7 以上的版本時,命令行中運行pip install rpy2 便能夠?qū)Τ绦驇爝M行安裝。Rpy2 有調(diào)取方式分為兩種:低級接口和高級接口。
在R 語言中底層的減法、加法、乘方、循環(huán)、開方等基礎(chǔ)運算,運算速度比較慢,由于R 語言屬于解釋型的語言,處理器對每一句代碼進行臨時的編譯,下達指令后進行計算。但在矩陣運行方面速度較快,尤其是存在多個統(tǒng)計運算包的情況時,能夠直接由C 語言層面對復(fù)雜統(tǒng)計語言進行運算,甚至有時能夠超過Python中scipy、numpy 運算庫的運行效率。在rpy2 低級接口主要用于高級接口沒有封裝或者對于運算性能具有特殊需求時。Python 引入rpy2.rinterface 模塊便能夠?qū)Φ图壗涌诩右允褂?,例如In4:
需要注意在其中需要使用initr()函數(shù)對R 語言進行初始化,確保后續(xù)接口的正常使用。同時需要注意的是此代碼只能夠進行一次運行,避免出現(xiàn)錯誤。
對于低級接口的調(diào)用方式和高級接口相似,差異處為低級接口能夠?qū)Ξ?dāng)前R 運行環(huán)境內(nèi)R 語言對象進行訪問,此過程通過rpy2.rinterface.globalenv 中g(shù)et 函數(shù)完成,此函數(shù)將在Python 中構(gòu)建指向R 語言環(huán)境sexp 指針對象。
通過相關(guān)操作可以發(fā)現(xiàn),低級接口無法對R 語言結(jié)果直接通過print 函數(shù)進行打印,由于Python 中儲存對象實際指向內(nèi)存地址。對具體數(shù)據(jù)進行訪問需要對變量下標(biāo)進行訪問,例如通過PearsonX2 進行檢驗之后通過下標(biāo)對P 值、自由度、統(tǒng)計量加以表示[2]。
Python 引入rpy2.robjects 模塊便能夠?qū)Ω呒壗涌诩右允褂?,例如In1:import rpy2.robjects as robjects。
之后將rpy2.Robjects.r 內(nèi)封裝R 語言對象簡寫為robjects.r。對于R 語言高級接口應(yīng)用首先需要在Python 內(nèi)建立R 語言矩陣對象。通過比較分析,通過rpy2.robjects.IntVector 把Python 內(nèi)list 元素轉(zhuǎn)化為R 語言內(nèi)常用數(shù)據(jù)結(jié)構(gòu)——向量,相當(dāng)于R 語言內(nèi)通過data=C(99,75,5,21)創(chuàng)建向量。另外,在rpy2.robjects.r 內(nèi)集成矩陣函數(shù),將Python 內(nèi)創(chuàng)建向量作為參數(shù),對列數(shù)、行數(shù)加以確定后,便能夠在Python 內(nèi)使用R 語言矩陣對象。相同,能夠通過rpy2.robject.DataFrame 對R 語言數(shù)據(jù)框進行定義。其中rpy2.robjects.r[r—code]中,如果把r— code 換為R 語言內(nèi)的變量名或函數(shù)名,將其賦值為Python 變量,便能夠創(chuàng)建對應(yīng)的函數(shù)或者變量Python 對象。將R 語言內(nèi)chisq.test 的函數(shù)賦值至變量chisq—test 內(nèi)創(chuàng)建函數(shù)對象,之后把chisq—test 作為普通Python 的函數(shù)進行使用。對于函數(shù)參數(shù)的設(shè)置和R 語言保持一致。在完成后,將之前創(chuàng)建數(shù)據(jù)放至chisq—test 中作參數(shù),并能夠得出相關(guān)的檢驗結(jié)果。因此,Python 通過rpy2 調(diào)取R 語言中統(tǒng)計函數(shù)非常簡便,同時程序可讀性較強。
通過weather underground 所提供氣候數(shù)據(jù)接口,對廣州近五年氣溫數(shù)據(jù)獲取,之后按照相關(guān)數(shù)據(jù)對廣州未來天氣情況進行預(yù)測,并通過R 語言程序包開展時間序列制圖。
通過Python 內(nèi)bs4 庫和urllib2 庫中Beauti—fulSoup 模塊對網(wǎng)頁數(shù)據(jù)進行獲取,urllib2 為Python 中獲取URLs 相關(guān)組件,其對指定URL 發(fā)出相應(yīng)請求,實現(xiàn)數(shù)據(jù)信息的獲取,在此通過GET 方式請求網(wǎng)站氣象數(shù)據(jù)相應(yīng)接口,之后對指定城市,指定時間內(nèi)氣象數(shù)據(jù)進行獲取。BeautifulSoup 模塊主要是提供處理導(dǎo)航、修改分析樹、搜索函數(shù),利用解析文檔向用戶提供數(shù)據(jù)抓取服務(wù)。在此通過應(yīng)用該模塊能夠自由按照實際需求對urllib2 庫所獲取氣象數(shù)據(jù)進行提取,例如廣州地區(qū)天氣氣溫、濕度、風(fēng)向、風(fēng)力以及日出日落時間。如果只需要獲取氣溫數(shù)據(jù),則可通過BeautifulSoup 模塊對urllib2中數(shù)據(jù)進行單獨提取。
因為所獲取的氣溫數(shù)據(jù)單位是華氏度,需要將相關(guān)數(shù)據(jù)轉(zhuǎn)換成攝氏度。通過Python 需要通過循環(huán)語句對數(shù)據(jù)進行逐一地轉(zhuǎn)換,但是R 語言中通過利用其矩陣特性,data.frame 數(shù)據(jù)框內(nèi)僅需一句代碼便能夠進行批量轉(zhuǎn)換。如全文所提。通過rpy2.robject.DataFrame 在R 語言內(nèi)定義一個數(shù)據(jù)框,便能夠進行數(shù)據(jù)轉(zhuǎn)換工作[3]。
通過R 語言forecast 程序包生成、預(yù)測序列數(shù)據(jù)。第一,通過msts 函數(shù)建立具有季節(jié)效應(yīng)時間序列,為實現(xiàn)簡單便捷,將季節(jié)效應(yīng)時間設(shè)定成1年,將seasona1.periods 設(shè)置成365.25。之后通過tbats 函數(shù)將數(shù)據(jù)放入TBATA 模型中進行空間建模。通過forecast生成預(yù)測數(shù)據(jù)。
對數(shù)據(jù)進行分析后,便能夠通過R 語言ggplot2 程序包進行可視化作圖,需要注意,rpy2 已經(jīng)被封裝與R 語言ggplot2 程序包內(nèi),只需要在Python 中引入 rpy2.robjects.1ib.ggplot2 模塊便可在Python 內(nèi)通過ggplot2 函數(shù)作圖。
本文對Python 與R 語言混合編程方法進行分析,并通過實際案例對Python+R語言編程的數(shù)據(jù)獲取與統(tǒng)計運算可行性進行展示。在應(yīng)用過程中對Python 與R 語言優(yōu)勢進行結(jié)合,在其中兩種語言對各自發(fā)揮作用。對于該技術(shù)的應(yīng)用需要在實際研究中加以充分開發(fā),從而實現(xiàn)Python 與R 語言混合編程廣泛應(yīng)用。