| # 从Excel中读取两列数据,分别是NDVI和鸟类数量 | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| from scipy.optimize import curve_fit | |
| from sklearn.metrics import r2_score | |
| import numpy as np | |
| # 读取Excel文件 | |
| df = pd.read_excel('E:/Downloads/FAC终值.xlsx',sheet_name='NDVI') | |
| # 获取NDVI和鸟类数量两列数据 | |
| NDVI1 = df['NDVI1'] | |
| # NDVI2 = df['NDVI2'][0:106] | |
| # NDVI3 = df['NDVI3'][0:52] | |
| # NDVI4 = df['NDVI4'][0:11] | |
| num1 = df['NUM1'] | |
| # num2 = df['数量2'][0:106] | |
| # num3 = df['数量3'][0:52] | |
| # num4 = df['数量4'][0:11] | |
| print(len(NDVI1), len(num1)) | |
| # num标准化到【0,1】,NDVI标准化到【-1,1】 | |
| # num1 = (num1 - np.min(num1)) / (np.max(num1) - np.min(num1)) | |
| # num2 = (num2 - np.min(num2)) / (np.max(num2) - np.min(num2)) | |
| # num3 = (num3 - np.min(num3)) / (np.max(num3) - np.min(num3)) | |
| # num4 = (num4 - np.min(num4)) / (np.max(num4) - np.min(num4)) | |
| # NDVI1 = (NDVI1 - np.min(NDVI1)) / (np.max(NDVI1) - np.min(NDVI1)) | |
| # NDVI2 = (NDVI2 - np.min(NDVI2)) / (np.max(NDVI2) - np.min(NDVI2)) | |
| # NDVI3 = (NDVI3 - np.min(NDVI3)) / (np.max(NDVI3) - np.min(NDVI3)) | |
| # NDVI4 = (NDVI4 - np.min(NDVI4)) / (np.max(NDVI4) - np.min(NDVI4)) | |
| # 对两列数据进行高斯拟合,返回拟合的参数 | |
| NDVI = [ NDVI1] | |
| num = [ num1] | |
| # 使用高斯函数拟合 | |
| def gaussian(x, a, b, c, d): | |
| return a * np.exp(-(x - b) ** 2 / (2 * c ** 2)) + d | |
| # 使用高斯拟合 | |
| def gaussian_fit(x, y): | |
| # 使用curve_fit拟合 | |
| params, _ = curve_fit(gaussian, x, y) | |
| return params | |
| # 使用高斯拟合并计算R²值 | |
| for i in range(len(NDVI)): | |
| if len(NDVI[i]) == len(num[i]): | |
| params = gaussian_fit(NDVI[i], num[i]) | |
| # 设置num轴为指数坐标轴 | |
| # plt.semilogy(NDVI[i], num[i], label=f'Data {i+1}') | |
| # 设置num轴为对数坐标轴 | |
| # plt.semilogy(NDVI[i], num[i], label=f'Data {i+1}') | |
| # 绘制拟合曲线 | |
| x_fit = np.linspace(min(NDVI[i]), max(NDVI[i]), 100) | |
| y_fit = gaussian(x_fit, *params) | |
| # 输出拟合参数以及对应R²值和参数的名称,四个参数值分别是什么 | |
| print(f'拟合参数a表示振幅: {params[0]}') | |
| print(f'拟合参数b表示均值: {params[1]}') | |
| print(f'拟合参数c表示标准差: {params[2]}') | |
| print(f'拟合参数d表示偏移量: {params[3]}') | |
| plt.plot(x_fit, y_fit, label=f'Fit {i+1}') | |
| # 绘制散点图 | |
| plt.scatter(NDVI[i], num[i], label=f'Data {i+1}') | |
| # 计算R²值 | |
| y_pred = gaussian(NDVI[i], *params) | |
| R2 = r2_score(num[i], y_pred) | |
| print(f'R² for Fit {i+1}: {R2:.4f}') | |
| else: | |
| print(f"数据长度不匹配: NDVI长度={len(NDVI[i])}, 数量长度={len(num[i])}") | |
| plt.legend() | |
| plt.show() | |
| # # 读取E:\bang\KUNKUN\省市区县鸟种、观鸟记录等相关数据(1980-2024年)\1980~2024年观鸟记录、经纬度及其所处的省市区县数据.dta | |
| # import pandas as pd | |
| # # 读取dta文件 | |
| # df_id = pd.read_excel('E:/bang/KUNKUN/省市区县鸟种、观鸟记录等相关数据(1980-2024年)/江西省.xlsx') | |
| # df = pd.read_stata('E:/bang/KUNKUN/省市区县鸟种、观鸟记录等相关数据(1980-2024年)/1980~2024年鸟种观测统计报告(更新后).dta') | |
| # # 提取df_id的id列 | |
| # id_list = df_id['reportId'].tolist() | |
| # # 打印df的列名 | |
| # print(df.columns) | |
| # # 打印df的行数 | |
| # print(df.shape[0]) | |
| # # 根据id_list提取df的记录 | |
| # jiangxi_df = df[df['reportId'].isin(id_list)] | |
| # # 保存为csv | |
| # jiangxi_df.to_excel('E:/bang/KUNKUN/省市区县鸟种、观鸟记录等相关数据(1980-2024年)/江西省1.xlsx') |