2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入

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-)

2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第1张图片

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)

2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第2张图片

决策树分类
              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

2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第3张图片

决策树分类
              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

2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第4张图片

CPU times: total: 47.5 s
Wall time: 1min 24s





<__main__.Q at 0x28104037ac0>
%%time
Q(Q2 = True)

2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第5张图片

2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第6张图片

2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第7张图片

%%time
Q(Q3 = True)

这个图由spss生成2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第8张图片 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)

2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第9张图片2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第10张图片

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  

2022数学建模E题,关于不会数学公式放牧,只能用代码建模来放牧的痛苦回忆。包含完整代码和记录,此方法肯定有问题,但是我无能为力了,欢迎前来吃瓜。注意,代码偏多。慎入_第11张图片

你可能感兴趣的:(机器学习,-,仿生算法,python,机器学习,开发语言)