数据:
链接:https://pan.baidu.com/s/1-E2ShVTdI0X5lwDtMLFFsQ
提取码:0929
#数据所在的文件
metepath='./part/mete10-14.csv'
vipath='./part/vi10-14.csv'
# 读取数据
data_mete=pd.read_csv(metepath)
data_vi=pd.read_csv(vipath)
按日期行向合并part文件夹下的两个csv,这两个文件日期范围不同,按照mete.csv文件的日期对齐;合并后的数据命名为data1
# 按日期行向合并part文件夹下的两个csv,按照mete.csv文件的日期对齐;
#
合并后的数据命名为data1;
#
若合并后的数据中有无效值,则使用无效值其所在列的平均值填充。
data1=pd.merge(data_mete,data_vi,on='Date',how='left')
data1['Date']=pd.to_datetime(data1['Date'])
data1=data1.fillna({'NDVI':np.mean(data1['NDVI']),'EVI':np.mean(data1['EVI'])})
# 读取comb下面的csv文件,命名为data2;
#
纵向堆叠合并data1和data2;
#
堆叠之后需要去除重复数据;得到的数据命名为data3。
combpath='./comb/data04-10.csv'
data2=pd.read_csv(combpath)
#将日期转化为标准日期格式
data2['Date']=pd.to_datetime(data2['Date'])
#纵向堆叠合并data1和data2
data3=pd.concat([data1,data2],axis=0)
data3['Date']=pd.to_datetime(data3['Date'])
去除重复值并且按照日期重新排序
#data1和data2中具有重复的数据,堆叠之后需要去除重复数据;这一步得到的数据命名为data3
data3=data3.drop_duplicates()
#更改数据的排序方式按照日期从小到大排
data3.sort_values(by = 'Date',inplace=True)
# 根据3σ原则检测GPP中的异常值,从data3中去除异常点记录
#数值分布在(μ-3σ,μ+3σ)中的概率为0.9974
#可以认为,Y 的取值几乎全部集中在(μ-3σ,μ+3σ)]区间内,超出这个范围的可能性仅占不到0.3%。
print('去除异常值')
gpp_max=data3['GPP'].mean()+3*data3['GPP'].std()
gpp_min=data3['GPP'].mean()-3*data3['GPP'].std()
data3=data3.loc[(data3['GPP']>gpp_min)&(data3['GPP']<gpp_max),: ]
使用2010年及以前的数据作为训练集,2010年以后的数据作为测试集,使用训练数据训练模型,测试数据仅用于测试模型
将TA、VPD、RG、NDVI、EVI列作为特征(输入),将GPP列作为标签(输出)
train=data3.loc[data3['Date'].dt.year<=2010].copy()
test=data3.loc[data3['Date'].dt.year>2010].copy()
x_train=train[['TA','VPD','RG','NDVI','EVI']]
y_train=train[['GPP']]
x_test=test[['TA','VPD','RG','NDVI','EVI']]
y_test=test[['GPP']]
from sklearn.model_selection import train_test_split
#在机器学习中,该函数可按照用户设定的比例,
#随机将样本集合划分为训练集 和测试集,
#并返回划分好的训练集和测试集数据
建模之前要对所有输入数据标准化,标准化方式使用标准差标准化;两个数据集的标准化过程中均使用训练集变量的平均值和方差
#(3) 建模之前要对所有输入数据标准化,标准化方式使用标准差标准化;两个数据集的标准化过程中均使用训练集变量的平均值和方差
from sklearn.preprocessing import StandardScaler
# 将训练集和测试集数据进行标准差标准化
scaler=StandardScaler()
x_tr=scaler.fit_transform(x_train.values)
y_tr=scaler.fit_transform(y_train.values.reshape(-1,1)).ravel()
x_te=scaler.fit_transform(x_test.values)
y_te=scaler.fit_transform(y_test.values.reshape(-1,1)).ravel()
#对处于不同气温区间的数据进行标记
#(1) 将气温划分成4个级别:very_low, low, normal, high;他们的温度范围为
#增加新一列为温度的水平
test.loc[(test['TA']>-10) &(test['TA']<=0),'TA_Level']='very_low'
test.loc[(test['TA']>0) &(test['TA']<=10),'TA_Level']='low'
test.loc[(test['TA']>10) &(test['TA']<=20),'TA_Level']='normal'
test.loc[(test['TA']>20) &(test['TA']<=30),'TA_Level']='high'
train.to_csv('test6_train.csv',index=False)
test.to_csv('test6_test.csv',index=False)