蔡振海
(江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院,江蘇 南京 211168)
隨著技術(shù)的發(fā)展,生活中處處有數(shù)據(jù),處處用數(shù)據(jù)。但因?yàn)榉N種原因,經(jīng)常會(huì)存在一些異常數(shù)據(jù),比如采集手段、儀器精度、存儲(chǔ)運(yùn)輸不當(dāng)?shù)仍斐蓴?shù)據(jù)精度不夠、數(shù)據(jù)項(xiàng)缺失、數(shù)據(jù)單位不對(duì)等,這些異常數(shù)據(jù)對(duì)結(jié)果有著極大的影響[1]。如何消除異常數(shù)據(jù)并替換為合理數(shù)據(jù)在大數(shù)據(jù)分析中是一項(xiàng)十分關(guān)鍵且重要的工作[2]。大數(shù)據(jù)時(shí)代,對(duì)數(shù)據(jù)和大數(shù)據(jù)進(jìn)行分析和可視化是一項(xiàng)重要的工作,也是一項(xiàng)重要的技能。對(duì)于數(shù)據(jù)的處理和分析需要借助專業(yè)的軟件和相應(yīng)的編程軟件,Python 擁有非常強(qiáng)的擴(kuò)展性、運(yùn)行速度非常快、代碼量少、易上手、數(shù)據(jù)處理包豐富等特點(diǎn),被廣泛運(yùn)用到人工智能、大數(shù)據(jù)分析、網(wǎng)絡(luò)爬蟲等方面[3]。本文使用Python 的開源發(fā)行版本Anaconda3 對(duì)數(shù)據(jù)進(jìn)行處理分析。Anaconda 是專門為了方便使用Python 進(jìn)行數(shù)據(jù)研究而建立的一組軟件包,涵蓋了數(shù)據(jù)科學(xué)領(lǐng)域常見的Python庫(kù)[4]。
Python 由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì)的吉多·范羅蘇姆于20世紀(jì)90年代初設(shè)計(jì),作為一門叫作ABC 語言的替代品。Python 提供了高效的高級(jí)數(shù)據(jù)結(jié)構(gòu),還能簡(jiǎn)單有效地面向?qū)ο缶幊蹋浜?jiǎn)單、易學(xué)、易讀、易維護(hù)、用途廣、速度快、免費(fèi)、開源、可移植性、可嵌入性、豐富的庫(kù)等優(yōu)點(diǎn)深受廣大使用者喜歡[5]。但Python 對(duì)于初學(xué)使用者來說由于版本和環(huán)境配置等問題,往往會(huì)讓初學(xué)者花費(fèi)許多時(shí)間來配置環(huán)境,經(jīng)常因?yàn)榕渲铆h(huán)境或者版本等原因使得Python 程序無法運(yùn)行[6]。Anaconda是一個(gè)用于Python科學(xué)計(jì)算和機(jī)器學(xué)習(xí)的開源工具,它是Python 的發(fā)行版本,支持Linux、Macocy 以及Windows 系統(tǒng),包含numpy 等許多工具包和依賴項(xiàng),提供了管理包和管理環(huán)境,能用于解決開發(fā)過程中可能遇到的Python 多版本問題和第三方庫(kù)的安裝、使用等問題。
Anaconda是基于conda的Python數(shù)據(jù)和機(jī)器學(xué)習(xí)的開發(fā)平臺(tái)。conda是虛擬環(huán)境工具和包管理工具集合體,可以用于各種開發(fā)語言。其資源庫(kù)上有上萬個(gè)第三方庫(kù)供學(xué)習(xí)和開發(fā)者使用[7]。Python是Anaconda自帶的,無須使用者再次安裝,并且配置好了運(yùn)行環(huán)境,免去了麻煩的配置環(huán)境步驟,因此受到廣大使用者的喜歡。Anaconda 由于其自帶的大量數(shù)據(jù)科學(xué)包和依賴項(xiàng),使用者可以在安裝后立即進(jìn)行數(shù)據(jù)處理。
采集的天氣數(shù)據(jù)以CSV格式進(jìn)行保存,包含溫度和相對(duì)濕度兩個(gè)數(shù)據(jù)項(xiàng)。表1和表2顯示了天氣數(shù)據(jù)表的前15 行和后15 行,需要讀取的溫度數(shù)據(jù)在數(shù)據(jù)表的第二列。從數(shù)據(jù)表中可以看出存在數(shù)據(jù)缺項(xiàng)以及數(shù)據(jù)異常的情況,比如序號(hào)5的溫度值為空格,序號(hào)8 的溫度值為100 攝氏度,正常天氣溫度應(yīng)該在40 攝氏度以下。為了方便處理數(shù)據(jù),使用NumPy讀取采集的天氣數(shù)據(jù)。

表1 天氣數(shù)據(jù)前15行
NumPy(Numerical Python)是Python 的一種開源的數(shù)值計(jì)算擴(kuò)展。這種工具可用來存儲(chǔ)和處理大型矩陣,比Python 自身的嵌套列表(Nested List Structure)結(jié)構(gòu)要高效得多(該結(jié)構(gòu)也可以用來表示矩陣(matrix)),支持大量的維度數(shù)組與矩陣運(yùn)算,此外也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫(kù)。在數(shù)據(jù)分析和機(jī)器學(xué)習(xí)中,大量地使用科學(xué)計(jì)算,Numpy[8]提供了大型矩陣計(jì)算的方式,而這些是Python標(biāo)準(zhǔn)庫(kù)中所缺少的。Numpy也是許多優(yōu)秀的第三方庫(kù)的基礎(chǔ),依賴于Numpy的庫(kù)非常多。
在進(jìn)行數(shù)據(jù)分析時(shí),最重要的一步就是數(shù)據(jù)的獲取,即如何讀取到已有的數(shù)據(jù)。常用的保存數(shù)據(jù)文件的類型有TXT、CVS、JSON、Excel、XML 等。讀取這些類型的數(shù)據(jù)常用Numpy 包中的已有函數(shù)loadtxt(),并根據(jù)需要將讀取到的需要處理的數(shù)據(jù)保存為某一種格式。
Anaconda平臺(tái)中已包含有Numpy包,不需要再進(jìn)行第三方的安裝操作,但在使用時(shí)需要進(jìn)行導(dǎo)包操作,然后使用loadtxt()函數(shù)讀取數(shù)據(jù)表中的溫度數(shù)據(jù)。從數(shù)據(jù)截圖中可以看出溫度數(shù)據(jù)在第2列,所以設(shè)置loadtxt()函數(shù)中控制讀取列的參數(shù)usecols 的值為1。具體代碼如下所示:

print("讀取的溫度數(shù)據(jù)是: ",str_temperature)
從Anaconda3 控制臺(tái)可以看到讀取的溫度數(shù)據(jù),每個(gè)數(shù)據(jù)值前面都有b’這個(gè)字符串,說明此時(shí)是以字符串的形式讀取了數(shù)據(jù)表中的溫度數(shù)據(jù)。缺項(xiàng)值以空字符串的形式讀取,異常值正常進(jìn)行讀取,結(jié)果如圖1所示:

圖1 讀取的溫度字符串值
由于字符串形式的數(shù)據(jù)在處理和分析具有一定的局限性,為了便于后期數(shù)據(jù)的處理,將讀取的字符串?dāng)?shù)據(jù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù),并將空值項(xiàng)用None代替。代碼和結(jié)果如圖2所示:

圖2 處理控制代碼圖
從圖3 中可以看出,所有的溫度數(shù)據(jù)已經(jīng)轉(zhuǎn)換為了浮點(diǎn)型數(shù)據(jù),切空值項(xiàng)也用None 進(jìn)行了替代。但是很難直接從上面的浮點(diǎn)型數(shù)據(jù)進(jìn)行分析、處理。為了便于對(duì)數(shù)據(jù)進(jìn)行分析并直觀查看異常溫度數(shù)據(jù)對(duì)于整個(gè)數(shù)據(jù)分析的影響,使用Matlab 中的plot()函數(shù)將結(jié)果繪制成圖。在Anaconda3 中使用plot()函數(shù)需要導(dǎo)入matplotlib.pylot。具體代碼和繪制的圖形如圖4、圖5所示:

圖3 讀取的浮點(diǎn)型溫度值

圖4 繪制溫度曲線代碼

圖5 含有異常值和缺省值的溫度曲線
從圖5中可以看出,由于異常值和缺項(xiàng)值的存在,繪制的圖形存在明顯錯(cuò)誤,且不合理。比如曲線不連續(xù)、曲線明顯過高等。為了盡可能地使數(shù)據(jù)更加符合實(shí)際,需要對(duì)異常值和缺項(xiàng)值進(jìn)行一定數(shù)學(xué)方法的處理,這樣得出的數(shù)據(jù)進(jìn)行分析才具有科學(xué)性,并能產(chǎn)生一定的實(shí)際意義[9]。
對(duì)于存在的異常值,要先讀取異常值,然后針對(duì)異常值進(jìn)行處理。本文先將異常值讀取,用None 進(jìn)行代替,形成缺省值。再統(tǒng)一對(duì)缺省值進(jìn)行相應(yīng)的數(shù)學(xué)處理。從溫度圖表中可以看出,此地采集的溫度數(shù)據(jù)值范圍處于春夏季之時(shí),由于正常天氣一般不超過40攝氏度,且從采集的數(shù)據(jù)表中可以看出溫度應(yīng)在16~40攝氏度。對(duì)于大于40攝氏度的值作為異常值進(jìn)行處理,用None 替代。使用for 循環(huán)對(duì)異常值進(jìn)行處理,處理異常值的代碼如下:

在控制臺(tái)輸出的結(jié)果如圖6所示:

圖6 用none替代異常值的溫度數(shù)據(jù)
從圖6中可以看出,所有的異常值已經(jīng)用None進(jìn)行替代,但為了便于查看、分析數(shù)據(jù),將異常值處理后的數(shù)據(jù)使用上文提到的方法,用Anaconda3 將其繪制成如圖7所示的圖形:

圖7 處理異常值后的溫度曲線
從圖7中可以看出,數(shù)據(jù)的范圍已在合理的范圍之內(nèi)。但由于存在許多缺省值,繪制的圖形不完整,點(diǎn)與點(diǎn)之間的連線不連續(xù)。為了使數(shù)據(jù)具有科學(xué)性,便于進(jìn)行數(shù)據(jù)分析,要將缺省值通過一定的方法將其補(bǔ)充完整。同時(shí)補(bǔ)充的數(shù)據(jù)應(yīng)具有一定的科學(xué)性、合理性,這樣才能在實(shí)際工作中具有指導(dǎo)意義。
對(duì)于缺省值的處理主要通過數(shù)學(xué)方法進(jìn)行。即使用缺省值的前后的值進(jìn)行簡(jiǎn)單求平均得出該缺省值,此方法簡(jiǎn)單易實(shí)現(xiàn),但對(duì)于數(shù)據(jù)的精度和科學(xué)性有一定差距。當(dāng)然,對(duì)于對(duì)數(shù)值精度和嚴(yán)謹(jǐn)性非常高的數(shù)據(jù)分析上,可以采用諸如多項(xiàng)式插值、線性插值、二次插值、Cubic 插值、拉格朗日多項(xiàng)式插值等數(shù)學(xué)方法[10]。
插值法就是在一些離散的數(shù)據(jù)基礎(chǔ)上補(bǔ)充缺省的數(shù)值,即給定m 個(gè)離散的數(shù)據(jù)值,這些數(shù)據(jù)值中存在一些缺失的值,通過m個(gè)數(shù)據(jù)值用特定的數(shù)學(xué)方法來估算出缺失的數(shù)值后補(bǔ)充進(jìn)去,使得用這些數(shù)值繪制的曲線是連續(xù)平滑的。插值是離散函數(shù)逼近的重要方法,利用它可以通過函數(shù)在有限個(gè)點(diǎn)處的取值狀況,估算出函數(shù)在其他點(diǎn)處的近似值。
本文為了簡(jiǎn)便說明問題,采用平均值插值技術(shù)。簡(jiǎn)單平均公式如下:
代碼實(shí)現(xiàn)如下:

在Anaconda3控制臺(tái)輸出的結(jié)果如圖8所示:

圖8 最終溫度值
為了便于查看、分析數(shù)據(jù),將處理后的數(shù)據(jù)使用Anaconda3繪制如圖9所示。從圖9中可以看出,在經(jīng)過一系列的處理后,溫度值已是在合理范圍內(nèi),沒有異常值和缺省值,且繪制的曲線連續(xù)無斷點(diǎn)。

圖9 最終溫度曲線
本文基于Python 對(duì)溫度數(shù)據(jù)中的異常值進(jìn)行了處理與分析,通過實(shí)踐探究說明Python在異常數(shù)據(jù)的處理以及數(shù)據(jù)分析中的作用,并對(duì)處理后的數(shù)據(jù)繪制溫度曲線來直觀對(duì)比數(shù)據(jù)處理前后的差異。結(jié)果表明,Python 語言在數(shù)據(jù)處理上有著極大的優(yōu)勢(shì),且對(duì)數(shù)據(jù)清洗、分析簡(jiǎn)單易上手,效率十分高效。