【python】python基于辐照值与天气数据的线性回归预测与分析(源码+论文+数据集)【独一无二】
【python】python基于辐照值与天气数据的线性回归预测与分析(源码+论文+数据集)【独一无二】
一、设计要求
本项目旨在实现对光伏辐照数据与天气数据的综合分析与预测建模,其设计要求包括数据的读取、清洗、合并、特征工程、建模与可视化六大环节。首先,需要从Excel文件中准确读取辐照值数据与天气数据,并确保在跳过指定行数或读取指定工作表时不丢失关键字段。其次,应对重复值进行删除并使用前向填充方法补齐缺失数据,保证数据完整性及一致性。此外,将日期与时间合并为统一的Datetime列,使后续能按时间进行精确对齐。随后,使用描述性统计与可视化手段对数据进行初步探索,透视总体分布与变化趋势。在数据合并中需利用最近时间匹配策略以提升记录对齐的准确度,并删除不相关列减少噪声。对于风向与天气等分类特征,要求采用独热编码转化成模型可用的数值列,从而提高特征识别能力。最后需建立线性回归模型对直接辐照值进行预测,并输出均方误差和决定系数等关键指标,通过散点图对比真实值和预测值,评估模型的准确性与稳健性。
二、设计思路
1. 数据读取
- 使用
pandas
库的pd.read_excel()
方法,分别读取辐照值数据(“辐照值数据.xlsx”)和天气数据(“电站及天气数据.xlsx”)。 - 其中,辐照值数据在读取时跳过了前 7 行表头(
header=7
),而天气数据则指定了工作表名为“王伯水-天气”,并使用openpyxl
作为引擎。
# 数据读取
irradiance_data = pd.read_excel('辐照值数据.xlsx', header=7)
weather_data = pd.read_excel('电站及天气数据.xlsx',
xxxx,
engine='openpyxl')
- 从“辐照值数据.xlsx”的第 8 行开始读取数据(指定
header=7
)。 - 从“电站及天气数据.xlsx”的“王伯水-天气”工作表中读取数据,并指定使用
openpyxl
作为解析引擎,保证对 Excel 文件的正确解析。
2. 数据清洗
- 使用
drop_duplicates()
去除重复数据,保证每行记录只出现一次。 - 使用
fillna(method='ffill')
对缺失值进行前向填充,避免缺失值对后续分析的影响。
略。。。
3. 时间合并与数据格式处理
- 通过
pd.to_datetime()
方法,针对辐照值数据,将“日期”和“时间”合并为一个新的时间戳列Datetime
;对天气数据,将 “TIME” 列转换为时间戳Datetime
。 - 为了方便后续合并和分析,需要对两个数据集按照时间排序,并使用
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)
- 使用
drop_duplicates()
去重,保证每张表中没有重复条目; - 使用
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'])
- 对辐照值数据,将“日期”与“时间”两列字符串拼接之后使用
pd.to_datetime()
转为时间戳; - 对天气数据,将其“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()
- 通过
seaborn
中的lineplot()
绘制“直接辐照W/m2”与“散射辐照W/m2”随时间的曲线,直观查看辐照值在不同时刻的变化趋势; - 旋转时间刻度便于阅读,添加图例和标题提高可读性。
- 使用
matplotlib
及seaborn
进行可视化: - 通过
sns.lineplot()
分别绘制“直接辐照W/m2”与“散射辐照W/m2”随时间变化的趋势图。 - 设置中文显示和旋转横坐标刻度,以便更直观地观察辐照值随时间的分布情况。
可视化有助于快速查看数据整体趋势与异常值。
6. 数据预处理与特征工程
# 数据集成
merged_data = pd.merge_asof(
irradiance_data.sort_values('Datetime'),
# 代码略【至少10行】.....
# 代码略【至少10行】.....
direction='nearest'
)
- 使用
pd.merge_asof
按照时间顺序对两个数据集进行合并,其中direction='nearest'
表示在时间上匹配最近的记录; - 在数据合并之前,将各自的数据集按照 “Datetime” 排序,以确保
merge_asof
正确找出最近的时间行进行合并。
# 去除不必要的列
merged_data.drop(
# 代码略【至少10行】.....
inplace=True
)
# 将风向和天气进行 one-hot 编码
encoded_data = pd.get_dummies(merged_data, columns=['WIND_DIR', 'WEATHER'])
- 去除无关或冗余列(如日期、时间、TIME、电站编码、POWER_STATION_NAME 等),减少对后续模型训练的不利影响。
- 使用
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}")
- 将特征变量(
X
)与目标变量(y
)进行分离: - 目标变量:直接辐照值(
直接辐照W/m^2
) - 特征:去除时间戳和目标值后的所有数值与独热编码变量
- 使用
train_test_split()
方法,将数据集分为训练集和测试集,避免过拟合,并利用固定随机种子(random_state=42
)便于复现结果。 - 使用
LinearRegression()
建立线性回归模型,对训练集数据进行拟合(model.fit(X_train, y_train)
)。
模型训练完成后,就可以用此模型对新的或未知的同样结构的数据进行预测。
8. 模型评价
在测试集上进行预测(model.predict(X_test)
),通过以下指标衡量模型性能:
- 均方误差(
mean_squared_error
):衡量预测值与真实值间的误差平方的平均值。 - 决定系数 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()
- 绘制真实值(
y_test
)与预测值(y_pred
)的散点图,直观反映模型的拟合程度。 - 使用“一条对角线”作为参考线(即
y = x
),与散点分布进行对比,若预测点大多靠近对角线,表示模型性能较好。
可视化对比图便于发现模型系统性偏差或异常离群点,从而进一步改进模型或调参。
作者:码农耕地