import numpy as np
import pandas as pd
import sklearn
import matplotlib.pyplot as plt
import os
import xgboost as xgb
import lightgbm as lgb
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report,f1_score
from sklearn.model_selection import train_test_split
from data_utils import *
from sklearn.preprocessing import MinMaxScaler
from sklearn import metrics
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM,Conv1D
from keras.models import Sequential, load_model
通宵一晚上,终于勉强完成了代码,并赶在12点前提交论文。以下是一些截图,运行下方代码可以直接得到,数据集直接把官方给的数据集放在和此代码的同目录项目下,运行即可
文件已经上传github(https://github.com/linzixuan45/2022-E-)
def _init_humidity():
beta = pd.read_excel(io="数据集/基本数据/附件3、土壤湿度2022—2012年.xls")
beta = beta.sort_values(by=['年份', '月份'], ascending=[False, False]).iloc[::-1]
# beta.to_excel('beta.xls')
# print(self.beta.columns)
return beta
def _init_graze():
graze_indensity = pd.read_excel(io='数据集/监测点数据/附件14:内蒙古自治区锡林郭勒盟典型草原不同放牧强度土壤碳氮监测数据集(2012年8月15日-2020年8月15日)/内蒙古自治区锡林郭勒盟典型草原不同放牧强度土壤碳氮监测数据集(2012年8月15日-2020年8月15日).xlsx')
# print(graze_indensity.columns)
return graze_indensity
def _init_surface_emission():
surface_emission = pd.read_excel(io='数据集/基本数据/附件4、土壤蒸发量2012—2022年.xls')
surface_emission= surface_emission.sort_values(by=['年份', '月份'], ascending=[False, False]).iloc[::-1]
# print(surface_emission.columns)
return surface_emission
def _init_climate():
file_path = "数据集/基本数据/附件8、锡林郭勒盟气候2012-2022"
file_ls = [os.path.join(file_path, file_name) for file_name in os.listdir(file_path)]
climate = pd.read_excel(io = file_ls[0])
for i,value in enumerate(file_ls):
if i!=0:
new_sheet = pd.read_excel(io = value)
climate = pd.concat((climate, new_sheet))
# climate.to_excel('climate.xls')
# print(self.climate.columns)
return climate
def _init_ndvi():
ndvi = pd.read_excel(io='数据集/基本数据/附件6、植被指数-NDVI2012-2022年.xls')
ndvi= ndvi.sort_values(by=['年份', '月份'], ascending=[False, False]).iloc[::-1]
return ndvi
def _init_runoff():
runoff = pd.read_excel('数据集/基本数据/附件9、径流量2012-2022年.xlsx')
runoff= runoff.sort_values(by=['年份', '月份'], ascending=[False, False]).iloc[::-1]
return runoff
def _init_block_plant():
"""
['年份', '轮次', '处理', '日期', '植物种名', '植物群落功能群', '放牧小区Block', '重复', '营养苗',
'生殖苗', '株/丛数', '丛幅1', '丛幅2', '鲜重(g)', '干重(g)', '平均每珠干重']
:return:
"""
plant = pd.read_excel('数据集/监测点数据/附件15:内蒙古自治区锡林郭勒盟典型草原轮牧放牧样地群落结构监测数据集(2016年6月-2020年9月)。/内蒙古自治区锡林郭勒盟典型草原轮牧放牧样地群落结构监测数据集(201.xlsx',sheet_name='2016-2020物种数据库')
plant = plant.sort_values(by=['日期'], ascending=[False]).iloc[::-1]
return plant
def calculate_icmax():
LAI = pd.read_excel('数据集/基本数据/附件10、叶面积指数(LAI)2012-2022年.xls')
LAI= LAI.sort_values(by=['年份', '月份'], ascending=[False, False]).iloc[::-1]
LAIL = LAI['低层植被(LAIL,m2/m2)'][:123] # 到202203截至
LAIL = np.array(LAIL)
icmax = 0.935+0.498*LAIL-0.00575*LAIL**2
"""
ICstore,草地的植被直接决定放牧的强度,而植被的截流量能最好反映植被的生长能力,
依照递推关系,放牧强度与植被的截流量存在正相关关系
"""
Rcum = _init_climate().climate['降水量(mm)']
return icmax
问题1.
从机理分析的角度,建立不同放牧策略(放牧方式和放牧强度)对锡林郭勒草原土壤物理性质(主要是土壤湿度)和植被生物量影响的数学模型。
2、土壤含水量-降水量-地表蒸发模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RueXi5Ph-1665392901433)(1.jpg)]
放牧强度对土地的物理性质,对土地的湿度的数学模型
分析: Gw>1, D<0
地表散发率E(a), a = alpha Gw
先获取
humidity:土壤含水量
[‘月份’, ‘年份’, ‘经度(lon)’, ‘纬度(lat)’, ‘10cm湿度(kg/m2)’, ‘40cm湿度(kg/m2)’,
‘100cm湿度(kg/m2)’, ‘200cm湿度(kg/m2)’]
climate:气候降水
[‘站点号’, ‘海拔高度(m)’, ‘经度’, ‘纬度’, ‘年份’, ‘月份’, ‘平均气温(℃)’, ‘平均最高气温(℃)’,
‘平均最低气温(℃)’, ‘最高气温极值(℃)’, ‘最低气温极值(℃)’, ‘平均气温≥18℃的天数’, ‘平均气温≥35℃的天数’,
‘平均气温≤0℃的天数’, ‘平均露点温度(℃)’, ‘降水量(mm)’, ‘最大单日降水量(mm)’, ‘降水天数’,
‘平均海平面气压(hPa)’, ‘最低海平面气压(hPa)’, ‘平均站点气压(hPa)’, ‘积雪深度(mm)’, ‘平均能见度(km)’,
‘最小能见度(km)’, ‘最大能见度(km)’, ‘平均风速(knots)’, ‘平均最大持续风速(knots)’,
‘单日最大平均风速(knots)’, ‘平均最大瞬时风速(knots)’, ‘最大瞬时风速极值(knots)’]
graze:
[‘year’, ‘放牧小区(plot)’, ‘放牧强度(intensity)’, ‘SOC土壤有机碳’, ‘SIC土壤无机碳’,
‘STC土壤全碳’, ‘全氮N’, ‘土壤C/N比’, ‘Unnamed: 8’, ‘Unnamed: 9’, ‘Unnamed: 10’], 132
surface_emission:
[‘月份’, ‘年份’, ‘经度(lon)’, ‘纬度(lat)’, ‘土壤蒸发量(W/m2)’, ‘土壤蒸发量(mm)’]
def split_sequences(sequences, n_steps):
X, y = list(), list()
for i in range(len(sequences)):
end_ix = i + n_steps
if end_ix > len(sequences)-1:
break
seq_x, seq_y = sequences[i:end_ix, :], sequences[end_ix, :]
X.append(seq_x)
y.append(seq_y)
return np.array(X), np.array(y)
def mean_absolute_percentage_error(y_true, y_pred):
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
def init_dataset(dataset,n_steps=1):
#dataset:数据标准化后的dataset
# n_steps:分片大小,默认为1
#依次为:[ '10cm湿度(kg/m2)', '40cm湿度(kg/m2)','100cm湿度(kg/m2)', '200cm湿度(kg/m2)', '土壤蒸发量(W/m2)', '土壤蒸发量(mm)','降水量(mm)', '平均风速(knots)']
in_seq1= dataset[:,0].reshape((dataset.shape[0], 1))
in_seq2= dataset[:,1].reshape((dataset.shape[0], 1))
in_seq3= dataset[:,2].reshape((dataset.shape[0], 1))
in_seq4= dataset[:,3].reshape((dataset.shape[0], 1))
in_seq5= dataset[:,4].reshape((dataset.shape[0], 1))
in_seq6= dataset[:,5].reshape((dataset.shape[0], 1))
in_seq7= dataset[:,6].reshape((dataset.shape[0], 1))
in_seq8= dataset[:,7].reshape((dataset.shape[0], 1))
dataset = np.hstack((in_seq1, in_seq2, in_seq3, in_seq4,in_seq5,in_seq6,in_seq7,in_seq8))
X, y = split_sequences(dataset, n_steps)
print(X.shape, y.shape)
return X, y
def lstmmodel_1(dataset,n_steps=1):
X, y = init_dataset(dataset,n_steps)
print(X.shape)
n_features = X.shape[2]
model = Sequential()
model.add(Conv1D(60,kernel_size=3, activation='relu',padding='same',input_shape=(n_steps, n_features)))
model.add(LSTM(300, activation='relu', return_sequences=True, input_shape=(60, n_features)))
model.add(LSTM(300, activation='relu'))
model.add(Dense(n_features*2, activation='relu'))
model.add(Dense(n_features))
model.compile(optimizer='adam', loss='mse')
model.fit(X, y, epochs=200, verbose=2,shuffle=False)
model.save('lstm_model.h5')
last_input=np.array(dataset[-n_steps:,:])
return X,y,last_input,n_features,n_steps
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
import seaborn as sns
sns.set_palette("husl") #设置所有图的颜色,使用hls色彩空间
絮絮叨叨几句,原本以为这题目我建立一个class类300行代码就可以解决了,结果最后写了700多行。为什么当时想不开就要一个class类封装所有呢= =,真的折磨自己。请不要吐槽为什么这个class会这么大,我也不想的。
class Q:
def __init__(self,Q1:bool=False,Q2:bool=False,Q3:bool=False,Q4:bool=False,Q5:bool=False,Q6:bool=False):
if Q1:
self.question1()
elif Q2:
self.question2()
elif Q3:
self.question3()
elif Q4:
self.question4()
elif Q5:
self.question5()
def question5(self):
data5 = pd.read_excel('Q4_fig/result.xlsx')
data5.sort_values(by=['年份','放牧小区(plot)'],inplace=True)
data5.fillna(method='ffill',inplace=True)
data5.reset_index(inplace=True,drop=True)
ndvi = _init_ndvi()
humidity,surface_emission=_init_humidity(),_init_surface_emission()
runoff,climate = _init_runoff(),_init_climate()
data_1 = pd.merge(humidity, surface_emission, on=('月份', '年份', '经度(lon)', '纬度(lat)')) # 123x10
data_1 = pd.merge(data_1,ndvi)
data_1 = pd.merge(data_1,runoff)
data_1 = pd.merge(data_1,climate)
del data_1['积雪深度(mm)']
del data_1['平均最大瞬时风速(knots)']
del data_1['最大瞬时风速极值(knots)']
data=data_1[['月份', '年份','10cm湿度(kg/m2)','200cm湿度(kg/m2)', '植被指数(NDVI)','平均气温(℃)', '降水量(mm)','平均风速(knots)']]
for i in data.columns[2:]:
data[i]=(data[i]-data[i].min())/(data[i].max()-data[i].min())
print(data)
data5 = pd.merge(data5,data, on=('月份', '年份'))
print(data5)
data5=data5[['月份', '年份', '放牧小区(plot)', '放牧强度(intensity)', 'SOC土壤有机碳', 'SIC土壤无机碳','STC土壤全碳', '全氮N', '土壤C/N比', '10cm湿度(kg/m2)_y', '40cm湿度(kg/m2)','100cm湿度(kg/m2)', '200cm湿度(kg/m2)_y', '沙漠化程度指数', '植被指数(NDVI)', '平均气温(℃)','降水量(mm)', '平均风速(knots)','jiehe']]
print(data5)
data5['放羊数']=data5['放牧强度(intensity)'].map(
{
'NG':0,
'LGI':2,
'MGI':4,
'HGI':8
})
X=data5[[ '降水量(mm)', 'jiehe']]
y=data5['放羊数']
# 拆分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=12)
#线性回归
model = LinearRegression()
model.fit(x_train, y_train)
print('线性回归')
print(mean_absolute_percentage_error(model.predict(x_test),y_test))
# Randomforest回归
model = RandomForestRegressor()
model.fit(x_train, y_train)
print('Randomforest回归')
print(mean_absolute_percentage_error(model.predict(x_test),y_test))
# XGboost分类
model = xgb.XGBRFRegressor()
model.fit(x_train, y_train)
print('XGboost回归')
print(mean_absolute_percentage_error(model.predict(x_test),y_test))
os.makedirs('Q5_fig',exist_ok=True)
data5.to_excel('Q5_fig/data5.xlsx',index=None)
for i in [300,600,900,1200]:
ttemp=X.copy()
ttemp[ 'jiehe']=0.5
ttemp['降水量(mm)']=i
print(model.predict(ttemp).mean())
x1=[]
y1=[]
for i in range(1,100,5):
ttemp=X.copy()
ttemp[ 'jiehe']=i/100
x1.append(i/100)
ttemp['降水量(mm)']=300
y1.append(model.predict(ttemp).mean())
x2=[]
y2=[]
for i in range(1,100,5):
ttemp=X.copy()
ttemp[ 'jiehe']=i/100
x2.append(i/100)
ttemp['降水量(mm)']=600
y2.append(model.predict(ttemp).mean())
x3=[]
y3=[]
for i in range(1,100,5):
ttemp=X.copy()
ttemp[ 'jiehe']=i/100
x3.append(i/100)
ttemp['降水量(mm)']=900
y3.append(model.predict(ttemp).mean())
x4=[]
y4=[]
for i in range(1,100,5):
ttemp=X.copy()
ttemp[ 'jiehe']=i/100
x4.append(i/100)
ttemp['降水量(mm)']=1200
y4.append(model.predict(ttemp).mean())
plt.plot(x1,y1,label='300(mm)')
plt.plot(x2,y2,label='600(mm)')
plt.plot(x3,y3,label='900(mm)')
plt.plot(x4,y4,label='1200(mm)')
plt.xlabel( '沙漠化、板结化程度融合值')
plt.ylabel( '放羊数目')
plt.legend() # 显示图例
plt.savefig('Q5_fig/放羊数目随沙漠化、板结化程度融合值变化情况.jpg')
plt.show()
def question4(self):
data0 = self.data_preprocess_q4()
X1 =data0[[ 'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比']].values
pca = PCA(n_components=1) #降到1维
pca.fit(X1) #训练
newX1=pca.fit_transform(X1) #降维后的数据
# PCA(copy=True, n_components=2, whiten=False)
print(pca.explained_variance_ratio_) #输出贡献率
X2 =data0[[ '10cm湿度(kg/m2)', '40cm湿度(kg/m2)', '100cm湿度(kg/m2)', '200cm湿度(kg/m2)']].values
pca = PCA(n_components=1) #降到1维
pca.fit(X2) #训练
newX2=pca.fit_transform(X2) #降维后的数据
print(pca.explained_variance_ratio_) #输出贡献率
data0['有机物含量']=newX1
data0['土壤湿度']=newX2
data0['土壤板结化指数']=1/2*data0['有机物含量']+1/2*data0['土壤湿度']
i='土壤板结化指数'
data0[i]=(data0[i]-data0[i].min())/(data0[i].max()-data0[i].min())
data0['jiehe']=1/2*data0['土壤板结化指数']+1/2*data0['沙漠化程度指数']
os.makedirs('Q4_fig',exist_ok=True)
data0.to_excel('Q4_fig/result.xlsx')
temp=data0[(data0['放牧强度(intensity)']=='NG')&(data0['放牧小区(plot)']=='G21')]
"""
"""
print(temp)
def question3(self):
"""问题3.从机理分析的角度,建立不同放牧策略(放牧方式和放牧强度)
对锡林郭勒草原土壤化学性质影响的数学模型。
并请结合附件14中数据预测锡林郭勒草原监测样地(12个放牧小区)
在不同放牧强度下2022年土壤同期有机碳、无机碳、全N、土壤C/N比等值,并完成下表。"""
df = self.data_preprocess_q3()
predict = []
predict_class = [(0,'G17'),(0,'G19'),(0,'G21'),(1,'G6'),(1,'G12'),(1,'G18'),
(2,'G8'),(2,'G11'),(2,'G16'),(3,'G9'),(3,'G13'),(3,'G20')]
for value in predict_class:
pred = self.plot_graze_block_q3(df,str(value[0]),value[1])
predict.append(pred)
with open("Q3_fig/result.csv",'w') as csvfile:
csvfile.write(str(predict))
def score(self,y_true, y_pre):
# MSE
print("MAPE :")
print(mean_absolute_percentage_error(y_true, y_pre))
# RMSE
print("RMSE :")
print(np.sqrt(metrics.mean_squared_error(y_true, y_pre)))
# MAE
print("MAE :")
print(metrics.mean_absolute_error(y_true, y_pre))
# # R2
# print("R2 :")
# print(np.abs(r2_score(y_true,y_pre)))
def question2(self):
'''联立13份数据,每月一个模型,外加一个总的模型'''
data, month_data = self.data_preprocess_q2()
data_1 = data.astype('float32')
scaler = MinMaxScaler(feature_range=(0, 1))
'''总数据模型'''
dataset=scaler.fit_transform(data_1)
X,y,last_input,n_features,n_steps=lstmmodel_1(dataset, n_steps=3)
testPredict,testY=self.Predict_RMSE_BA(X,y,scaler)
y_pre=self.Predict_future_plot(21,last_input,n_features,n_steps,scaler,testPredict,testY)
self.predict_plot(y_pre)
def plot_graze_block_q3(self, data, intensity,plot):
"""
['放牧强度','放牧小区Block','年份','SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N',
'土壤C/N比','土壤蒸发量(W/m2)','降水量(mm)','100cm湿度(kg/m2)']
:param data: dataframe
:param plot: block
:param intensity: 0-3
:return:
"""
ppp=str(plot)+' '+intensity
# print(data[(data['放牧小区Block']==plot)])
temp=data[(data['放牧小区Block']==plot)&(data['放牧强度']==int(intensity))]
temp.reset_index(inplace=True,drop=True)
temp=temp.groupby('年份').mean()
temp.reset_index(inplace=True,drop=False)
os.makedirs('Q3_fig',exist_ok=True)
for i in [ 'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比']:
plt.plot(temp['年份'].values,temp[i].values,label=i)
plt.legend()
plt.xlabel( '时间')
plt.ylabel( '变量')
plt.title( '2012~2020 %s 土壤化学性质 情况'%ppp)
plt.savefig('Q3_fig/2012~2022 %s土壤化学性质 情况.jpg'%ppp)
dataset=temp[[ 'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N',
'土壤C/N比','土壤蒸发量(W/m2)','降水量(mm)','100cm湿度(kg/m2)']]
print(dataset)
scaler = MinMaxScaler(feature_range=(0, 1))
'''总数据模型'''
dataset=scaler.fit_transform(dataset)
X,y,last_input,n_features,n_steps=lstmmodel_1(dataset,n_steps=1)
testPredict,testY=self.Predict_RMSE_BA_q3(X,y,scaler,ppp)
y_pre=self.Predict_future_plot(1,last_input,n_features,n_steps,scaler,testPredict,testY)
return y_pre
def Predict_future_plot(self,predict_forword_number,x_input,n_features,n_steps,scaler,testPredict,testY):
"""
:param predict_forword_number: 需要预测的数据量
:param x_input: 输入最后的数据
:param n_features: 特征量个数
:param n_steps: 步伐
:param scaler:
:param testPredict:
:param testY:
:return: np.array
"""
model=load_model('lstm_model.h5')
predict_list=x_input.tolist() # 3,8
while len(predict_list) < predict_forword_number+n_steps:
temp = predict_list[-n_steps:]
x_input = np.array(temp, dtype=np.float32)
x_input = x_input.reshape(1,n_steps,-1)
yhat = model.predict(x_input, verbose=0)
yhat = yhat.reshape(-1).tolist()
predict_list.append(yhat)
Predict_forward = scaler.inverse_transform(np.array([np.array(i).reshape(-1,1)[:,0].tolist() for i in predict_list]))
pred = Predict_forward[n_steps:,:]
return pred
def question1(self):
data, data_0, data_1, data_0_notOneHot = self.data_preprocess_q1()
feature_names_all = [ 'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比',
'鲜重(g)', '干重(g)', '10cm湿度(kg/m2)', '200cm湿度(kg/m2)', '土壤蒸发量(W/m2)',
'径流量(m3/s)', '植被指数(NDVI)', '平均气温(℃)', '降水量(mm)', '平均风速(knots)']
feature_names_physic = ['SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比','10cm湿度(kg/m2)', '200cm湿度(kg/m2)', '土壤蒸发量(W/m2)']
feature_names_bio = [ '株/丛数','鲜重(g)', '干重(g)', '植物功能群__AB', '植物功能群__PB', '植物功能群__PF','植物功能群__PR', '土壤蒸发量(W/m2)','径流量(m3/s)', '植被指数(NDVI)']
target_names = '放牧强度'
Y = data[target_names]
self.model_dtree(data[feature_names_physic],Y,feature_names_physic, target_names,"physic")
self.model_dtree(data[feature_names_bio],Y,feature_names_bio, target_names,"bio")
self.model_dtree(data[feature_names_all], Y, feature_names_all, target_names,'all')
# self.model_tsne(data[feature_names],Y)
def model_tsne(self, X, Y):
from sklearn.manifold import TSNE
tsne = TSNE(n_components=3,verbose=1,perplexity=40,n_iter=300)
tsne_result = tsne.fit(X, Y)
tsne_result = np.array(tsne_result)
plt.scatter(tsne_result[:,0],tsne_result[: ,1],c = Y)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.title('T-SNE')
plt.savefig('temp_img/tsne.jpg')
plt.show()
def model_dtree(self,X,Y, feature_names, target_names, save_name, features_nums = 6):
sort_num = features_nums
from sklearn import tree
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=12)
dtree = tree.DecisionTreeClassifier()
dtree.fit(x_train, y_train)
with open(f'Dot/dtree_{save_name}_q1.svg','w') as f: # svg格式防止中文乱码
tree.export_graphviz(dtree,f,feature_names = feature_names,class_names = target_names)
print('决策树分类')
print(classification_report(dtree.predict(x_test),y_test))
'''最重要的特征'''
dtree_best_importance = dtree.feature_importances_
important_feature = list(dtree_best_importance)
ls = [[x,y] for x,y in zip(feature_names, important_feature)]
ls.sort(key=lambda x: x[1], reverse=True)
ls = np.array(ls)
value_x = [round(float(x),3) for x in ls[:sort_num,1]]
with open(f'temp_img/importance_features_{save_name}_q1.csv','w') as csvfile:
csvfile.write(str(value_x))
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.barh(range(sort_num),value_x,tick_label = ls[:sort_num,0])
plt.savefig(f'temp_img/importance_features_{save_name}_q1')
plt.show()
def data_analysis_and_3sigma(self, data):
"""
3σ法又称为标准差法。标准差本身可以体现因子的离散程度,是基于因子的平均值 X _ m e a n X\_meanX_mean而定的。在离群值处理过程中,可通过用X _ m e a n ± n ∗ σ X\_mean±n*\sigmaX_mean±n∗σ来衡量因子与平均值的距离。
标准差法处理的逻辑与MAD法类似:
第一步:计算出因子的平均值与标准差
第二步:确认参数 n(这里选定 n = 3)
第三步:确认因子值的合理范围为[ X _ m e d i a n − n ∗ σ , X _ m e d i a n + n ∗ σ ] [X\_median-n*\sigma,X\_median+n*\sigma][X_median−n∗σ,X_median+n∗σ],并对因子值作如下的调整:超出最大值的用最大值代替,小于最小值的用最小值代替。
原文链接:https://blog.csdn.net/weixin_42432468/article/details/112474043
:return:
"""
for i,value in enumerate([ 'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比', '株/丛数','鲜重(g)', '干重(g)', '10cm湿度(kg/m2)','40cm湿度(kg/m2)', '100cm湿度(kg/m2)', '200cm湿度(kg/m2)', '土壤蒸发量(W/m2)','径流量(m3/s)', '植被指数(NDVI)', '平均气温(℃)', '降水量(mm)', '平均风速(knots)']):
# self.winsorize_plot(data[value],i,'处理前',value)
sigma_winsorize = self.filter_extreme_3sigma(data[value],3,3)
data[value] = sigma_winsorize
# print('\n')
# print (sigma_winsorize.min(),sigma_winsorize.max())
# self.winsorize_plot(sigma_winsorize,i,'处理后',value)
data.to_excel('all_data.xlsx')
return data
def data_preprocess_q2(self):
"""
:return: (11/10, 38) x 12 ,(123, 38)
"""
climate, surface_emission = _init_climate(), _init_surface_emission() # 天气,表面蒸发量
humidity, ndvi, runoff = _init_humidity(),_init_ndvi(),_init_runoff() # 土壤湿度10cm,40cm,100cm, 植物NDVI , 径流量
data_1 = pd.merge(humidity, surface_emission, on=('月份', '年份', '经度(lon)', '纬度(lat)')) # 123x10
data_1 = pd.merge(data_1,ndvi)
data_1 = pd.merge(data_1,runoff)
data_1 = pd.merge(data_1,climate) # (123, 41)
feature_names = [ '月份', '年份','10cm湿度(kg/m2)', '40cm湿度(kg/m2)','100cm湿度(kg/m2)', '200cm湿度(kg/m2)',
'土壤蒸发量(W/m2)', '土壤蒸发量(mm)','降水量(mm)', '平均风速(knots)']
data_1 = data_1[feature_names]
month_data = []
for i in range(1, 13):
temp = data_1[data_1['月份']==i]
temp=temp.sort_values('年份')
temp.reset_index(inplace=True,drop=True)
month_data.append(temp)
del data_1['月份']
del data_1['年份']
return data_1, month_data
def data_preprocess_q3(self):
"""
['年份', '放牧小区Block', '放牧强度', 'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N',
'土壤C/N比', '株/丛数', '鲜重(g)', '干重(g)', 'plot__G11', 'plot__G12',
'plot__G13', 'plot__G16', 'plot__G17', 'plot__G18', 'plot__G19',
'plot__G20', 'plot__G21', 'plot__G6', 'plot__G8', 'plot__G9', '轮次__牧前',
'轮次__第一轮牧后', '轮次__第三轮牧后', '轮次__第二轮牧后', '轮次__第四轮牧后', '放牧方式__中牧(6天)',
'放牧方式__无牧(0天)', '放牧方式__轻牧(3天)', '放牧方式__重牧(12天)', '植物功能群__AB',
'植物功能群__PB', '植物功能群__PF', '植物功能群__PR', '月份', '10cm湿度(kg/m2)',
'40cm湿度(kg/m2)', '100cm湿度(kg/m2)', '200cm湿度(kg/m2)', '土壤蒸发量(W/m2)',
'径流量(m3/s)', '植被指数(NDVI)', '平均气温(℃)', '降水量(mm)', '平均风速(knots)']
"""
df = pd.read_csv('temp_xlsx/df.csv')
feature_names = ['放牧强度','放牧小区Block','年份','SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N',
'土壤C/N比','土壤蒸发量(W/m2)','降水量(mm)','100cm湿度(kg/m2)']
df = df[feature_names]
return df
def data_preprocess_q4(self):
climate, surface_emission = _init_climate(), _init_surface_emission() # 天气,表面蒸发量
humidity, ndvi, runoff = _init_humidity(),_init_ndvi(),_init_runoff() # 土壤湿度10cm,40cm,100cm, 植物NDVI , 径流量
graze_intensity, block_plant = _init_graze(), _init_block_plant() # 放牧强度与土壤CN元素含量
data_1 = pd.merge(humidity, surface_emission, on=('月份', '年份', '经度(lon)', '纬度(lat)')) # 123x10
data_1 = pd.merge(data_1,ndvi)
data_1 = pd.merge(data_1,runoff)
data_1 = pd.merge(data_1,climate)
del data_1['积雪深度(mm)']
del data_1['平均最大瞬时风速(knots)']
del data_1['最大瞬时风速极值(knots)']
data=data_1[['月份', '年份','10cm湿度(kg/m2)','200cm湿度(kg/m2)', '植被指数(NDVI)','平均气温(℃)', '降水量(mm)','平均风速(knots)']]
for i in data.columns[2:]:
data[i]=(data[i]-data[i].min())/(data[i].max()-data[i].min())
data[ '10cm湿度(kg/m2)']=1/3*data[ '10cm湿度(kg/m2)']
data[ '200cm湿度(kg/m2)']=1/3*data[ '200cm湿度(kg/m2)']
data[ '植被指数(NDVI)']=1/3*data[ '植被指数(NDVI)']
data[ '平均气温(℃)']=1/3*data[ '平均气温(℃)']
data[ '降水量(mm)']=1/3*data[ '降水量(mm)']
data[ '平均风速(knots)']=1/3*data[ '平均风速(knots)']
pca1 = PCA(n_components=1) #降到1维
X1 = data[['平均气温(℃)','降水量(mm)','平均风速(knots)']]
X2 = data[['10cm湿度(kg/m2)','200cm湿度(kg/m2)','植被指数(NDVI)']]
pca1.fit(X1)
newX1=pca1.fit_transform(X1) #降维后的数据
print(pca1.explained_variance_ratio_) #输出贡献率
pca2 = PCA(n_components=1) #降到1维
pca2.fit(X2)#训练
newX2=pca2.fit_transform(X2) #降维后的数据
print(pca2.explained_variance_ratio_) #输出贡献率
data['气象']=newX1
data['地表']=newX2
data['沙漠化程度指数']=data['气象']+data['地表']
i='沙漠化程度指数'
data[i]=(data[i]-data[i].min())/(data[i].max()-data[i].min())
data=data.groupby('年份').mean()
data.reset_index(inplace=True)
data0 = pd.merge(graze_intensity,humidity,right_on=['年份'],left_on=['year'])
data0=data0[['月份', '年份', '放牧小区(plot)', '放牧强度(intensity)', 'SOC土壤有机碳', 'SIC土壤无机碳',
'STC土壤全碳', '全氮N', '土壤C/N比',
'10cm湿度(kg/m2)', '40cm湿度(kg/m2)', '100cm湿度(kg/m2)', '200cm湿度(kg/m2)']]
data0=pd.merge(data0,data[['沙漠化程度指数','年份']],on=['年份'])
return data0
def data_preprocess_q1(self):
"""
建立不同放牧策略(放牧方式和放牧强度)对锡林郭勒草原土壤物理性质(主要是土壤湿度)和植被生物量影响的数学模型
:return dataframe
['年份', 'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比', '株/丛数',
'鲜重(g)', '干重(g)', 'plot__G11', 'plot__G12', 'plot__G13', 'plot__G16',
'plot__G17', 'plot__G18', 'plot__G19', 'plot__G20', 'plot__G21',
'plot__G6', 'plot__G8', 'plot__G9', '放牧强度', '轮次__牧前', '轮次__第一轮牧后',
'轮次__第三轮牧后', '轮次__第二轮牧后', '轮次__第四轮牧后', '放牧方式__中牧(6天)', '放牧方式__无牧(0天)',
'放牧方式__轻牧(3天)', '放牧方式__重牧(12天)', '植物功能群__AB', '植物功能群__PB', '植物功能群__PF',
'植物功能群__PR', '月份', '10cm湿度(kg/m2)', '200cm湿度(kg/m2)', '土壤蒸发量(W/m2)',
'径流量(m3/s)', '植被指数(NDVI)', '平均气温(℃)', '降水量(mm)', '平均风速(knots)']
"""
graze_intensity, block_plant = _init_graze(), _init_block_plant() # 放牧强度与土壤CN元素含量
graze_intensity.rename(columns={'year':'年份','放牧小区(plot)':'放牧小区Block' }, inplace=True)
"""取元素含量和植物含量的交集"""
data_0 = pd.merge(graze_intensity, block_plant, on=('年份','放牧小区Block'))
data_0 = data_0[[ '年份', '放牧小区Block', '放牧强度(intensity)', 'SOC土壤有机碳', 'SIC土壤无机碳',
'STC土壤全碳', '全氮N', '土壤C/N比', '轮次', '处理', '植物种名',
'植物群落功能群', '株/丛数','鲜重(g)', '干重(g)']]
data_0['放牧强度']=data_0['放牧强度(intensity)'].map({'NG':0,'LGI':1,'MGI':2,'HGI':3})
"""--------------------------------------------------------------"""
# print(df.isnull().sum()/df.shape[0])
# 合并数据集,去除异常值(插值方法)
for i in ['株/丛数', '鲜重(g)']:
data_0[i]=data_0[i].fillna(data_0[i].mean())
# print(data_0.isnull().sum()/data_0.shape[0])
data_0_notOneHot = data_0
data_0=pd.concat([data_0,pd.get_dummies(data_0['放牧小区Block'],prefix='plot_')],axis=1)
data_0=pd.concat([data_0,pd.get_dummies(data_0['轮次'],prefix='轮次_')],axis=1)
data_0=pd.concat([data_0,pd.get_dummies(data_0['处理'],prefix='放牧方式_')],axis=1)
data_0=pd.concat([data_0,pd.get_dummies(data_0['植物群落功能群'],prefix='植物功能群_')],axis=1)
data_0 = data_0[['年份', '放牧小区Block', '放牧强度','SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳','全氮N', '土壤C/N比', '株/丛数', '鲜重(g)','干重(g)', 'plot__G11', 'plot__G12', 'plot__G13', 'plot__G16','plot__G17', 'plot__G18', 'plot__G19', 'plot__G20', 'plot__G21','plot__G6', 'plot__G8', 'plot__G9', '轮次__牧前', '轮次__第一轮牧后','轮次__第三轮牧后', '轮次__第二轮牧后', '轮次__第四轮牧后', '放牧方式__中牧(6天)', '放牧方式__无牧(0天)','放牧方式__轻牧(3天)', '放牧方式__重牧(12天)', '植物功能群__AB', '植物功能群__PB', '植物功能群__PF','植物功能群__PR']] # 去掉无用数据
climate, surface_emission = _init_climate(), _init_surface_emission() # 天气,表面蒸发量
humidity, ndvi, runoff = _init_humidity(),_init_ndvi(),_init_runoff() # 土壤湿度10cm,40cm,100cm, 植物NDVI , 径流量
data_1 = pd.merge(humidity, surface_emission, on=('月份', '年份', '经度(lon)', '纬度(lat)')) # 123x10
data_1 = pd.merge(data_1,ndvi)
data_1 = pd.merge(data_1,runoff)
data_1 = pd.merge(data_1,climate)
data_1 = data_1[['月份', '年份','10cm湿度(kg/m2)','40cm湿度(kg/m2)','100cm湿度(kg/m2)','200cm湿度(kg/m2)','土壤蒸发量(W/m2)',
'径流量(m3/s)', '植被指数(NDVI)','平均气温(℃)', '降水量(mm)','平均风速(knots)']]
"""
data_0 shape:(14297, 35)
data_1 shape: (123, 10)
合并后shape: (171564, 44)
原因:按照年份相拼接,而土壤样本每年数据都是12份,故而这里合并后是 14297x12
"""
df = pd.merge(data_0, data_1,on=['年份'])
df = self.data_analysis_and_3sigma(df)
os.makedirs('temp_xlsx',exist_ok=True)
# df.to_excel("temp_xlsx/df.xlsx")
# data_0.to_excel("temp_xlsx/data_0.xlsx")
# data_1.to_excel("temp_xlsx/data_1.xlsx")
# data_0_notOneHot.to_excel("temp_xlsx/data_0_notOneHot.xlsx")
df.to_csv("temp_xlsx/df.csv")
data_0.to_csv("temp_xlsx/data_0.csv")
data_1.to_csv("temp_xlsx/data_1.csv")
data_0_notOneHot.to_csv("temp_xlsx/data_0_notOneHot.csv")
# np.save("temp_xlsx/df.npy",np.array(df))
# np.save("temp_xlsx/data_0.npy",np.array(data_0))
return df, data_0, data_1, data_0_notOneHot
def winsorize_plot(self,data,i,flag,name):
vertical_lines = self.data_vertical_lines(data)
fig = plt.figure(figsize=(12,6))
ax = fig.add_subplot(111)
_df = ax.hist(data, 100,density=True)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.title(f'{name}_{flag}')
color_list = ['red','green','yellow','black','gold','gray']
count = 0
for value in vertical_lines:
ax.bar(value, 0.1, width=0.05, color=color_list[count], alpha=1)
count += 1
plt.legend()
plt.savefig(f'temp_img/{i}-{flag}.jpg')
plt.show()
def filter_extreme_3sigma(self,data,n=3,times=3):
# times进行times次3sigma处理
series = data.copy()
for i in range(times):
mean = series.mean()
std = series.std()
max_range = mean + n*std
min_range = mean - n*std
series = np.clip(series,min_range,max_range)
df = pd.DataFrame(series)
return df
def data_vertical_lines(self, factor_data):
data_mean = factor_data.mean()
std = np.std(factor_data)
std_up = data_mean+3*std
std_low = data_mean-3*std
quantile_low = np.percentile(factor_data, 2.5)
quantile_high = np.percentile(factor_data, 97.5)
vertical_lines = [std_up, std_low, quantile_high, quantile_low]
return vertical_lines
def predict_plot(self,pred_data):
x = []
for i in range(4,13):
x.append(f"{i}")
for i in range(1,13):
x.append(f"_{i}")
plt.plot(x, pred_data[:,0], color='red', label='10cm湿度')
plt.xlabel( '月份')
plt.ylabel( '湿度')
plt.title( '2022~2023 10cm湿度')
plt.legend() # 显示图例
plt.savefig('Q2_fig/2022-2023 10cm湿度.jpg')
plt.show()
plt.plot(x, pred_data[:,1], color='red', label='40cm湿度')
plt.xlabel( '月份')
plt.ylabel( '湿度')
plt.title( '2022~2023 40cm湿度')
plt.legend() # 显示图例
plt.savefig('Q2_fig/2022-2023 40cm湿度.jpg')
plt.show()
plt.plot(x, pred_data[:,2], color='red', label='100cm湿度')
plt.xlabel( '月份')
plt.ylabel( '湿度')
plt.title( '2022~2023 100cm湿度')
plt.legend() # 显示图例
plt.savefig('Q2_fig/2022-2023 100cm湿度.jpg')
plt.show()
plt.plot(x, pred_data[:,3], color='red', label='200cm湿度')
plt.xlabel( '月份')
plt.ylabel( '湿度')
plt.title( '2022~2023 200cm湿度')
plt.legend() # 显示图例
plt.savefig('Q2_fig/2022-2023 100cm湿度.jpg')
plt.show()
plt.plot(x, pred_data[:,0], color='blue', label='10cm')
plt.plot(x, pred_data[:,1], color='blue', label='40cm')
plt.plot(x, pred_data[:,2], color='red', label='100cm')
plt.plot(x, pred_data[:,3], color='green', label='200cm')
plt.xlabel( '月份')
plt.ylabel( '湿度')
plt.title( '2022~2023 湿度')
plt.legend() # 显示图例
plt.savefig('Q2_fig/2022-2023 湿度.jpg')
plt.show()
with open('Q2_fig/predict2022_2023.csv','w') as csvfile:
csvfile.write(str(pred_data[:,:4]))
plt.subplot(221)
plt.plot(x, pred_data[:,0], color='blue', label='10cm')
plt.ylabel( '湿度')
plt.title( '2022~2023 湿度')
plt.legend() # 显示图例
plt.subplot(222)
plt.plot(x, pred_data[:,1], color='blue', label='40cm')
plt.title( '2022~2023 湿度')
plt.legend() # 显示图例
plt.subplot(223)
plt.plot(x, pred_data[:,2], color='red', label='100cm')
plt.ylabel( '湿度')
plt.legend() # 显示图例
plt.subplot(224)
plt.plot(x, pred_data[:,3], color='green', label='200cm')
plt.legend() # 显示图例
plt.savefig('Q2_fig/2022-2023 湿度4图整合.jpg')
plt.show()
def Predict_RMSE_BA_q3(self,X,y,scaler, ppp):
model=load_model('lstm_model.h5')
trainPredict = model.predict(X)
testPredict = scaler.inverse_transform(trainPredict)
testY = scaler.inverse_transform(y)
self.score(testY[:,0], testPredict[:,0])
#'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比'
plt.plot(testY[:,0],color='yellow', label='observed data')
plt.plot(testPredict[:,0], color='red', label='LSTM')
plt.xlabel( '时间')
#'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比'
plt.ylabel( 'SOC土壤有机碳')
plt.title( '2012~2020 %s SOC土壤有机碳 情况'%ppp)
plt.legend() # 显示图例
plt.savefig('Q3_fig/2012~2020 %s SOC土壤有机碳 情况.jpg'%ppp)
plt.show()
self.score(testY[:,1], testPredict[:,1])
plt.plot(testY[:,1],color='yellow', label='observed data')
plt.plot(testPredict[:,1], color='red', label='LSTM')
plt.xlabel( '时间')
#'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比'
plt.ylabel( 'SIC土壤无机碳')
plt.title( '2012~2020 %s SIC土壤无机碳 情况'%ppp)
plt.legend() # 显示图例
plt.savefig('Q3_fig/2012~2020 %s SIC土壤无机碳 情况.jpg'%ppp)
plt.show()
self.score(testY[:,2], testPredict[:,2])
plt.plot(testY[:,2],color='yellow', label='observed data')
plt.plot(testPredict[:,2], color='red', label='LSTM')
plt.xlabel( '时间')
#'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比'
plt.ylabel( 'STC土壤全碳')
plt.title( '2012~2020 %s STC土壤全碳 情况'%ppp)
plt.legend() # 显示图例
plt.savefig('Q3_fig/2012~2020 %s STC土壤全碳 情况.jpg'%ppp)
plt.show()
self.score(testY[:,3], testPredict[:,3])
plt.plot(testY[:,3],color='yellow', label='observed data')
plt.plot(testPredict[:,3], color='red', label='LSTM')
plt.xlabel( '时间')
#'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比'
plt.ylabel( '全氮N')
plt.title( '2012~2020 %s 全氮N 情况'%ppp)
plt.legend() # 显示图例
plt.savefig('Q3_fig/2012~2020 %s 全氮N 情况.jpg'%ppp)
plt.show()
self.score(testY[:,4], testPredict[:,4])
plt.plot(testY[:,4],color='yellow', label='observed data')
plt.plot(testPredict[:,4], color='red', label='LSTM')
plt.xlabel( '时间')
#'SOC土壤有机碳', 'SIC土壤无机碳', 'STC土壤全碳', '全氮N', '土壤C/N比'
plt.ylabel( '土壤C/N比')
plt.title( '2012~2020 %s 土壤C/N比 情况'%ppp)
plt.legend() # 显示图例
plt.savefig('Q3_fig/2012~2020 %s 土壤CN比 情况.jpg'%ppp)
plt.show()
return testPredict,testY
def Predict_RMSE_BA(self,X,y,scaler):
model=load_model('lstm_model.h5')
trainPredict = model.predict(X)
testPredict = scaler.inverse_transform(trainPredict)
testY = scaler.inverse_transform(y)
self.score(testY[:,0], testPredict[:,0])
os.makedirs('Q2_fig',exist_ok=True)
#'10cm湿度(kg/m2)', '40cm湿度(kg/m2)','100cm湿度(kg/m2)', '200cm湿度(kg/m2)'
plt.plot(testY[:,0],color='blue', label='observed data')
plt.plot(testPredict[:,0], color='red', label='LSTM')
plt.xlabel( '时间')
plt.ylabel( '湿度')
plt.title( '2012~2022 10cm湿度')
plt.legend() # 显示图例
plt.savefig('Q2_fig/2012~2022 1 月份10cm湿度.jpg')
plt.show()
#'10cm湿度(kg/m2)', '40cm湿度(kg/m2)','100cm湿度(kg/m2)', '200cm湿度(kg/m2)'
self.score(testY[:,1], testPredict[:,1])
plt.plot(testY[:,1],color='blue', label='observed data')
plt.plot(testPredict[:,1], color='red', label='LSTM')
plt.xlabel( '时间')
plt.ylabel( '湿度')
plt.title( '2012~2022 40cm湿度')
plt.legend() # 显示图例
plt.savefig('Q2_fig/2012~2022 1 月份 40cm湿度.jpg')
plt.show()
#'10cm湿度(kg/m2)', '40cm湿度(kg/m2)','100cm湿度(kg/m2)', '200cm湿度(kg/m2)'
self.score(testY[:,2], testPredict[:,2])
plt.plot(testY[:,2],color='blue', label='observed data')
plt.plot(testPredict[:,2], color='red', label='LSTM')
plt.xlabel( '时间')
plt.ylabel( '湿度')
plt.title( '2012~2022 100cm湿度')
plt.legend() # 显示图例
plt.savefig('Q2_fig/2012~2022 1 月份 100cm湿度.jpg')
plt.show()
#'10cm湿度(kg/m2)', '40cm湿度(kg/m2)','100cm湿度(kg/m2)', '200cm湿度(kg/m2)'
self.score(testY[:,3], testPredict[:,3])
plt.plot(testY[:,3],color='blue', label='observed data')
plt.plot(testPredict[:,3], color='red', label='LSTM')
plt.xlabel( '时间')
plt.ylabel( '湿度')
plt.title( '2012~2022 200cm湿度')
plt.legend() # 显示图例
plt.savefig('Q2_fig/2012~2022 1 月份 200cm湿度.jpg')
plt.show()
return testPredict,testY
%%time
Q(Q1 = True)
决策树分类
precision recall f1-score support
0 1.00 1.00 1.00 11120
1 1.00 1.00 1.00 14344
2 1.00 1.00 1.00 12925
3 1.00 1.00 1.00 13081
accuracy 1.00 51470
macro avg 1.00 1.00 1.00 51470
weighted avg 1.00 1.00 1.00 51470
决策树分类
precision recall f1-score support
0 0.95 0.96 0.95 10992
1 0.91 0.94 0.93 13916
2 0.90 0.89 0.89 13058
3 0.92 0.89 0.90 13504
accuracy 0.92 51470
macro avg 0.92 0.92 0.92 51470
weighted avg 0.92 0.92 0.92 51470
决策树分类
precision recall f1-score support
0 1.00 1.00 1.00 11120
1 1.00 1.00 1.00 14344
2 1.00 1.00 1.00 12925
3 1.00 1.00 1.00 13081
accuracy 1.00 51470
macro avg 1.00 1.00 1.00 51470
weighted avg 1.00 1.00 1.00 51470
CPU times: total: 47.5 s
Wall time: 1min 24s
<__main__.Q at 0x28104037ac0>
%%time
Q(Q2 = True)
%%time
Q(Q3 = True)
这个图由spss生成 SOC土壤有机碳 SIC土壤无机碳 STC土壤全碳 全氮N 土壤C/N比 土壤蒸发量(W/m2) \ 0 15.679023 7.983333 23.662356 1.813318 14.102624 8.950833 1 15.763244 7.833333 23.596577 1.971321 12.858514 8.682500 2 16.858300 6.086750 22.945050 2.115200 10.847698 11.865000
降水量(mm) 100cm湿度(kg/m2)
0 72.890627 46.701667
1 105.982500 50.712500
2 33.062500 60.183164
Epoch 197/200
1/1 - 0s - loss: 0.0185 - 6ms/epoch - 6ms/step
Epoch 198/200
1/1 - 0s - loss: 0.0178 - 7ms/epoch - 7ms/step
Epoch 199/200
1/1 - 0s - loss: 0.0172 - 6ms/epoch - 6ms/step
Epoch 200/200
1/1 - 0s - loss: 0.0166 - 6ms/epoch - 6ms/step
1/1 [==============================] - 0s 242ms/step
MAPE :
0.03806636292160916
RMSE :
0.006268582249815876
MAE :
0.006226315879828803
CPU times: total: 42.5 s
Wall time: 1min 19s
%%time
Q(Q4 = True)
data[‘沙漠化程度指数’]=data[‘气象’]+data[‘地表’]
[0.65203212]
[0.55822559]
[0.68995241]
[0.79709561]
月份 年份 放牧小区(plot) 放牧强度(intensity) SOC土壤有机碳 SIC土壤无机碳 STC土壤全碳 \
24 1 2012 G21 NG 14.549908 9.6000 24.149908
25 2 2012 G21 NG 14.549908 9.6000 24.149908
26 3 2012 G21 NG 14.549908 9.6000 24.149908
27 4 2012 G21 NG 14.549908 9.6000 24.149908
28 5 2012 G21 NG 14.549908 9.6000 24.149908
... .. ... ... ... ... ... ...
1471 8 2020 G21 NG 20.133500 4.0649 24.198400
1472 9 2020 G21 NG 20.133500 4.0649 24.198400
1473 10 2020 G21 NG 20.133500 4.0649 24.198400
1474 11 2020 G21 NG 20.133500 4.0649 24.198400
1475 12 2020 G21 NG 20.133500 4.0649 24.198400
全氮N 土壤C/N比 10cm湿度(kg/m2) 40cm湿度(kg/m2) 100cm湿度(kg/m2) \
24 1.871001 13.818022 13.73 30.87 42.79
25 1.871001 13.818022 13.00 30.87 42.79
26 1.871001 13.818022 12.60 30.87 42.79
27 1.871001 13.818022 11.97 30.73 42.76
28 1.871001 13.818022 14.18 29.99 42.58
... ... ... ... ... ...
1471 2.431150 9.953479 20.79 56.63 68.52
1472 2.431150 9.953479 20.04 56.67 76.04
1473 2.431150 9.953479 16.59 52.88 80.84
1474 2.431150 9.953479 15.04 50.66 82.25
1475 2.431150 9.953479 16.51 50.40 82.44
200cm湿度(kg/m2) 沙漠化程度指数 有机物含量 土壤湿度 土壤板结化指数 jiehe
24 168.56 0.528621 2.167550 -12.113044 0.203202 0.365912
25 168.56 0.528621 2.167550 -12.205622 0.201524 0.365073
26 168.56 0.528621 2.167550 -12.256350 0.200605 0.364613
27 168.56 0.528621 2.167550 -12.446052 0.197168 0.362895
28 168.56 0.528621 2.167550 -12.762805 0.191429 0.360025
... ... ... ... ... ... ...
1471 166.51 0.636140 -6.205506 24.702216 0.718527 0.677334
1472 166.32 0.636140 -6.205506 30.467347 0.822982 0.729561
1473 166.09 0.636140 -6.205506 31.414091 0.840135 0.738138
1474 165.95 0.636140 -6.205506 30.941572 0.831574 0.733857
1475 165.92 0.636140 -6.205506 31.115248 0.834720 0.735430
[132 rows x 18 columns]
CPU times: total: 4.88 s
Wall time: 4.85 s
%%time
Q(Q5 = True)
月份 年份 10cm湿度(kg/m2) 200cm湿度(kg/m2) 植被指数(NDVI) 平均气温(℃) 降水量(mm) \
0 1 2012 0.328250 1.000000 0.030547 0.008070 0.002568
1 2 2012 0.269663 1.000000 0.030547 0.113180 0.002568
2 3 2012 0.237560 1.000000 0.220257 0.335609 0.024490
3 4 2012 0.186998 1.000000 0.297428 0.626319 0.006840
4 5 2012 0.364366 1.000000 0.340836 0.785020 0.056964
.. .. ... ... ... ... ... ...
118 11 2021 0.342697 0.002451 0.411576 0.360852 0.595275
119 12 2021 0.280899 0.000000 0.069132 0.225947 0.217316
120 1 2022 0.225522 0.000000 0.043408 0.129112 0.681001
121 2 2022 0.197432 0.000000 0.043408 0.111732 0.892632
122 3 2022 0.426966 0.000000 0.327974 0.433892 0.129593
平均风速(knots)
0 0.216981
1 0.309434
2 0.564151
3 0.839623
4 0.790566
.. ...
118 0.288679
119 0.292453
120 0.000000
121 0.175472
122 0.377358