宋盼盼,周 猛,肖 瑩
(湖北省孝感市水文水資源勘測局,湖北 孝感 432100)
水體營養狀態評價是地表水環境質量評價的重要組成部分,是對水體富營養化發展過程中某一階段的營養狀況進行定量描述,通過對代表性指標的監測與調查,判定水體的營養狀態,了解其富營養化進程及預測其發展趨勢,為水體水質管理及富營養化防治提供科學依據[1]。其本質是按照一定的標準和方法對水環境監測數據進行加工處理,最終形成水體優劣程度的評判結論。
長期以來,水體營養狀態評價主要借助于Microsoft Excel、WPS表格或SPSS等常規辦公軟件的數據處理功能。在具體執行大批量運算時,對軟件運行環境、原始數據質量和格式要求較高,尤其是處理大批量數據時效率較低且容易出錯,在實際使用中存在一定的局限性。
python是一種面向對象的解釋性的計算機程序設計語言,具有簡潔、易讀、易維護、免費開源、可移植性和可擴展性等特性。經歷幾十年的發展,Python工具箱現已涵蓋數據爬蟲、數據分析、深度學習、人工智能和Web開發等技術的常用庫和外部工具,可廣泛應用于各種交叉學科。近年來,python在水文分析計算、水資源水環境監測與評價領域中應用的案例不斷涌現[2-7],為水資源、水環境監測與評價工作開辟了一條更加高效、便捷的途徑。筆者采用python語言設計一種可以應用于水體營養狀態評價的數據處理系統具有一定的可行性和實用價值。
常用的水體營養狀態評價方法主要有營養狀態指數法(卡爾森營養狀態指數(TSI)[8]、修正的營養狀態指數(TSIM)[9]、綜合營養狀態指數(TLI)[10])、營養度指數法[11]、模糊聚類數學模型法[12]和評分法[13]等。筆者結合當前水利系統水環境監測與評價工作實際情況,水體營養狀態評價方案采用評分法。其主要依據為水利行業標準《地表水資源質量評價技術規程》(SL 395—2007),其中湖泊營養狀態評價標準及分級方法源自中國科學院南京地理與湖泊研究所舒金華1990年提出的評分法[14]。
評分法是根據水體營養狀態相關評價因子和對應的評價標準,在0~100分的范圍內分別賦予各評價參數相應的分值,其分值與水體富營養化程度呈正相關。評價指標為葉綠素a(chl-a)、總磷(TP)、總氮(TN)、透明度(SD)和高錳酸鹽指數(CODMn),其中葉綠素a(chl-a)為必評項目。依據水體營養狀態評價標準,采用線性插值法將水質項目濃度值轉換為賦分值,按公式(1)計算營養狀態指數EI,根據營養狀態指數確定營養狀態分級。水體營養狀態評價標準及分級方法見表1[15]。

表1 水體營養狀態評價標準及分級方法
(1)
式中,EI—營養狀態指數;En—評價項目賦分值;N—評價項目個數。
利用python出色的數據處理能力可以完成對監測數據的預處理,從原始監測數據中提取出需要參評的數據,然后依據水體營養狀態評價標準建立項目濃度值與賦分值的函數關系曲線方程,分別按照對應的曲線方程進行賦值運算,再根據運算結果對樣品代表的水體進行分級評價,最后對必評項目“葉綠素a”是否參評進行自動復核,輸出營養狀態分級評價成果。本評價系統使用的所有數據文件均為.xlsx或.xls格式。水體營養狀態評價系統工作流程如圖1所示。

圖1 水體營養狀態評價系統工作流程
一般情況下,原始的水環境監測數據包含的信息量較大,為方便后續數據處理,需篩選出水體營養狀態相關評價因子。使用pandas模塊提取文件“原始檢測數據.xlsx”中的樣品信息(如“樣品編號”“樣品名稱”“采樣日期”等)和評價參數(“高錳酸鹽指數”“總磷”“總氮”“葉綠素a”“透明度”)等參評必要數據,生成文件“水體營養狀態監測成果.xlsx”。數據處理的主要代碼如下:
import pandas as pd
df=pd.read_excel('原始檢測數據.xlsx')
df=df.reindex(columns=['樣品編號','樣品名稱',' 采樣日期','高錳酸鹽指數','總磷','總氮','葉綠素a','透明度'])
print(df)
df.to_excel('水體營養狀態監測成果.xlsx',index=False)
根據水體營養狀態評價標準及分級方法表中“評價項目賦分值En”和各項指標濃度值的對應關系,可整理成五個獨立的分段函數,分別表示葉綠素a(chl-a)、總磷(TP)、總氮(TN)、透明度(SD)、高錳酸鹽指數(CODMn)五項指標的濃度值與賦分值En的函數關系。以葉綠素a(chl-a)和透明度(SD)2項為例,其關系曲線分別用python代碼表示如下:
#項目"葉綠素a"營養狀態指數分段函數
def Eutrophication_index_Chlorophyll_a(x):
if 0.000<=x<0.0005:
return 20000*x+0
elif 0.0005<=x<0.0010:
return 20000*x+0
elif 0.0010<=x<0.0020:
return 10000*x+10
elif 0.0020<=x<0.0040:
return 5000*x+20
elif 0.0040<=x<0.010:
return 5000/3*x+100/3
elif 0.010<=x<0.026:
return 625*x+175/4
elif 0.026<=x<0.064:
return 5000/19*x+1010/19
elif 0.064<=x<0.16:
return 625/6*x+190/3
elif 0.16<=x<0.40:
return 250/6*x+220/3
elif 0.40<=x<1.0:
return 50/3*x+250/3
elif x>=1.0:
return 100
else:
return ""
#項目"透明度"營養狀態指數分段函數
def Eutrophication_index_Transparency(x):
if x>=10:
return-2*x+30
elif 5.0<=x<10:
return-2*x+30
elif 3.0<=x<5.0:
return-5*x+45
elif 1.5<=x<3.0:
return-20/3*x+50
elif 1.0<=x<1.5:
return-20*x+70
elif 0.5<=x<1.0:
return-20*x+70
elif 0.4<=x<0.5:
return-100*x+110
elif 0.3<=x<0.4:
return-100*x+110
elif 0.2<=x<0.3:
return-100*x+110
elif 0.12<=x<0.2:
return-125*x+115
elif x<0.12:
return 100
else:
return ""
將3.1中提取的監測數據分別帶入3.2中對應的關系曲線,計算出各項指標對應的賦分值En和樣品所代表水體的營養狀態指數EI。主要代碼如下:
#分別計算各指標富營養化指數En
d=pd.read_excel('水體營養狀態監測成果.xlsx')
d['葉綠素a']=d['葉綠素a'].apply(lambda x:Eutrophication_index_Chlorophyll_a(x))
d['總磷']=d['總磷'].apply(lambda x:Eutrophication_index_TP_lake(x))
d['總氮']=d['總氮'].apply(lambda x:Eutrophication_index_TN_lake(x))
d['高錳酸鹽指數']=d['高錳酸鹽指數'].apply(lambda x:Eutrophication_index_CODmn(x))
d['透明度']=d['透明度'].apply(lambda x:Eutrophication_index_Transparency(x))
print(d)
d.to_excel('水體營養狀態評分.xlsx',index=False)
#計算參評項目賦分的平均值EI,結果保留2位小數
d=pd.read_excel('水體營養狀態評分.xlsx')
d['EI(營養狀態指數)']=d.loc[:,['葉綠素a','總磷','總氮','高錳酸鹽指數','透明度']].mean(axis=1)
d=round(d,2)
print(d)
d.to_excel('水體營養狀態評分.xlsx',index=False)
按照水體營養狀態評價標準及分級方法,根據營養狀態指數EI確定水體營養狀態級別,生成“水體營養狀態評價結果.xlsx”。主要代碼如下:
def Eutrophication_index_grade(EI):
if 0<=EI<=20:
return "貧營養"
elif 20 return "中營養" elif 50 return "輕度富營養" elif 60 return "中度富營養" elif 80 return "重度富營養" else: return "" d=pd.read_excel('水體營養狀態評分.xlsx') d['營養狀態分級']=d[' EI(營養狀態指數)'].apply(lambda x:Eutrophication_index_grade(x)) print(d) d.to_excel('水體營養狀態評價結果.xlsx',index=False) 根據SL 395—2007《地表水資源質量評價技術規程》中5.1.2的規定,“葉綠素a”為必評項目,即“葉綠素a”是否參評直接決定評價結果是否有效。因此,須對項目“葉綠素a”的參評情況進行復核。如未參評,應標注提示信息“葉綠素a未參評!”。必評指標復核的代碼如下: def check_Chlorophyll_a(x): if x>=0: return "" else: return "葉綠素a未參評!" d=pd.read_excel('水體營養狀態評價結果.xlsx') print(d) d['必評項目復核']=d['葉綠素a'].apply(lambda x:check_Chlorophyll_a(x)) print(d) d.to_excel('水體營養狀態評價結果.xlsx',index=False) 為實現評價功能可在任何其他未安裝python軟件的PC上正常運行,可使用auto-py-to-exe工具可將寫好的python代碼打包成可執行文件“水體營養狀態評價系統.exe”。將待測數據文件“原始檢測數據.xlsx”(數據量為10000個樣本)置于可執行程序所在的文件夾,運行“水體營養狀態評價系統.exe”后,分別生成“水體營養狀態監測成果.xlsx”“水體營養狀態評分.xlsx”和“水體營養狀態評價結果.xlsx”3個xlsx格式文件,軟件運行用時約25s。為驗證評價的有效性,同時采用傳統的excel、wps等軟件的函數功能按照線性插值法對案例中部分樣品進行營養狀態評分和分級評價。結果顯示:其評分和分級評價結果與python代碼運行結果完全一致,分級評價結果亦完全吻合。水體營養狀態評價系統測試結果見表2—4。 表2 水體營養狀態監測成果 表3 水體營養狀態評分 表4 水體營養狀態評價結果 利用python語言將水體營養狀態評價方法設計成能在多種平臺上運行的水體營養狀態評價系統,體現了水環境評價與計算機程序設計學科交叉融合的可行性。基于python語言設計的水體營養狀態評價系統可以在很大程度上彌補常規辦公軟件在數據處理方面的不足,尤其是在處理海量的水環境監測數據時,python語言具有更加便捷、高效、準確的優點,在實際的水環境質量評價工作中具有較高的應用價值。3.5 必評指標復核
4 典型案例的測試



5 結語