如何用Python按年份与季节计算海域温度平均值并优化R²值?
解决方案:按季节分组计算均值并分别拟合趋势
1. 数据加载与分组均值计算
假设你的数据集为CSV格式,使用pandas加载后,按年份+季节分组计算温度均值,确保每个年份的春、秋季各有一个独立的均值,避免不同季节数据混杂。
import pandas as pd import matplotlib.pyplot as plt import numpy as np from sklearn.linear_model import LinearRegression # 加载数据集(替换为你的文件路径) df = pd.read_csv('temperature_data.csv') # 按年份和季节分组,计算温度均值 seasonal_mean = df.groupby(['年份', '季节'])['温度'].mean().reset_index() # 拆分春季、秋季数据集 spring_data = seasonal_mean[seasonal_mean['季节'] == '春季'] autumn_data = seasonal_mean[seasonal_mean['季节'] == '秋季']
2. 分季节拟合趋势并计算R²
对春、秋季数据分别做线性回归拟合,单独计算每个季节的R²值,避免跨季节数据干扰导致拟合精度下降。
# 定义线性拟合工具函数 def fit_trend(x, y): x = x.values.reshape(-1, 1) model = LinearRegression() model.fit(x, y) y_pred = model.predict(x) r_squared = model.score(x, y) return model.coef_[0], model.intercept_, y_pred, r_squared # 拟合春季温度趋势 spring_slope, spring_intercept, spring_pred, spring_r2 = fit_trend(spring_data['年份'], spring_data['温度']) # 拟合秋季温度趋势 autumn_slope, autumn_intercept, autumn_pred, autumn_r2 = fit_trend(autumn_data['年份'], autumn_data['温度'])
3. 可视化分季节趋势图
用不同颜色区分春、秋季的散点和拟合线,同时标注各自的R²值,清晰展示两个季节的温度变化趋势。
plt.figure(figsize=(10, 6)) # 绘制春季散点与拟合线 plt.scatter(spring_data['年份'], spring_data['温度'], color='forestgreen', label=f'春季 (R²={spring_r2:.3f})') plt.plot(spring_data['年份'], spring_pred, color='forestgreen', linestyle='--') # 绘制秋季散点与拟合线 plt.scatter(autumn_data['年份'], autumn_data['温度'], color='darkorange', label=f'秋季 (R²={autumn_r2:.3f})') plt.plot(autumn_data['年份'], autumn_pred, color='darkorange', linestyle='--') plt.xlabel('年份') plt.ylabel('海域温度') plt.title('1963-2021年春秋季海域温度变化趋势') plt.legend() plt.grid(True, alpha=0.3) plt.show()
关键注意点
- 核心逻辑是拆分季节分组计算均值,从根源解决同一年份不同季节数据混杂导致R²偏低的问题。
- 若数据集季节字段为英文(如
Spring/Autumn),修改代码中季节判断的匹配字符串即可。 - 如需更复杂的趋势拟合(如多项式回归),替换
LinearRegression为对应模型即可。
内容的提问来源于stack exchange,提问作者Christina Ziccardi
相关产品推荐
相关产品推荐

