【python】python基于辐照值与天气数据的线性回归预测与分析(源码+论文+数据集)【独一无二】

【python】python基于辐照值与天气数据的线性回归预测与分析(源码+论文+数据集)【独一无二】


一、设计要求

本项目旨在实现对光伏辐照数据与天气数据的综合分析与预测建模,其设计要求包括数据的读取、清洗、合并、特征工程、建模与可视化六大环节。首先,需要从Excel文件中准确读取辐照值数据与天气数据,并确保在跳过指定行数或读取指定工作表时不丢失关键字段。其次,应对重复值进行删除并使用前向填充方法补齐缺失数据,保证数据完整性及一致性。此外,将日期与时间合并为统一的Datetime列,使后续能按时间进行精确对齐。随后,使用描述性统计与可视化手段对数据进行初步探索,透视总体分布与变化趋势。在数据合并中需利用最近时间匹配策略以提升记录对齐的准确度,并删除不相关列减少噪声。对于风向与天气等分类特征,要求采用独热编码转化成模型可用的数值列,从而提高特征识别能力。最后需建立线性回归模型对直接辐照值进行预测,并输出均方误差和决定系数等关键指标,通过散点图对比真实值和预测值,评估模型的准确性与稳健性。


>

二、设计思路

1. 数据读取

  1. 使用 pandas 库的 pd.read_excel() 方法,分别读取辐照值数据(“辐照值数据.xlsx”)和天气数据(“电站及天气数据.xlsx”)。
  2. 其中,辐照值数据在读取时跳过了前 7 行表头(header=7),而天气数据则指定了工作表名为“王伯水-天气”,并使用 openpyxl 作为引擎。
# 数据读取
irradiance_data = pd.read_excel('辐照值数据.xlsx', header=7)
weather_data = pd.read_excel('电站及天气数据.xlsx', 
                             xxxx, 
                             engine='openpyxl')
  1. 从“辐照值数据.xlsx”的第 8 行开始读取数据(指定 header=7)。
  2. 从“电站及天气数据.xlsx”的“王伯水-天气”工作表中读取数据,并指定使用 openpyxl 作为解析引擎,保证对 Excel 文件的正确解析。

2. 数据清洗

  1. 使用 drop_duplicates() 去除重复数据,保证每行记录只出现一次。
  2. 使用 fillna(method='ffill') 对缺失值进行前向填充,避免缺失值对后续分析的影响。

略。。。
此步骤确保后续分析在尽量干净且完整的数据基础上进行。


3. 时间合并与数据格式处理

  1. 通过 pd.to_datetime() 方法,针对辐照值数据,将“日期”和“时间”合并为一个新的时间戳列 Datetime;对天气数据,将 “TIME” 列转换为时间戳 Datetime
  2. 为了方便后续合并和分析,需要对两个数据集按照时间排序,并使用 pd.merge_asof() 方法进行合并(direction='nearest' 表示寻找最近时间点进行匹配)。

该步骤将辐照值和天气信息对齐到统一的时间轴上,便于后续建模和分析。

# 数据清洗
irradiance_data.drop_duplicates(inplace=True)
weather_data.drop_duplicates(inplace=True)

# 缺失值处理
irradiance_data.fillna(method='ffill', inplace=True)
weather_data.fillna(method='ffill', inplace=True)
  1. 使用 drop_duplicates() 去重,保证每张表中没有重复条目;
  2. 使用 fillna(method='ffill') 前向填充缺失值,避免在后续分析和建模时出现空值的干扰。

4. 描述性统计

# 结合日期和时间列为一个新的 datetime 列
irradiance_data['Datetime'] = pd.to_datetime(
    irradiance_data['日期'].astype(str) + ' ' + irradiance_data['时间'].astype(str)
)
weather_data['Datetime'] = pd.to_datetime(weather_data['TIME'])
  1. 对辐照值数据,将“日期”与“时间”两列字符串拼接之后使用 pd.to_datetime() 转为时间戳;
  2. 对天气数据,将其“TIME”列直接转换为时间戳。
    这样做可以在后续基于同一时间戳进行数据对齐或合并。
# 描述性统计
print("辐照数据描述性统计:")
print(irradiance_data.describe())

print("\n天气数据描述性统计:")
print(weather_data.describe())


通过 describe() 方法快速查看各个数值字段的基本统计信息,包括均值、标准差、中位数及最大最小值等,帮助我们对数据分布与波动范围有初步了解。

代码中使用 describe() 方法对两个数据集进行了基本的统计说明,包括均值、方差、最大值、最小值等信息。这一步可以帮助快速了解数据的分布和质量,为后续分析提供参考。


5. 数据可视化

# 数据可视化
plt.figure(figsize=(12, 6))
# 代码略【至少10行】.....
plt.title('辐照值随时间变化图')
plt.legend()
plt.show()

  1. 通过 seaborn 中的 lineplot() 绘制“直接辐照W/m2”与“散射辐照W/m2”随时间的曲线,直观查看辐照值在不同时刻的变化趋势;
  2. 旋转时间刻度便于阅读,添加图例和标题提高可读性。
  3. 使用 matplotlibseaborn 进行可视化:
  4. 通过 sns.lineplot() 分别绘制“直接辐照W/m2”与“散射辐照W/m2”随时间变化的趋势图。
  5. 设置中文显示和旋转横坐标刻度,以便更直观地观察辐照值随时间的分布情况。

可视化有助于快速查看数据整体趋势与异常值。


6. 数据预处理与特征工程

# 数据集成
merged_data = pd.merge_asof(
    irradiance_data.sort_values('Datetime'),
# 代码略【至少10行】.....
# 代码略【至少10行】.....
    direction='nearest'
)
  1. 使用 pd.merge_asof 按照时间顺序对两个数据集进行合并,其中 direction='nearest' 表示在时间上匹配最近的记录;
  2. 在数据合并之前,将各自的数据集按照 “Datetime” 排序,以确保 merge_asof 正确找出最近的时间行进行合并。
# 去除不必要的列
merged_data.drop(
# 代码略【至少10行】.....
    inplace=True
)

# 将风向和天气进行 one-hot 编码
encoded_data = pd.get_dummies(merged_data, columns=['WIND_DIR', 'WEATHER'])
  1. 去除无关或冗余列(如日期、时间、TIME、电站编码、POWER_STATION_NAME 等),减少对后续模型训练的不利影响。
  2. 使用 pd.get_dummies() 对风向(WIND_DIR)和天气(WEATHER)进行独热编码,将分类变量转换为可被模型理解的数值特征。

此步骤有助于提升模型对特征的区分能力,并减少异常噪声对结果的干扰。


7. 建立线性回归模型

# 特征矩阵和目标变量
X = encoded_data.drop(['Datetime', '直接辐照W/m^2'], axis=1)
y = encoded_data['直接辐照W/m^2']

# 划分训练集和测试集
# 代码略【至少10行】.....
# 代码略【至少10行】.....


# 建立并训练线性回归模型
# 代码略【至少10行】.....
# 代码略【至少10行】.....


# 预测
y_pred = model.predict(X_test)

# 模型评价
mse = mean_squared_error(y_test, y_pred)
# 代码略【至少10行】.....
# 代码略【至少10行】.....

print(f"均方误差: {mse}")
print(f"R^2 分数: {r2}")
  1. 将特征变量(X)与目标变量(y)进行分离:
  2. 目标变量:直接辐照值(直接辐照W/m^2
  3. 特征:去除时间戳和目标值后的所有数值与独热编码变量
  4. 使用 train_test_split() 方法,将数据集分为训练集和测试集,避免过拟合,并利用固定随机种子(random_state=42)便于复现结果。
  5. 使用 LinearRegression() 建立线性回归模型,对训练集数据进行拟合(model.fit(X_train, y_train))。

模型训练完成后,就可以用此模型对新的或未知的同样结构的数据进行预测。


8. 模型评价

在测试集上进行预测(model.predict(X_test)),通过以下指标衡量模型性能:

  1. 均方误差(mean_squared_error):衡量预测值与真实值间的误差平方的平均值。
  2. 决定系数 R² 分数(r2_score):反映模型对真实数据的拟合程度,越接近 1 表示解释能力越强。

通过这两个指标可以综合评估回归模型的好坏。


9. 结果可视化

# 可视化预测结果
plt.scatter(y_test, y_pred)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
plt.xlabel('实际值')
plt.ylabel('预测值')
plt.title('实际值与预测值对比')
plt.show()

  1. 绘制真实值(y_test)与预测值(y_pred)的散点图,直观反映模型的拟合程度。
  2. 使用“一条对角线”作为参考线(即 y = x),与散点分布进行对比,若预测点大多靠近对角线,表示模型性能较好。

可视化对比图便于发现模型系统性偏差或异常离群点,从而进一步改进模型或调参。

作者:码农耕地

物联沃分享整理
物联沃-IOTWORD物联网 » 【python】python基于辐照值与天气数据的线性回归预测与分析(源码+论文+数据集)【独一无二】

发表回复