冷鴻天,楊雨漸,楊天淼,張占忠
(云南省林業(yè)調(diào)查規(guī)劃院,云南 昆明 650051)
21世紀(jì)以來,林業(yè)的發(fā)展方向逐漸由木材生產(chǎn)向生態(tài)建設(shè)轉(zhuǎn)變。通過調(diào)整監(jiān)測目標(biāo)、擴(kuò)充監(jiān)測內(nèi)容、優(yōu)化監(jiān)測方法和應(yīng)用高新技術(shù)等做法,森林資源監(jiān)測水平和服務(wù)能力得到進(jìn)一步提升[1]。為推進(jìn)生態(tài)文明建設(shè),筑牢國家西南生態(tài)安全屏障,維護(hù)生物安全和生態(tài)安全,踐行綠水青山就是金山銀山的理念,推動綠色循環(huán)低碳發(fā)展,實(shí)現(xiàn)人與自然和諧共生,滿足人們?nèi)找嬖鲩L的優(yōu)美生態(tài)環(huán)境需要,努力把云南建設(shè)成為全國生態(tài)文明建設(shè)排頭兵、中國最美麗省份,云南省通過開展森林督查、森林資源管理“一張圖”和森林資源年度監(jiān)測等工作,加強(qiáng)森林資源管理,建立和完善森林資源統(tǒng)一的監(jiān)測和管理制度[2]。
數(shù)據(jù)分析是為了發(fā)現(xiàn)數(shù)據(jù)規(guī)律的過程,利用數(shù)學(xué)和計算機(jī)手段來處理和挖掘收集來的數(shù)據(jù)中包含的信息[3]。由于技術(shù)水平的發(fā)展,森林資源監(jiān)測圖斑越來越精細(xì),與此同時,數(shù)據(jù)量也越來越大,特別對于省或更大尺度的監(jiān)測區(qū)需要采用先進(jìn)的技術(shù)方法更加方便快捷地對海量數(shù)據(jù)進(jìn)行分析,以適應(yīng)各種不同需求。Python便是一種可以快速對海量數(shù)據(jù)進(jìn)行分析和展示的重要工具。
自1991年誕生以來,Python已成為最受歡迎的動態(tài)編程語言之一。Python是一種動態(tài)語言,與靜態(tài)語言相比,其具有自由、靈活、簡潔等特征,依托其活躍的社區(qū)和大量強(qiáng)大的類庫可以快速完成各種使用場景的任務(wù)。在過去的10年,Python從一個邊緣或“自擔(dān)風(fēng)險”的科學(xué)計算語言,成為數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、學(xué)界和工業(yè)界軟件開發(fā)最重要的語言之一[4]。
進(jìn)行數(shù)據(jù)分析必要的Python類庫主要有Pandas,Geopandas,SQLite3,Numpy和Matplotlib等(表1)。Anaconda是一個免費(fèi)開源的Python語言的發(fā)行版本,用于計算科學(xué)(數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、大數(shù)據(jù)處理和預(yù)測分析),Anaconda擁有進(jìn)行數(shù)據(jù)分析的必要類庫,也可以簡化軟件類庫管理系統(tǒng)和部署。在Anaconda軟件中沒有集成Geopandas包,需要進(jìn)行自行安裝。Anaconda中還包含Jupyter Notebook,其是一個支持運(yùn)行40多種編程語言的交互式筆記本,便于創(chuàng)建和運(yùn)行數(shù)據(jù)分析的代碼,而且還可以用單元格的方式逐塊運(yùn)行代碼,更有利于進(jìn)行數(shù)據(jù)分析。
海量地理數(shù)據(jù)常用的存儲方法有文件地理數(shù)據(jù)庫(GDB)、Microsoft SQL server數(shù)據(jù)庫和開源的SQLite數(shù)據(jù)庫等。由于文件地理數(shù)據(jù)庫的查詢必須使用閉源收費(fèi)的Arcpy包,雖然Microsoft SQL server數(shù)據(jù)庫更強(qiáng)大,查詢速度更快,但是Microsoft SQL server數(shù)據(jù)庫安裝包很大,過于臃腫,因此決定選擇輕量開源的SQLite數(shù)據(jù)庫,SQLite數(shù)據(jù)庫集成在Python中,不需要重新安裝。
選取的數(shù)據(jù)為2020年度云南省森林資源監(jiān)測數(shù)據(jù),包含約650萬個圖斑,數(shù)據(jù)量較大。根據(jù)《云南省2020年森林資源監(jiān)測操作細(xì)則》中要求的成果統(tǒng)計表,選擇統(tǒng)計其中較為復(fù)雜的各類土地面積統(tǒng)計表為例,表頭如表2所示。
表1 數(shù)據(jù)分析主要類庫[4-5]Tab.1 Major class libraries of data analysis[4-5]
云南省的森林資源監(jiān)測數(shù)據(jù)量很大,如果全部使用Pandas進(jìn)行讀取會占用大量的內(nèi)存空間,所以需要使用數(shù)據(jù)庫進(jìn)行存儲,利用SQL查詢語句選擇需要使用的數(shù)據(jù)。首先使用SQLite3.connect連接SQLite數(shù)據(jù)庫,然后通過Pandas包中的read_SQL_query將SQL語句查詢分組后的結(jié)果存儲在DataFrame數(shù)據(jù)結(jié)構(gòu)中,極大地壓縮了讀入Pandas中的數(shù)據(jù)量,減輕了內(nèi)存占用和運(yùn)算壓力。代碼如下:
import sqlite3
with sqlite3.connect(r’C:UsersAdministratorDesktopSLJC2020.sqlite’) as conn:
df=pd.read_sql_query(
’’’select SHENG as 省,SHI as 州市,XIAN as 縣,LD_QS as 土地所有權(quán),SEN_LIN_LB as 森林類別,SHI_QUAN_D as事權(quán)等級,STQW as 生態(tài)區(qū)位,
DI_LEI as 地類,sum(MIAN_JI) as 面積
from XZ02
表2 各類土地面積統(tǒng)計
group by SHENG,SHI,XIAN,LD_QS,SEN_LIN_LB,SHI_QUAN_D,STQW,DI_LEI
order by SHENG,SHI,XIAN,LD_QS,SEN_LIN_LB,SHI_QUAN_D,STQW,DI_LEI’’’
,con=conn)
由于森林資源監(jiān)測數(shù)據(jù)并不是漢字,而是代碼,其中數(shù)據(jù)也有很多空格和空值混用的情況,這會對數(shù)據(jù)分析造成不利影響,需要對數(shù)據(jù)進(jìn)行清理和代碼轉(zhuǎn)換。按照《云南省2020年森林資源監(jiān)測操作細(xì)則》,很多數(shù)據(jù)分類與統(tǒng)計表中所需要的分類并不相同,因此需要通過選擇、賦值和新加列的方法對數(shù)據(jù)進(jìn)行重新分類。通過讀取csv文件中的編碼映射為字典,使用replace可以將統(tǒng)計表中的代碼統(tǒng)一替換為漢字,同時也可以對數(shù)據(jù)中一些空值和空格等難以分辨但又影響分析結(jié)果的數(shù)據(jù)噪聲進(jìn)行處理。將代碼替換為漢字的代碼如下:
import csv
mydict={}
with open(r‘path’) as code:
reader=csv.reader(code)
code_dict={rows[0]:rows[1] for rows in reader}
replace(code_dict)
tb[’統(tǒng)計單位’]=tb[’統(tǒng)計單位’].replace(code_dict)
將數(shù)據(jù)整合為一個DataFrame后,進(jìn)行數(shù)據(jù)重塑,以形成統(tǒng)計表的骨架。其中最重要的是pivot_table方法,其功能與Excel中的透視表一樣,選擇行和列,對聚合的數(shù)值進(jìn)行求和等操作,多個層級的數(shù)據(jù)會形成多級索引,以符合規(guī)定的表頭設(shè)計。核心代碼如下:
tb=pd.pivot_table(df[df.地類!=’非林地’],values=’面積’,/
index=[’省’,’州市’,’縣’,’土地所有權(quán)’,’森林類別’,’事權(quán)等級’],/
columns=[’DILEI_0’,’DILEI_1’,’地類’],aggfunc=’sum’)
將數(shù)據(jù)進(jìn)行透視表操作后,如果選擇多個行和列會形成多級索引。對多級索引進(jìn)行求和操作即可對所選擇的層級進(jìn)行求和,即對當(dāng)前層級的匯總,也叫分類匯總。如對列的第一層級進(jìn)行匯總,其代碼為:tb.sum(level=0,axis=1)。將按層級匯總好的數(shù)據(jù)根據(jù)表的設(shè)計規(guī)則修改列名為總計、合計或小計,并將索引用MultiIndex.from_tuples方法改為符合表的設(shè)計規(guī)則的多級索引,方便后期實(shí)現(xiàn)完整表格的合并。
將按層級匯總后的分表、國土總面積表和總表合并。由于按層級匯總后順序和表頭不變,所以用concat方法直接進(jìn)行拼接。而土地總面積因索引名稱不同,要用merge方法的關(guān)鍵字進(jìn)行連接。如分層級統(tǒng)計出省、市、縣的數(shù)據(jù)和與其對應(yīng)的土地總面積與總表進(jìn)行合并,可以使用如下代碼:
pd.concat([sheng,zhoushi,xian]).merge(tdzmj,on=’統(tǒng)計單位代碼’)
合并完成后的表頭順序與設(shè)計表頭順序不符,由于表頭和索引都是字符串,且是復(fù)雜的多級索引,不能簡單地使用排序功能實(shí)現(xiàn)設(shè)計的順序,使用Category數(shù)據(jù)類型的效果并不理想,只能采取在索引和列名前增加序號的方法進(jìn)行排序,最后再將序號去掉。統(tǒng)計完成的表格可以直接用to_excel方法生成Excel表格。
扇形圖適用于表示每一分量所占總量的比例。扇形圖可以很好地反映云南省每種森林類別占總量的百分比。將數(shù)據(jù)按森林類別使用groupby方法進(jìn)行分組后,即可使用Pandas自帶可視化模塊進(jìn)行扇形圖繪制(圖1)。代碼如下:
tb.plot.pie(subplots=True,autopct=’%.2f’,figsize=(8,8),title=’云南省森林類別百分比圖’)
圖1 云南省森林類別占比Fig.1 Percentage of forest categories in Yunnan Province
柱狀圖可以用于表示每個表示字段的多少。利用柱狀圖表示森林類別權(quán)屬數(shù)量特征可以用Pandas自帶可視化模塊進(jìn)行繪制。但如果需要對數(shù)據(jù)繪制一些復(fù)雜的可視化效果,或者對可視圖形進(jìn)行更精細(xì)的設(shè)置,就需要使用Matplotlib庫進(jìn)行繪制(圖2)。疊加柱狀圖的代碼如下:
import matplotlib.pyplot as plt
plt.bar(d1.columns.values,d1.loc[’國有’],label=’國有’)
plt.bar(d1.columns.values,d1.loc[’集體’],bottom=d1.loc[’國有’],label=’集體’)
plt.legend()
ymax=d1.loc[’國有’].max()+d1.loc[’集體’].max()
plt.ylim(0,ymax)
plt.ylabel(’面積 單位:萬公頃’)
圖2 云南省森林類別權(quán)屬Fig.2 Forest category ownership of Yunnan Province
對于有位置信息的地理數(shù)據(jù),可使用Python繪制專題地圖。Geopandas包便是一個用于對地理信息數(shù)據(jù)進(jìn)行可視化的一個很好的工具。如果使用全省林地小班數(shù)據(jù)進(jìn)行聚類操作再計算森林覆蓋率,由于需要進(jìn)行圖形運(yùn)算,效率會很低,且數(shù)據(jù)量太大,要進(jìn)行分塊操作。所以要先統(tǒng)計出每個縣的覆蓋率,并以縣為關(guān)鍵字連接到云南省行政區(qū)劃地圖上,用Geopandas中的plot方法簡單設(shè)置大小和配色后即可完成繪制(圖3),地圖中顏色越深,表示森林覆蓋率越高。地圖繪制代碼如下:
import geopandas as gpd
gdf=gdf.merge(tb,on=’XIAN’)
fig, ax = plt.subplots(1, 1)
gdf.plot(column=’FGL’, ax=ax,cmap=’OrRd’,legend=True,figsize=(100, 100))
圖3 云南省各縣森林覆蓋率分布Fig.3 Distribution of forest coverage in counties of Yunnan Province
實(shí)踐證明,使用Python可對森林資源監(jiān)測海量數(shù)據(jù)進(jìn)行快速分析和統(tǒng)計,Python語法結(jié)構(gòu)簡單的特性使其可及時地適應(yīng)不同需求。對于全省上百萬條數(shù)據(jù),從運(yùn)行程序到輸出統(tǒng)計表的時間只需十幾秒,且90%的時間用于SQL語句查詢。如果將查詢結(jié)果用于多張統(tǒng)計表將會極大地提升統(tǒng)計效率。重要的是Python代碼可以復(fù)用,稍作修改便可使用在各種需求的分析統(tǒng)計中。Python作為一種跨平臺的編程語言,將分析方法完整化和系統(tǒng)化后,可以進(jìn)行界面設(shè)計和軟件打包,并將軟件運(yùn)行在各種不同的平臺。也可以使用Python的web框架,將分析工具部署在服務(wù)器上,通過網(wǎng)頁端提供更多的服務(wù)。