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